সত্ত্বা-উপাদান উপাদানটিতে সত্তা 'প্রকারগুলি' সনাক্ত করা


10

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

void PlayerCollisionSystem::update(std::vector<Entity *> entities) {
  typedef std::vector<Entity *>::iterator EIter;
  for (EIter i = entities.begin(); i != entities.end(); ++i) {
    Entity *player = *i; // How do I verify that the entity is a player?

    // Get relevant components.
    PositionComponent *position = player->getComponent<PositionComponent>();
    VelocityComponent *velocity = player->getComponent<VelocityComponent>();
    SpriteComponent *sprite = player->getComponent<SpriteComponent>();

    // Detect and handle player collisions using the components.
  }
}

খেলোয়াড় এবং বল উভয়ই সংঘর্ষ পরিচালনার জন্য একই প্রাসঙ্গিক উপাদান ধরণের ভাগ করে নিলেও তাদের সিস্টেমের প্রয়োগগুলি ভিন্ন হবে ations

আমার কাছে সমস্ত গেম সত্ত্বার ধারক থাকলে, উত্তরাধিকার সূত্রে Entityবা সদস্য ভেরিয়েবল সহ আমি কীভাবে সুনির্দিষ্ট ধরণের সত্তা সনাক্ত করতে পারিstd::string type , যেমন কোনও সত্তা আর কেবল উপাদানগুলির সংগ্রহ নয়?

উত্তর:


21

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

আপনার কেবল "অবজেক্টটির উপাদান রয়েছে কি না" সেদিকে খেয়াল রাখতে হবে Xএবং আপনার সমস্যাটি হ'ল আপনি সঠিকভাবে চিহ্নিত করতে পারেননি X। যদি দুটি বস্তু পৃথকভাবে আচরণ করে তবে তাদের আলাদা আলাদা উপাদান দিন বা কেবল উপাদানটির উপর একটি বুলিয়ান পতাকা লাগান যদি এটি বিভিন্ন বস্তুর কনফিগারেশনের জন্য আলাদাভাবে আচরণ করে। আচরণ সম্পর্কে সিদ্ধান্ত নিতে উপাদানটি ব্যবহার করুন, সত্তাটি "প্রকার" নয়। এটি উপাদান ব্যবহারের পুরো পয়েন্ট।

কোনও PaddlePhysicsউপাদান / সিস্টেম এবং পৃথক BallPhysicsউপাদান / সিস্টেম যদি তারা আলাদাভাবে আচরণ করে তবে আপনার সম্পূর্ণ অনুমতি রয়েছে । অথবা আপনি উপাদানগুলিকে আরও দানাদার টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো টুকরো করে ফেলতে পারেন Bounceযে কোডটি ভাগ করে নেওয়ার পক্ষে যুক্তিযুক্ত আচরণের অংশটি যথেষ্ট জটিল হলে কেবলমাত্র একটি বল রয়েছে এমন একটি StopAtBoundaryউপাদান Ballএবং উভয়ই রয়েছে Paddlehave অথবা আপনি কেবল একটি PongPhysicsউপাদান তৈরি করতে পারেন যার জন্য এবং এর জন্য বুলিয়ান পতাকা Bouncesসেট রয়েছে । এমনকি আপনি একটি বেস উপাদান তৈরি করতে পারেন এবং তারপরে সেই উপাদানটি অর্জন করতে পারেন যা সেখানে প্রয়োজনীয় অতিরিক্ত আচরণ যুক্ত করে।trueBallfalsePaddleWallCollisionBallWallCollision


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

19

একটি সিস্টেম কেবল তখনই কার্যকর যদি এটি কার্যকর হয়। সত্তাটি "উপাদানগুলির সংগ্রহ" এমন কোনও ব্যবস্থা যদি কোনও সত্তা বেশিরভাগ "উপাদানগুলির সংগ্রহ" হয়ে থাকে এমন সিস্টেমের তুলনায় যদি কম কার্যকর হয় তবে তা করুন

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

আপনি ইতিমধ্যে এটি প্রাপ্য তুলনায় আরও সময় ব্যয় করেছেন।


খুব সুন্দর +1 "আপনি ইতিমধ্যে এটি সম্পর্কে প্রাপ্য তুলনায় এটি সম্পর্কে আরও বেশি সময় ব্যয় করেছেন"
ওয়েস্ট

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

দুর্দান্ত উত্তর। আমি নিজেকে মাঝে মাঝে নিজের সাথে এটি বলতে পাই। এগিয়ে যাওয়ার দিকে মনোনিবেশ করুন।
ডোমিনিক বউ-সামরা

5

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

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

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


0

একটি সত্তা উপাদান একটি সেট। আপনি কোনও এলোমেলো সেটে ঝরঝরে লেবেল বরাদ্দ করতে পারবেন না। প্রকারের প্রতিবন্ধকতাগুলি দেওয়া মহান নমনীয়তার জন্য মূল্য।

অবশ্যই আপনার বিশেষ (টাইপযুক্ত) সত্তা শ্রেণি থাকতে পারে যা উপাদানগুলির উপর বিধিনিষেধ আরোপ করে।

আদর্শভাবে উপাদানগুলি স্বাধীন। সুতরাং আপনার সমস্যার সমাধান হ'ল সংঘাতের জন্য প্রতিটি উপ-কম্পোনেন্টকে সামঞ্জস্য রেখে কল করা। বাস্তব অ্যাপ্লিকেশনগুলিতে আন্তঃনির্ভরতা এবং ক্রম সমস্যা রয়েছে। যদি তা হয় তবে সত্তা শ্রেণীর প্রতিটি পদ্ধতিতে আপনার কিছু 'প্রেরণকারী' যুক্তি প্রয়োজন।

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