সত্তা যোগাযোগ কীভাবে কাজ করে?


115

আমার দুটি ব্যবহারকারীর মামলা রয়েছে:

  1. কিভাবে entity_Aএকটি take-damageবার্তা পাঠাতে হবে entity_B?
  2. কীভাবে entity_Aজিজ্ঞাসা করবে entity_Bএইচপি?

আমি এ পর্যন্ত যা মুখোমুখি হয়েছি তা এখানে:

  • বার্তার সারি
    1. entity_Aএকটি take-damageবার্তা তৈরি করে এবং entity_Bএর বার্তার কাতারে পোস্ট করে ।
    2. entity_Aএকটি query-hpবার্তা তৈরি করে এবং এতে পোস্ট করে entity_Bentity_Bবিনিময়ে একটি response-hpবার্তা তৈরি করে এবং এতে পোস্ট করে entity_A
  • সাবস্ক্রাইব প্রকাশ
    1. entity_Btake-damageবার্তায় সাবস্ক্রাইব করে (সম্ভবত কিছু প্রিমিটিভ ফিল্টারিংয়ের সাথে কেবলমাত্র প্রাসঙ্গিক বার্তা সরবরাহ করা হয়)। উল্লেখ entity_Aকরে এমন take-damageবার্তা তৈরি করে entity_B
    2. entity_Aupdate-hpবার্তাগুলির সদস্যতা (সম্ভবত ফিল্টার করা)। প্রতিটি ফ্রেম বার্তা entity_Bসম্প্রচার update-hpকরে।
  • সংকেত / স্লট
    1. ???
    2. entity_Aএকটি সংযোগ স্থাপন update-hpকরার স্লট entity_Bএর update-hpসংকেত।

এর চেয়ে ভাল কিছু আছে কি? এই যোগাযোগের স্কিমগুলি কীভাবে একটি গেম ইঞ্জিনের সত্তা সিস্টেমে বাঁধা থাকবে সে সম্পর্কে আমার কী সঠিক ধারণা আছে?

উত্তর:


67

ভাল প্রশ্ন! আপনি জিজ্ঞাসা করা নির্দিষ্ট প্রশ্নগুলি পাওয়ার আগে, আমি বলব: সরলতার শক্তিটিকে হ্রাস করবেন না। টেনপান ঠিক আছে। মনে রাখবেন যে এই পদ্ধতির সাথে আপনি যা করার চেষ্টা করছেন তা হ'ল ফাংশন কলকে পিছিয়ে দেওয়ার জন্য বা কলিকে কলার থেকে ডিকুয়াল করার জন্য একটি দুর্দান্ত উপায় খুঁজে বের করুন। আমি এই সমস্যাগুলির কিছু লাঘব করার জন্য আশ্চর্যজনকভাবে স্বজ্ঞাত উপায় হিসাবে কর্টিনগুলিকে সুপারিশ করতে পারি, তবে এটি সামান্য অফ-টপিক। কখনও কখনও, আপনি কেবল ফাংশনটি কল করে এবং সত্তা এটিকে সরাসরি সত্তা বিতে সংযুক্ত করা হয় এই সত্যের সাথে জীবনযাপন করা ভাল Y

এটি বলেছিল, আমি সাধারণ বার্তা পাসের সাথে সংযুক্ত সিগন্যাল / স্লট মডেলটি ব্যবহার করেছি এবং খুশি হয়েছি। আমি এটিকে সি ++ এবং লুয়ায় মোটামুটি সফল আইফোন শিরোনামের জন্য ব্যবহার করেছি যার খুব কড়া সময়সূচি ছিল।

সিগন্যাল / স্লট মামলার জন্য, যদি আমি সত্তা বি এর কোনও কিছুর প্রতিক্রিয়াতে সত্তা এটিকে কিছু করতে চাই (যেমন, কোনও কিছু মারা যাওয়ার পরে একটি দরজা আনলক করুন) আমার সত্তা থাকতে পারে সত্তা বি এর মৃত্যুর ঘটনায় সরাসরি সাবস্ক্রাইব করতে। অথবা সম্ভবত সত্তা এ সত্ত্বার একটি গ্রুপের প্রতিটি সদস্যতার জন্য সাবস্ক্রাইব করবে, বহিস্কার হওয়া প্রতিটি ইভেন্টের একটি কাউন্টার বাড়িয়ে তুলবে এবং এর মধ্যে এন মারা যাওয়ার পরে দরজাটি আনলক করবে। এছাড়াও, "সত্তা গোষ্ঠী" এবং "তাদের মধ্যে এন" সাধারণত স্তরের ডেটাতে সংজ্ঞায়িত ডিজাইনার হবে। (সরু হিসাবে, এটি এমন একটি অঞ্চল যেখানে কর্টাইনগুলি সত্যই জ্বলতে পারে যেমন, ওয়েটফর্মমલ્ટিয়াল ("মরন", এনটিএ, এনটিবি, এনটিসি); দরজা। আনলক ();)

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

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

এছাড়াও, ব্যবহারের ক্ষেত্রে # 2 নিয়ে আমার অভিজ্ঞতা হ'ল আপনি অন্য দিকের ইভেন্ট হিসাবে এটি পরিচালনা করা ভাল। সত্তার স্বাস্থ্য কী তা জিজ্ঞাসা করার পরিবর্তে, কোনও ইভেন্টে গুলি চালান / যখনই স্বাস্থ্যের উল্লেখযোগ্য পরিবর্তন আসে তখন কোনও বার্তা প্রেরণ করুন।

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

দুঃখিত, আমি সেখানে ছুটে এসেছি। এটি আমার প্রথম উত্তর :) আমি আশা করি এটি কার্যকর হয়েছে।


উত্তরের জন্য ধন্যবাদ. দুর্দান্ত অন্তর্দৃষ্টি। আমি বার্তাটি পাস করার ডিজাইনটি শেষ করার কারণ হ'ল লুয়া। আমি নতুন সি ++ কোড ছাড়াই নতুন অস্ত্র তৈরি করতে সক্ষম হতে চাই। সুতরাং আপনার চিন্তা আমার কিছু অনাবৃত প্রশ্নের উত্তর দিয়েছে।
deft_code

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

সবশেষে, আইফোন গেমটি কী ছিল? আপনি যে সত্তা সিস্টেমটি ব্যবহার করেছিলেন সে সম্পর্কে আমি আরও তথ্য পেতে পারি?
deft_code

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

1
সুতরাং কলাআরফল: আপনি কি বলবেন এটি আপনার উত্তরের একটি সঠিক সংক্ষিপ্তসার: "আপনার পোস্ট করা সমস্ত সমাধানের অন্যদের মতোই তাদের ব্যবহার রয়েছে। একটি নিখুঁত সমাধানের দিকে তাকান না, কেবল যেখানে প্রয়োজন সেখানে ব্যবহার করুন যেখানে এটি বোঝায় makes । "
Ipsquiggle

76
// in entity_a's code:
entity_b->takeDamage();

আপনি জিজ্ঞাসা করেছিলেন কীভাবে কৌতূহলী গেমগুলি এটি করে। ;)


8
একটি ডাউন ভোট? সিরিয়াসলি, এটি সাধারণত এটি হয়ে যায়! সত্তা সিস্টেমগুলি দুর্দান্ত তবে তারা প্রাথমিক মাইলফলকগুলিতে আঘাত করতে সহায়তা করে না।
টেনপেন

আমি পেশাদারভাবে ফ্ল্যাশ গেমগুলি তৈরি করি এবং আমি এটি এটিই করি। আপনি শত্রু.ড্যামেজ (10) কল করুন এবং তারপরে আপনি পাবলিক গেটস থেকে আপনার প্রয়োজনীয় কোনও তথ্য সন্ধান করবেন।
আয়ান

7
এটি বাণিজ্যিক গেম ইঞ্জিনগুলি কীভাবে এটি করে তা গুরুতরভাবে। সে রসিকতা করছে না। টার্গেট.নোটাইফটেকড্যামেজ (ড্যামেজটাইপ, ড্যামেজএমাউন্ট, ড্যামেজডিলার ইত্যাদি) সাধারণত এটি হয় কীভাবে।
এএ গ্র্যাপাস 15

3
বাণিজ্যিক গেমগুলিও "ক্ষতি" ভুল বানান করে? :
রিকিট

15
হ্যাঁ, তারা অন্য জিনিসগুলির মধ্যেও ভুল বানান ক্ষতি করে। :)
শিখুন কোকোস

17

আরও গুরুতর উত্তর:

ব্ল্যাকবোর্ড দেখেছি প্রচুর ব্যবহার। সরল সংস্করণ হ'ল স্ট্রट्स ছাড়া আর কিছুই নয় যা সত্তার এইচপি-র মতো জিনিসের সাথে আপডেট হয়, যা সত্তাগুলি জিজ্ঞাসা করতে পারে।

আপনার ব্ল্যাকবোর্ডগুলি হয় এই সত্তা সম্পর্কে বিশ্বের দৃষ্টিভঙ্গি হতে পারে (বি এর ব্ল্যাকবোর্ডটি জিজ্ঞাসা করবে এর এইচপি কী) বা বিশ্বের সত্তার দৃষ্টিভঙ্গি (এ এর টার্গেটের এইচপি কী তা দেখার জন্য এটি তার ব্ল্যাকবোর্ডটিকে জিজ্ঞাসা করে)।

যদি আপনি কেবল ফ্রেমের কোনও সিঙ্ক পয়েন্টে ব্ল্যাকবোর্ডগুলি আপডেট করেন তবে আপনি পরে কোনও থ্রেডের পরে বিন্দুতে সেগুলি পড়তে পারেন, মাল্টিথ্রেডিং কার্যকর করার জন্য এটি বেশ সহজ করে তুলেছেন।

আরও উন্নত ব্ল্যাকবোর্ডগুলি হ্যাশ টেবিলের মতো, মানগুলিতে স্ট্রিং ম্যাপ করার মতো হতে পারে। এটি আরও রক্ষণাবেক্ষণযোগ্য তবে স্পষ্টতই একটি রান-টাইম ব্যয় রয়েছে।

একটি ব্ল্যাকবোর্ড traditionতিহ্যগতভাবে কেবল একমুখী যোগাযোগ - এটি ডিশিংটিকে ক্ষতির বাইরে নিয়ে আসবে না।


আমি এর আগে ব্ল্যাকবোর্ডের মডেলটি কখনও শুনিনি।
ডিফ্ট_কোড

নির্ভরতা হ্রাস করার জন্য এগুলিও ভাল, কোনও ইভেন্টের সারি বা প্রকাশনা / সাবস্ক্রাইব মডেল যেমন করে।
টেনপেন

2
এটি একটি "আদর্শ" ই / সি / এস সিস্টেম "কীভাবে কাজ করা উচিত তার প্রজ্ঞাগত" সংজ্ঞা "” উপাদানগুলি ব্ল্যাকবোর্ড তৈরি করে; সিস্টেমগুলি হ'ল কোড এটির উপর অভিনয় করে। (খালি long long intখাঁটি ইসিএস সিস্টেমে সত্তা অবশ্যই অবশ্যই একই বা একই রকম))
বিআরপোকক

6

আমি এই সমস্যাটি কিছুটা অধ্যয়ন করেছি এবং আমি একটি দুর্দান্ত সমাধান দেখেছি।

মূলত এটি সমস্ত সাবসিস্টেম সম্পর্কে। এটি টেনপেন দ্বারা উল্লিখিত ব্ল্যাকবোর্ড ধারণার অনুরূপ।

সত্তা উপাদানগুলি দিয়ে তৈরি, তবে সেগুলি কেবল সম্পত্তি ব্যাগ। সত্তাগুলিতে কোনও আচরণই প্রয়োগ করা হয় না।

ধরা যাক, সত্তাগুলির একটি স্বাস্থ্য উপাদান এবং ক্ষতির উপাদান রয়েছে।

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

HIT, source=entity_A target=entity_B power=5

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

DAMAGE, source=entity_A target=entity_B amount=7

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

যেমন একটি গেম ইঞ্জিনে, বার্তাগুলির ফর্ম্যাটটি সমস্ত উপাদান এবং সাবসিস্টেমগুলির মধ্যে একমাত্র মিলিত হয়। সাবসিস্টেম এবং সত্তা একে অপরের সম্পর্কে সম্পূর্ণ স্বাধীন এবং অজানা।

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


এটি গ্রহণযোগ্য উত্তর আইএমওর চেয়ে অনেক ভাল উত্তর। ঘোষিত, রক্ষণাবেক্ষণযোগ্য এবং প্রসারযোগ্য (এবং এর জোকের উত্তরের মতো মিলিত বিপর্যয়ও নয় entity_b->takeDamage();)
ড্যানি ইয়ারোস্লাভস্কি

4

বিশ্বব্যাপী বার্তার সারি কেন নেই, এরকম কিছু:

messageQueue.push_back(shared_ptr<Event>(new DamageEvent(entityB, 10, entityA)));

সঙ্গে:

DamageEvent(Entity* toDamage, uint amount, Entity* damageDealer);

এবং গেম লুপ / ​​ইভেন্ট হ্যান্ডলিং শেষে:

while(!messageQueue.empty())
{
    Event e = messageQueue.front();
    messageQueue.pop_front();
    e.Execute();
}

আমি মনে করি এটি কমান্ড প্যাটার্ন। এবং Execute()একটি খাঁটি ভার্চুয়াল Event, যা ডেরাইভেটিভস সংজ্ঞা দেয় এবং স্টাফ করে do তাই এখানে:

DamageEvent::Execute() 
{
    toDamage->takeDamage(amount); // Or of course, you could now have entityA get points, or a recognition of damage, or anything.
}

3

যদি আপনার গেমটি একক প্লেয়ার হয় তবে কেবলমাত্র লক্ষ্য বস্তু পদ্ধতিটি ব্যবহার করুন (যেমনটি দশম প্রস্তাবিত)।

আপনি যদি (বা সমর্থন করতে চান) মাল্টিপ্লেয়ার (হুবুহু হিসাবে বহুজাতিক), একটি কমান্ড সারি ব্যবহার করুন।

  • যখন ক্লায়েন্ট 1 এ বি এর ক্ষতি করে কেবল ক্ষতির ইভেন্টের সারি করুন।
  • নেটওয়ার্কের মাধ্যমে কমান্ড সারিগুলি সিঙ্ক্রোনাইজ করুন
  • উভয় পক্ষের সারিযুক্ত কমান্ডগুলি পরিচালনা করুন।

2
আপনি যদি প্রতারণা এড়ানোর বিষয়ে গুরুতর হন তবে এ ক্লায়েন্টকে মোটেই বি বিচলিত করে না। এ এর মালিকানাধীন ক্লায়েন্ট সার্ভারে একটি "আক্রমণ বি" কমান্ড প্রেরণ করে, যা টেনপেন যা বলেছিল ঠিক তেমন করে; সার্ভারটি তখন সমস্ত প্রাসঙ্গিক ক্লায়েন্টের সাথে সেই রাজ্য সিঙ্ক করে।

@ জো: হ্যাঁ, যদি এমন কোনও সার্ভার থাকে যা বিবেচনা করার জন্য একটি বৈধ পয়েন্ট, তবে কখনও কখনও ভারী সার্ভারের বোঝা এড়াতে ক্লায়েন্টকে (যেমন কনসোলে) বিশ্বাস করা ঠিক আছে।
অ্যান্ড্রিয়াস

2

আমি বলব: যতক্ষণ না আপনার স্পষ্টভাবে ক্ষতি থেকে তাত্ক্ষণিক সময়ের প্রতিক্রিয়া প্রয়োজন ততক্ষণ না ব্যবহার করুন।

ক্ষতি গ্রহণকারী সত্তা / উপাদান / যা কিছু ঘটনাকে স্থানীয় ইভেন্ট-কাতারে বা সমান স্তরের এমন একটি সিস্টেমে ধাক্কা দেবে যা ক্ষতির ঘটনাগুলি ধারণ করে।

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


1

শুধু কল করুন। ক্যোয়ারী-এইচপি দ্বারা অনুরোধ-এইচপি-কে অনুসরণ করবেন না - আপনি যদি সেই মডেলটি অনুসরণ করেন তবে আপনি আঘাতের জগতে থাকবেন।

আপনি মনো কন্টিনিয়েশনগুলিও একবার দেখতে চান। আমি মনে করি এটি এনপিসিগুলির জন্য আদর্শ হবে।


1

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

  1. একটি বার্তার মাধ্যমে তাত্ক্ষণিক প্রক্রিয়াজাতকরণ:

    • প্লেয়ার এ। আপডেট () প্লেয়ার বি-তে আঘাত করতে চায় দেখে প্লেয়ার বি ক্ষতির বিষয়টি জানিয়ে একটি বার্তা পেয়ে যায়।
    • প্লেয়ার বি। হ্যান্ডলমেসেজ () প্লেয়ার বি এর হিটপয়েন্টগুলি আপডেট করে (তিনি মারা যান)
    • প্লেয়ার বি। আপডেট () প্লেয়ার বি মারা গেছে দেখে .. সে খেলোয়াড়কে আক্রমণ করতে পারে না

এটি অন্যায্য, প্লেয়ার এ এবং বি একে অন্যকে আঘাত করা উচিত, খেলোয়াড় বি এটিকে আঘাত করার আগে মারা গিয়েছিল কারণ সেই সত্তা / গেমোবজেক্টটি পরে আপডেট হয়েছিল ()।

  1. বার্তাটি সারিবদ্ধ করছে

    • প্লেয়ার এ। আপডেট () প্লেয়ার বি-তে আঘাত করতে চায় দেখে প্লেয়ার বি ক্ষতির বিষয়টি জানিয়ে একটি বার্তা পেল এবং এটিকে একটি সারিতে রেখে দেয়
    • প্লেয়ার এ। আপডেট () এর সারিটি পরীক্ষা করে, এটি খালি
    • প্লেয়ার বি। আপডেট () প্রথমে পদক্ষেপগুলি পরীক্ষা করে যাতে প্লেয়ার বি ক্ষতিগ্রস্থ হওয়ার সাথে সাথে খেলোয়াড় এটিকে একটি বার্তা দেয়
    • প্লেয়ার বি। আপডেট () এছাড়াও সারিতে বার্তা পরিচালনা করে, প্লেয়ার এ এর ​​ক্ষতির প্রক্রিয়া করে
    • নতুন চক্র (২): প্লেয়ার এ একটি স্বাস্থ্যকর পানীয় পান করতে চায় যাতে প্লেয়ার এ। আপডেট () ডাকা হয় এবং পদক্ষেপটি প্রক্রিয়াজাত হয়
    • প্লেয়ার এ। আপডেট () বার্তা সারিটি পরীক্ষা করে এবং প্লেয়ার বি এর ক্ষতির প্রক্রিয়া করে

আবার এটি অন্যায়! .. খেলোয়াড় এ হিটপয়েন্টগুলি একই পালা / চক্র / টিক এ নেওয়ার কথা!


4
আপনি সত্যিই প্রশ্নের উত্তর দিচ্ছেন না তবে আমি মনে করি আপনার উত্তরটি একটি দুর্দান্ত প্রশ্ন করবে। কেন এগিয়ে গিয়ে জিজ্ঞাসা করবেন না যে এই জাতীয় "অন্যায়" অগ্রাধিকার কীভাবে সমাধান করা যায়?
bummzack

আমি সন্দেহ করি যে বেশিরভাগ গেমগুলি এই অন্যায়াকে গুরুত্ব দেয় কারণ তারা এত ঘন ঘন আপডেট হয় যে এটি খুব কমই সমস্যা। আপডেট করার সময় সত্তা তালিকার মাধ্যমে পূর্বে এবং পিছনের দিকে পুনরাবৃত্ত করার মধ্যে একটি সহজ কাজ রয়েছে।
কাইলোটন

আমি 2 টি কল ব্যবহার করি তাই আমি সমস্ত সত্তায় আপডেট () কল করি, তারপরে লুপের পরে আমি আবার পুনরাবৃত্তি করি এবং এর মতো কিছু কল করি pEntity->Flush( pMessages );। যখন সত্তা_এ একটি নতুন ইভেন্ট উত্পন্ন করে, তখন সেই ফ্রেমে অ্যান্টি_বি দ্বারা এটি পড়ে না (এটি দমন করারও সুযোগ রয়েছে) তখন উভয়ই ক্ষতিগ্রস্থ হয় এবং এর পরে তারা ঘা নিরাময়ের বার্তাটি প্রক্রিয়া করে যা সারিতে সর্বশেষ হবে । প্লেয়ার বি এখনও যাইহোক মারা যায় কারণ পশন বার্তাটি সারিতে থাকা শেষ: পি তবে এটি অন্য ধরণের বার্তাগুলির জন্য যেমন কার্যকর হতে পারে যেমন মৃত সত্তাগুলির কাছে পয়েন্টার সাফ করে।
পাবলো আরিয়েল

আমি ফ্রেম স্তরে মনে করি, বেশিরভাগ গেম বাস্তবায়ন কেবল অন্যায়। কাইলোটান যেমন বলেছেন।
v.oddou

এই সমস্যাটি সমাধান করা অত্যন্ত সহজ। কেবল ম্যাসেজ হ্যান্ডলারগুলিতে বা যাই হোক না কেন একে অপরের ক্ষতি ব্যবহার করুন। বার্তা হ্যান্ডলারের ভিতরে আপনার অবশ্যই খেলোয়াড়টিকে মৃত হিসাবে চিহ্নিত করা উচিত নয়। "আপডেট ()" এ আপনি কেবল "" যদি (এইচপি <= 0) মারা যায় (); (উদাহরণস্বরূপ "আপডেট ()" এর শুরুতে)। উভয় একই সময়ে একে অপরকে হত্যা করতে পারে। এছাড়াও: প্রায়শই আপনি সরাসরি খেলোয়াড়কে ক্ষতিগ্রস্থ করেন না তবে বুলেটের মতো কিছু মধ্যবর্তী বস্তুর মাধ্যমে।
তারা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.