"গেম অবজেক্ট" - এবং উপাদান-ভিত্তিক নকশা


25

আমি গত ৩-৪ বছর ধরে কিছু শখের প্রকল্পে কাজ করছি। কেবল সহজ 2 ডি এবং 3 ডি গেমস। তবে ইদানীং আমি একটি বড় প্রকল্প শুরু করেছি। গত কয়েক মাস ধরে আমি একটি গেম অবজেক্ট ক্লাস ডিজাইনের চেষ্টা করছি যা আমার সমস্ত গেমের অবজেক্টের ভিত্তি হতে পারে। তাই অনেক চেষ্টা ও ডাই টেস্টিংয়ের পরে আমি গুগলে ফিরেছি যা দ্রুত আমাকে কিছু জিডিসি পিডিএফ এবং পাওয়ারপয়েন্টগুলিতে দেখায়। এবং এখন আমি উপাদান-ভিত্তিক গেম অবজেক্টগুলির উপলব্ধি পাওয়ার চেষ্টা করছি।

আমি বুঝতে পারি যে ইঞ্জিন একটি গেম অবজেক্ট তৈরি করে এবং তারপরে বিভিন্ন উপাদান সংযুক্ত করে যা স্বাস্থ্য, পদার্থবিজ্ঞান, নেটওয়ার্কিং এবং আপনি যা কিছু করেন তা যেমন পরিচালনা করে। তবে আমি যা বুঝতে পারছি না তা হল X উপাদান কীভাবে জানতে পারে যদি Y এর বস্তুর স্থিতি পরিবর্তন করে। প্লেয়ার বেঁচে থাকলে ফিজিক্স কম্পোনেন্ট কীভাবে জানতে পারে, কারণ স্বাস্থ্য হেলথ কম্পোনেন্ট দ্বারা নিয়ন্ত্রিত হয় ..? এবং হেলথ কম্পোনেন্টটি কীভাবে "প্লেয়ার-মৃত-অ্যানিমেশন" খেলবে?

আমি এই ধারণাটির মধ্যে ছিলাম যে এটি এমন কিছু ছিল (হেলথ কম্পোনেন্টে):

if(Health < 0) {
   AnimationComponent.PlayAnimation("played-died-animation")
}

কিন্তু তারপরে আবারও, স্বাস্থ্য সংস্থার কীভাবে জানতে পারে যে এটির সাথে কোনও অ্যানিমেশনকোম্পোনটি সংযুক্ত করা গেমের অবজেক্টটি যুক্ত? এখানে আমি দেখতে পাচ্ছি একমাত্র সমাধান

  1. কোনও অ্যানিমেশনকোম্পোনটি সংযুক্ত আছে কিনা তা পরীক্ষা করে দেখুন (হয় উপাদান কোডের মধ্যে বা ইঞ্জিনের পাশে)

  2. উপাদানগুলির অন্যান্য উপাদানগুলির প্রয়োজন আছে, তবে এটি পুরো উপাদান-নকশার সাথে লড়াই করে বলে মনে হচ্ছে।

  3. হেলথওয়াইথ অ্যানিমেশনকোম্পোনেন্ট, হেলথনো অ্যানিমেশনকোম্পোনেন্ট এবং এগুলি লিখুন যা আবার পুরো উপাদান-নকশা ধারণার সাথে লড়াই করে বলে মনে হচ্ছে।


1
প্রশ্ন ভালোবাসি। আমি একই মাস আগে জিজ্ঞাসা করা উচিত ছিল, কিন্তু এটি কাছাকাছি না। একটি অতিরিক্ত সমস্যার মুখোমুখি হলাম যখন কোনও গেম অবজেক্টে একই উপাদানটির একাধিক উদাহরণ থাকে (উদাহরণস্বরূপ একাধিক অ্যানিমেশন)। উত্তরগুলি যদি এতে স্পর্শ করতে পারে তবে দুর্দান্ত হবে। আমি গেম অবজেক্টের সমস্ত উপাদানগুলির মধ্যে ভাগ করে ভেরিয়েবলগুলি সহ বিজ্ঞপ্তিগুলির জন্য বার্তা ব্যবহার করে শেষ করেছি (যাতে তাদের একটি ভেরিয়েবলের মান পেতে কোনও বার্তা প্রেরণের দরকার হয় না)।
এডিবি

1
গেমের ধরণের উপর নির্ভর করে আপনার কাছে সম্ভবত গেমের সামগ্রী রয়েছে যাগুলির স্বাস্থ্য উপাদান রয়েছে এবং অ্যানিমেশন উপাদান নেই। এবং এই সমস্ত গেমোবজেক্টগুলি সম্ভবত ইউনিটের মতো কোনও কিছুর উপস্থাপনা। সুতরাং আপনি স্বাস্থ্য উপাদানটি ছুঁড়ে ফেলতে পারেন এবং ইউনিট কম্পোনেন্ট তৈরি করতে পারেন যা ক্ষেত্রের স্বাস্থ্য থাকবে এবং ইউনিটটির প্রয়োজনীয় সমস্ত উপাদান সম্পর্কে তিনি জানতেন। উপাদানগুলির এই গ্রানুলারিটি সত্যিকার অর্থে কোনও কিছুই সহায়তা করে না - প্রতি ডোমেনের একটি উপাদান (রেন্ডারিং, অডিও, পদার্থবিজ্ঞান, গেম-লজিক) পাওয়া আরও বাস্তবসম্মত।
কিকাইমারু

উত্তর:


11

আপনার সমস্ত উদাহরণে একটি ভয়ঙ্কর সমস্যা রয়েছে। স্বাস্থ্য উপাদানটি প্রতিটি উপাদান উপাদান সম্পর্কে জেনে রাখা প্রয়োজন যা সত্তা মরতে সাড়া জাগাতে পারে। অতএব, আপনার কোনও পরিস্থিতিতেই উপযুক্ত নয়। আপনার সত্তার একটি স্বাস্থ্য উপাদান রয়েছে। এটিতে একটি অ্যানিমেশন উপাদান রয়েছে। অন্যের উপর নির্ভর করে না বা জানে না। তারা একটি মেসেজিং সিস্টেমের মাধ্যমে যোগাযোগ করে।

যখন স্বাস্থ্যকর উপাদান সনাক্ত করে যে সত্তাটি 'মারা গেছে', তখন এটি একটি 'আমি মারা গেলাম' বার্তা প্রেরণ করে। উপযুক্ত অ্যানিমেশনটি বাজিয়ে এই বার্তাটির প্রতিক্রিয়া জানানো অ্যানিমেশন উপাদানটির দায়িত্ব।

স্বাস্থ্য উপাদান সরাসরি অ্যানিমেশন উপাদানটিতে বার্তা প্রেরণ করে না। হতে পারে এটি এটিকে সেই সত্তার প্রতিটি উপাদান, পুরো সিস্টেমটিতে প্রচার করে; হতে পারে অ্যানিমেশন উপাদানটিকে মেসেজিং সিস্টেমটি জানাতে হবে যে এটি 'আমি মারা গিয়েছি' বার্তাগুলিতে আগ্রহী। মেসেজিং সিস্টেমটি কার্যকর করার অনেক উপায় রয়েছে। তবে আপনি এটি প্রয়োগ করেন, মূল বিষয়টি হ'ল স্বাস্থ্য উপাদান এবং অ্যানিমেশন উপাদানটি অন্যটি উপস্থিত রয়েছে কিনা তা কখনই জানতে বা যত্নের প্রয়োজন হবে না এবং নতুন উপাদান যুক্ত করার জন্য তাদের যথাযথ বার্তা প্রেরণের জন্য কোনও বিদ্যমান সংশোধন করার প্রয়োজন হবে না।


ওকে, এটা বোঝা যায়। কিন্তু কে "রাজ্য" যেমন 'মৃত', বা 'পোর্টাল-ই-ব্রেকড' ইত্যাদি ইত্যাদি ঘোষণা করে? উপাদান বা ইঞ্জিন? কারণ এমন একটি জিনিসে একটি রাজ্য 'মৃত' যুক্ত করা যা স্বাস্থ্য সংস্থাকে কখনও সংযুক্ত করে রাখে না তা আমার কাছে দারুণ আপত্তিজনক বলে মনে হয়। আমি অনুমান করি যে আমি কেবল ডুব দিয়েছি এবং কিছু কোড পরীক্ষা করতে শুরু করব এবং দেখুন কী কাজ করে।
হাইয়ার

মাইকেল এবং প্যাট্রিক হিউজেসের উপরের সঠিক উত্তর রয়েছে। উপাদানগুলি কেবলমাত্র ডেটা; সুতরাং সত্তাটি মারা যাওয়ার পরে এবং বার্তাটি প্রেরণ করার সময় এটি স্বাস্থ্যের উপাদানটি সনাক্ত করে না এটি গেম-নির্দিষ্ট যুক্তির কিছু উচ্চ স্তরের অংশ। কীভাবে বিমূর্ততা আপনার উপর নির্ভর করে। মৃত্যুর প্রকৃত অবস্থা কখনই কোথাও সংরক্ষণের প্রয়োজন হয় না। যদি স্বাস্থ্যটি 0 0 হয় তবে অবজেক্টটি মারা গেছে এবং স্বাস্থ্য উপাদানটি কোনও 'আচরণ নয়' ভঙ্গ করে bit বিট ডেটা-চেকিং লজিককে আবদ্ধ করতে পারে! সীমাবদ্ধতা যদি আপনি কেবল সেই বিষয়গুলিকে বিবেচনা করেন যা উপাদান হিসাবে অবস্থা হিসাবে পরিবর্তন করে।
ব্লেকি

শুধু কৌতূহল, আপনি কীভাবে একটি মুভমেন্টকম্পোনেন্টটি পরিচালনা করবেন? এটি যখন ইনপুট সনাক্ত করে, তখন এটি পজিশন কম্পোনেন্টে বেগ বাড়াতে হবে। বার্তাটি কেমন হবে?
48

8

আর্টেমিস যেভাবে সমস্যার সমাধান করে তা হল উপাদানগুলির মধ্যে প্রক্রিয়াজাতকরণ না করা। উপাদানগুলিতে কেবল তাদের প্রয়োজনীয় ডেটা থাকে। সিস্টেমগুলি একাধিক উপাদান প্রকারগুলি পড়ে এবং যা প্রক্রিয়াকরণ করা প্রয়োজন তা করে।

সুতরাং, আপনার ক্ষেত্রে, আপনার কাছে একটি রেন্ডারসিস্টেম থাকতে পারে যা হেলথ কম্পোনেন্টে (এবং অন্যদের) পড়ে এবং যথাযথ অ্যানিমেশনগুলিতে সারি তৈরি করে। ফাংশন থেকে এইভাবে ডেটা পৃথক করা নির্ভরতা সঠিকভাবে পরিচালিত করা সহজ করে তোলে।


সমস্যাটি হ্যান্ডেল করার জন্য এটি দুর্দান্ত উপায় হিসাবে শেষ হয়: সিস্টেমগুলি বৈশিষ্ট্যগুলি উপস্থাপন করে যখন সিস্টেমগুলি পৃথক পৃথক বৈশিষ্ট্যগুলি বেঁধে দেয় এবং সেগুলি কাজ করতে ব্যবহার করে। এটি traditionalতিহ্যবাহী ওওপি চিন্তাভাবনা থেকে একটি বিশাল পরিবর্তন এবং কিছু লোকের মাথাতে আঘাত দেয় =)
প্যাট্রিক হিউজেস

ওকি, এখন আমি সত্যিই হারিয়েছি .. "বিপরীতে, একটি ES এর মধ্যে যদি আপনার যুদ্ধের ময়দানে 100 ইউনিট থাকে, যার প্রত্যেকটি একটি সত্তা দ্বারা প্রতিনিধিত্ব করা হয়, তবে আপনার কাছে প্রতিটি পদ্ধতির শূন্য অনুলিপি রয়েছে যা একটি ইউনিটে আবেদন করা যেতে পারে - কারণ সত্তাগুলি কোনও পদ্ধতি ধারণ করে না এবং উপাদানগুলিতেও পদ্ধতি থাকে না তার পরিবর্তে, আপনার প্রতিটি দিকের জন্য একটি বাহ্যিক ব্যবস্থা রয়েছে এবং সেই বাহ্যিক সিস্টেমে এমন সমস্ত পদ্ধতি রয়েছে যা কোনও সংস্থার সাথে অনুরোধ করা যেতে পারে যা এই উপাদানটির সাথে সামঞ্জস্যপূর্ণ বলে চিহ্নিত করে this পদ্ধতি." ভাল, একটি গান কম্পোনেন্টে ডেটা কোথায় সংরক্ষণ করা হয়? রাউন্ড ইত্যাদির মতো, যদি সমস্ত সত্তা একই উপাদান ভাগ করে।
হাইয়ার

1
যতদূর আমি এটি বুঝতে পারি যে সমস্ত সত্তা একই উপাদান ভাগ করে না, প্রতিটি সত্তায় তাদের সাথে N উপাদানগুলির উদাহরণ থাকতে পারে। এরপরে একটি সিস্টেম তার সমস্ত সংস্থার তালিকার জন্য গেমটিকে জিজ্ঞাসা করে যেগুলি তাদের সাথে সংযুক্ত থাকার বিষয়ে যত্নশীল এবং তারপরে যা কিছু প্রক্রিয়াজাত করে
জ্যাক উডস

এটি কেবল সমস্যাটিকে চারপাশে নিয়ে যায়। কোন সিস্টেম কীভাবে কোন উপাদানগুলি ব্যবহার করতে পারে তা জানে? কোনও সিস্টেমে অন্যান্য সিস্টেমেও প্রয়োজন হতে পারে (স্টেটম্যাচাইন সিস্টেম উদাহরণস্বরূপ অ্যানিমেশনটির জন্য কল করতে পারে)। যাইহোক, এটি ডাব্লুএইচওর ডেটা মালিকানার সমস্যা সমাধান করে। আসলে, একটি সহজ বাস্তবায়ন হ'ল গেম অবজেক্টে একটি অভিধান থাকতে পারে এবং প্রতিটি সিস্টেম সেখানে তার ভেরিয়েবল তৈরি করে।
এডিবি

এটি সমস্যাটিকে প্রায় কাছাকাছি স্থানে নিয়ে যায় তবে এমন জায়গায় নিয়ে যায় যা আরও বেশি টেকনেবল। সিস্টেমগুলিতে তাদের প্রাসঙ্গিক উপাদানগুলি শক্ত ওয়্যার্ড থাকে। সিস্টেমগুলি কম্পোনেন্টগুলির মাধ্যমে একে অপরের সাথে যোগাযোগ করতে পারে (স্টেটম্যাচিন অ্যানিমেশন যা করতে হবে তা জানতে কোনও উপাদান মান নির্ধারণ করতে পারে (বা এটি কোনও ইভেন্টে আগুন দিতে পারে)। অভিধানের পদ্ধতিটি প্রোপার্টি প্যাটার্নের মতো লাগে যা কাজ করতে পারে about যে সমস্ত উপাদান সংশ্লিষ্ট বৈশিষ্ট্য একসঙ্গে দলবদ্ধ করা এবং তারা স্ট্যাটিক্যালি চেক করা যায় কোন উদ্ভট ত্রুটি কারণ আপনার "যোগ হওয়া Dammage" এক জায়গায় কিন্তু এটি পুনরুদ্ধার করতে চেষ্টা অন্য মধ্যে "ড্যামেজ"
মাইকেল

6

আপনার কোডে আপনি উপায়গুলি করতে পারেন (আমি সেগুলি ব্যবহার করেছি, সম্ভবত কিছু অন্যান্য উপায় রয়েছে) অবজেক্টের অবস্থার পরিবর্তন হয়েছে কিনা তা জানতে:

  1. বার্তা পাঠান.
  2. উপাদান থেকে সরাসরি ডেটা পড়ুন।

1) একটি অ্যানিমেশনকোম্পোনটি সংযুক্ত আছে কিনা তা পরীক্ষা করে দেখুন (হয় উপাদান কোডের মধ্যে বা ইঞ্জিনের পাশে)

এটির জন্য আমি ব্যবহার করেছি, ১. গেমওজেক্টের কম্পোনেন্ট ফাংশন, বা ২. আপনি যখন উপাদান সংযুক্ত করেন আপনি কোনও নির্মাণমূলক ফাংশনে নির্ভরতা পরীক্ষা করতে পারেন, বা ৩. যদি আমি নিশ্চিতভাবে জানতে পারি যে সেই অবজেক্টটির এই উপাদানটি রয়েছে তবে আমি কেবল এটি ব্যবহার করি।

2) উপাদানগুলির অন্যান্য উপাদানগুলির প্রয়োজন আছে, তবে এটি সম্পূর্ণ উপাদান-নকশার সাথে লড়াই করে বলে মনে হচ্ছে।

কিছু নিবন্ধগুলিতে আমি পড়েছি, যে আদর্শ সিস্টেমের উপাদানগুলি একে অপরের উপর নির্ভর করে না, তবে বাস্তব জীবনে তা হয় না।

৩) হেলথওয়াইথ অ্যানিমেশনকোম্পোনেন্ট, হেলথনো অ্যানিমেশনকোম্পোনেন্ট এবং এর মতো লিখুন যা আবার পুরো উপাদান-নকশা ধারণার সাথে লড়াই করে বলে মনে হচ্ছে।

এই জাতীয় উপাদানগুলি লিখতে এটি একটি খারাপ ধারণা। আমার অ্যাপ্লিকেশনটিতে আমি স্বাস্থ্য উপাদান সবচেয়ে স্বতন্ত্র তৈরি করেছি। এখন আমি এমন কিছু পর্যবেক্ষক প্যাটার্ন সম্পর্কে ভাবছি যা গ্রাহকদের কিছু নির্দিষ্ট ইভেন্টের (যেমন "হিট", "নিরাময়" ইত্যাদি) সম্পর্কে অবহিত করে। সুতরাং অ্যানিমেশনকম্পোনমেন্টটি কখন অ্যানিমেশন খেলতে হবে তা নিজেই সিদ্ধান্ত নিতে হবে।

তবে আমি যখন সিবিইএস সম্পর্কে নিবন্ধটি পড়েছি তা আমাকে প্রভাবিত করেছিল, তাই আমি যখন সিবিইএস ব্যবহার করি এবং এর নতুন সম্ভাবনাগুলি আবিষ্কার করি তখন আমি এখন খুব খুশি।


1
ভাল, google.no/… @ স্লাইড 16
হাইয়ার

@ বোবেনকো, দয়া করে সিবিইএস সম্পর্কে নিবন্ধের একটি লিঙ্ক দিন। আমি এতে খুব আকর্ষণীয়;)
এডওয়ার্ড 83

1
এবং lambdor.net/?p=171 @ নীচে, এই ধরণের আমার প্রশ্নের সংক্ষিপ্তসারটি কীভাবে আপেক্ষিক জটিল, অ-প্রাথমিক উপাদানগুলির ক্ষেত্রে বিভিন্ন কার্যকারিতা সংজ্ঞায়িত করা যায়? সর্বাধিক প্রাথমিক উপাদানগুলি কী কী? কোন উপায়ে প্রাথমিক উপাদানগুলি খাঁটি ফাংশন থেকে আলাদা? কীভাবে বিদ্যমান উপাদানগুলি নতুন উপাদানগুলির নতুন বার্তাগুলির সাথে স্বয়ংক্রিয়ভাবে যোগাযোগ করতে পারে? কোনও উপাদান যা জানে না এমন বার্তাটি উপেক্ষা করার কী আছে? ইনপুট-প্রক্রিয়া-আউটপুট মডেল কি ঘটেছে?
হাইয়ার

1
এখানে CBES ভাল উত্তর stackoverflow.com/a/3495647/903195 প্রবন্ধ আমি গবেষণা করেছি অধিকাংশ এই উত্তর থেকে হয়। আমি কাওবাইপ্রোগ্র্যামিং.com/2007/01/05/evolve- আপনার- ধীরে ধীরে শুরু করেছি এবং অনুপ্রেরণা দিয়েছিলাম রত্ন 5 এ (যেমন আমার মনে আছে) উদাহরণ সহ একটি ভাল নিবন্ধ ছিল।
ইয়ভেন

তবে আর একটি ধারণা কার্যকরী-প্রতিক্রিয়াশীল প্রোগ্রামিং সম্পর্কে কী, আমার জন্য এই প্রশ্নটি এখনও উন্মুক্ত, তবে এটি আপনার জন্য গবেষণার জন্য একটি ভাল দিক।
ইয়েভেন

3

এটি মাইকেল, প্যাট্রিক হিউজেস এবং ব্লেকির মতো বলে। সমস্যাটিকে কেবল চারদিকে সরানো এড়ানোর সমাধান হ'ল আদর্শকে ছেড়ে দেওয়া, যা সমস্যার প্রথম দিকে ঘটায়।

এটি কম OOD এবং আরও বেশি ফাংশনাল প্রোগ্রামিংয়ের মতো। আমি যখন কম্পোনেন্ট-ভিত্তিক ডিজাইন নিয়ে পরীক্ষা শুরু করেছি, তখন আমি এই সমস্যাটি রাস্তায় ফেলেছি। আমি আরও কিছু গুগল করেছিলাম এবং আমি "ফান্টিটিভ রিঅ্যাকটিভ প্রোগ্রামিং" সমাধান হিসাবে পেয়েছি।

এখন আমার উপাদানগুলি ভেরিয়েবল এবং ফিল্ডগুলির সংগ্রহ ছাড়া কিছুই নয় যা এর বর্তমান অবস্থা বর্ণনা করে। তারপরে আমার কাছে "সিস্টেম" ক্লাস রয়েছে যা তাদের সাথে প্রাসঙ্গিক সমস্ত উপাদান আপডেট করে। প্রতিক্রিয়াশীল অংশটি একটি ভাল সংজ্ঞায়িত ক্রমে সিস্টেমগুলি পরিচালনা করে অর্জিত হয়। এটি নিশ্চিত করে যে সিস্টেমটি এর প্রসেসিং এবং আপডেট করার জন্য পরবর্তী যেকোন কিছু ব্যবস্থা রয়েছে এবং যে উপাদান এবং সত্তা এটি পড়তে এবং আপডেট করতে চায় তা সর্বদা আপ-টু-ডেট ডেটে কাজ করে।

যাইহোক, এক উপায়ে আপনি এখনও দাবি করতে পারেন যে সমস্যাটি আবারও সরে গেছে though কারণ যদি এটির চেয়ে সহজ না হয় তবে কোনটি আদেশ দেয় যে আপনার সিস্টেমগুলি চালু হওয়ার দরকার আছে? যদি অন্যথায় এবং স্যুইচ স্টেটমেন্টগুলির কোনও জগাখিচুড়ি লক্ষ্য করে দেখার আগে চক্রীয় সম্পর্ক এবং এটি সময়ের ব্যাপার মাত্র তখন কী হয়? এটি মেসেজিংয়ের একটি অন্তর্নিহিত রূপ, না? প্রথম নজরে, আমি এটি একটি ছোট ঝুঁকি মনে করি। সাধারণত, জিনিসগুলি ক্রমে প্রক্রিয়াজাত হয়। এর মতো কিছু: প্লেয়ার ইনপুট -> সত্তার অবস্থান -> সংঘাত সনাক্তকরণ -> গেম যুক্তি -> উপস্থাপনা -> শুরু Start সেক্ষেত্রে আপনার প্রত্যেকটির জন্য একটি করে সিস্টেম থাকবে, প্রতিটি সিস্টেমকে একটি আপডেট () পদ্ধতি সরবরাহ করুন এবং তারপরে সেগুলি আপনার গেমলুপে ক্রমানুসারে চালান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.