ইন-গেম ইভেন্টগুলি পরিচালনা করার সেরা উপায়?


13

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

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

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

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

কেবল স্পষ্ট করে বলতে গেলে, আমি এটি করার জন্য সেরা প্রোগ্রামিং ভাষা বা স্ক্রিপ্টিং ভাষার সন্ধান করছি না, তবে এটি পরিচালনা করার জন্য সেরা পদ্ধতিতে আরও।

ধন্যবাদ!


সম্পাদনা: যেহেতু আমার প্রশ্নটি বোঝা বেশ কঠিন ছিল তার দ্বিতীয় উদাহরণ:

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


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

1
@ মাইক আপনি যদি এটি উত্তর আইডিতে রাখেন তবে এটি +1 করুন .. সাধারণ এবং সমাধানটি যে কোনও দিনের চেয়ে ভাল।
জেমস 21

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

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

আপনি কি চান? আপনি ক্রিয়াগুলি বিরতি দিতে এবং অতিরিক্ত করতে চান, তারপরে ক্রিয়াগুলি বিরতি দিন?
ব্যবহারকারী 712092

উত্তর:


7

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

সামগ্রিকভাবে যদিও এটি আপনার টিউটোরিয়ালটির জটিলতার উপর নির্ভর করে যদি এটি এই সম্পর্কে চিন্তিত হয়। আপনার কোড এবং / বা স্তরের ইভেন্টগুলিকে হার্ড-কোডিং করা আমার কাছে মোটামুটি টিউটোরিয়াল পপআপের জন্য বড় ব্যাপার বলে মনে হয় না। আপনার মনের মধ্যে যা ঠিক আছে তা আমি কৌতূহল বোধ করছি যা আপনাকে মনে করে এটি অদক্ষ হয়ে উঠবে, যেহেতু আপনার প্রত্যেকটি ট্রিগার করা উচিত ছিল কেবল টিউটোরিয়াল মডিউলটিতে একটি বার্তা প্রেরণ করা, টিউটোরিয়ালমডিউল.শো ("1 ম_কিল") এর মতো কিছু;


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

কখনও পর্যবেক্ষক প্যাটার্নের মতো কিছু ভাবেন নি, দুর্দান্ত সমাধান বলে মনে হচ্ছে। I'll এটা, ধন্যবাদ :) ব্যবহার করে দেখুন
omgnoseat

7

আমি তাদের বোঝার সাথে সাথে এখানে ডিজাইনের সীমাবদ্ধতা রয়েছে:

  1. মূল গেমপ্লে কোডটি স্তরের প্রয়োজনীয়তাগুলির বিষয়ে চিন্তা করে না এবং তাদের সাথে ডিল কোডের সাথে মিলিত হওয়া উচিত নয়।

  2. একই সময়ে, এটি মূল গেমপ্লে কোডটিই জানে যে নির্দিষ্ট প্রয়োজনীয় ইভেন্টগুলি কখন পূরণ হয় (কোনও আইটেম পাওয়া, শত্রুকে হত্যা করা ইত্যাদি) when

  3. বিভিন্ন স্তরের প্রয়োজনীয়তার বিভিন্ন সেট রয়েছে এবং সেগুলি কোথাও বর্ণনা করা দরকার।

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

মূল গেমপ্লে কোডটি বর্তমান স্তরের অবজেক্টের জন্য একটি রেফারেন্স দিন। যখন গেমপ্লের বিশেষ ঘটনা ঘটলে তা, এটা উপর পদ্ধতি কল করে স্তর বলতে হবে: enemyKilled, itemPickedUp, ইত্যাদি

অভ্যন্তরীণভাবে Levelকয়েকটি জিনিস প্রয়োজন:

  • কোন ইভেন্টগুলি ইতিমধ্যে ঘটেছে তা ট্র্যাক করুন State এইভাবে এটি অন্যের কাছ থেকে নিহত প্রথম শত্রুকে আলাদা করতে পারে এবং প্রথমবার আপনি কোনও প্রদত্ত আইটেমটি তুলেছেন তা জানে।
  • LevelRequirementঅবজেক্টগুলির একটি তালিকা যা আপনার সেই স্তরের জন্য প্রয়োজনীয় লক্ষ্যগুলির নির্দিষ্ট সেটকে বর্ণনা করে।

আপনি যখন কোনও স্তরে প্রবেশ করেন, আপনি Levelডান LevelRequirementগুলি দিয়ে একটি তৈরি করবেন, গেমপ্লে কোড সেট আপ করুন এবং এটিকে স্তর দিন।

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

LevelRequirement মূলত দুটি জিনিস প্রয়োজন:

  1. প্রয়োজনীয়তা পূরণ হয়েছে কিনা তা জানার জন্য একটি পরীক্ষার বিবরণ । আপনার ভাষা যদি এটি সহজ করে তোলে তবে এটি কেবল একটি ফাংশন হতে পারে, অন্যথায় আপনি এটি ডেটাতে মডেল করতে পারেন। ( RequirementTypeঅর্থাত্‍ স্টাফ সহ একটি এনাম থাকে FIRST_KILLএবং তারপরে একটি বড় switchকীভাবে প্রতিটি ধরণের চেক করতে হয় তা জানে)
  2. প্রয়োজনীয়তা পূরণের সময় সম্পাদন করার জন্য একটি ক্রিয়া।

সেই প্রয়োজনীয়তার সেটগুলি কোথায় বর্ণিত হয়েছে তা নিয়ে এখনও প্রশ্ন রয়েছে। আপনি এক্সএমএল বা অন্য কোনও পাঠ্য ফাইল ফর্ম্যাটের মতো কিছু করতে পারেন। এটি দরকারী যদি:

  1. নন-প্রোগ্রামারগুলি রাইটিং লেভেল হবে।
  2. আপনি পুনরায় সংশোধন এবং / অথবা পুনরায় আরম্ভ না করে প্রয়োজনীয়তা পরিবর্তন করতে সক্ষম হতে চান।

যদি এগুলির কোনওটি না হয় তবে আমি সম্ভবত তাদের সরাসরি কোডে তৈরি করতাম। সহজ সর্বদা ভাল।


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

5

আমি ভেবেছিলাম কীভাবে আপনাকে এই ইভেন্টগুলি তৈরি করতে হয় এবং বাকি পোস্টগুলি সম্পর্কে এটি সম্পর্কে আপনার জানা দরকার, আপনি যদি কেবলমাত্র এই ইভেন্টগুলি সংরক্ষণ করতে চান তবে কিছু আপেক্ষিক ডাটাবেস ব্যবহার করুন বা পাঠ্যক্রমে তাদের ডিক্রিবিং করুন এবং স্ক্রিপ্টিং ভাষা ব্যবহার করুন (তিনি পার্সিং এবং মূল্যায়ন করবেন আপনি). :)

আপনি যা চান তা হল ঘটনাগুলি (1) চিহ্নিত করা এবং তারপরে এমন কিছু ক্রিয়া করা উচিত যা এই ইভেন্টগুলির দ্বারা দাবি করা হয়েছে (মুদ্রণ বার্তা, কীপ্রেসের জন্য চেক করুন ...) (2)। আপনি এই ইভেন্টগুলি কেবল একবার (3) ঘটতে চান।

মূলত আপনি শর্তাদি পরীক্ষা করতে চান এবং তারপরে কিছু আচরণের সময় নির্ধারণ করতে চান।

কীভাবে ইভেন্টগুলি চিনতে হবে (1)

  • আপনি এই "প্রথম শত্রুর মুখোমুখি", "নতুন আইটেম অর্জন" এর মতো ইভেন্টগুলি সনাক্ত করতে চান
  • যদি জেনেরিক অংশটি ঘটে, " শত্রুর মুখোমুখি ", " আইটেমটি পেয়েছে " আপনি নির্দিষ্ট অংশের জন্য পরীক্ষা করুন " প্রথমে ...", " নতুন আইটেম অর্জন"

কি কি ঘটনা দিয়ে তৈরি

আরও সাধারণ দৃষ্টিতে, এই জাতীয় প্রতিটি ইভেন্ট তৈরি করা হয়:

  • পূর্বশর্ত , আপনি তাদের পরীক্ষা করুন
  • ক্রিয়া যা পূর্বশর্ত পূরণ করা সম্পন্ন করা হবে (বলুন "" আপনি প্রথম শত্রু slained! ", বলে" "করতে combos, টিপে A এবং B বোতাম করে", বলুন "প্রেস অব্যাহত রাখার জন্য 'enter'", প্রয়োজন কী "লিখুন")

এই ইভেন্টগুলি কীভাবে সংরক্ষণ করবেন

কিছু ডেটা স্ট্রাকচারে:

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

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

তারপরে আপনাকে এই স্ট্রিং / জিনিসগুলি পার্স করতে হবে। অথবা আপনি পাইথন বা এলইউএর মতো কিছু স্ক্রিপ্টিং ভাষা বা এলআইএসপি-র মতো ভাষা ব্যবহার করতে পারেন, তারা সকলেই আপনার জন্য এটি বিশ্লেষণ করতে এবং চালিত করতে পারে। :)

গেম লুপে এই ইভেন্টগুলি কীভাবে ব্যবহার করবেন (2)

আপনার এই দুটি ডেটা স্ট্রাকচারের প্রয়োজন হবে:

  • ইভেন্টের সারি (যে অনুষ্ঠানগুলি চালানোর জন্য নির্ধারিত রয়েছে এখানে এখানে স্থাপন করা হয়েছে)
  • ক্রিয়াগুলির সারি (নির্ধারিত ক্রিয়াকলাপ, ইভেন্টগুলি বোঝায় যে ক্রিয়াগুলি করা হয়)

অ্যালগরিদম:

  • তোমাদের মধ্যে কেউ কেউ চিনতে ঘটনা এর পূর্বশর্ত পূরণ করা তার পুরা ঘটনা কিউ
  • (3) তারপরে আপনার অবশ্যই নিশ্চিত হওয়া উচিত যে আপনি চাইলে এই ঘটনাটি একবার ঘটেছে :) (উদাহরণস্বরূপ বুলিয়ান অ্যারের সাথে_এটি_সন্তান_হাপেন ["প্রথম শত্রুর মুখোমুখি"])
  • (যদি কর্ম কিউ খালি, তারপর) যদি সেখানে ঘটনা ঘটনা কিউ আপনি তার করা ক্রিয়া মধ্যে কর্ম কিউ থেকে তাকে অপসারণ ঘটনা কিউ
  • আছে যদি কর্ম মধ্যে কর্ম সারিতে আপনি করছেন কি এটা দ্বারা দাবি করা হয় শুরু
  • যদি এই জাতীয় ক্রিয়া হয়ে থাকে তবে আপনি এটিকে ক্রিয়া সারি থেকে সরিয়ে ফেলুন

এই ক্রিয়াগুলি নিজেই কীভাবে করা যায় (2)

আপনি অবজেক্টের তালিকা তৈরি করেন, যার "আপডেট" ফাংশন রয়েছে। এগুলিকে কখনও কখনও সত্তা (ভূমিকম্প ইঞ্জিনে) বা অভিনেতা (অবাস্তব ইঞ্জিনে) বলা হয়।

  1. আপনি ক্রিয়াকলাপ সারি শুরু করার দাবি করা হয় যখন আপনি এই বস্তুগুলি শুরু।
  2. এই বিষয়বস্তু যেমন অন্য কিছু টাইমার হিসাবে অন্যান্য জিনিস ব্যবহার করা যেতে পারে। ভূমিকম্পে এই সত্ত্বাগুলি পুরো গেম যুক্তির জন্য ব্যবহৃত হয়, আমি আপনাকে এটি সম্পর্কে কিছু উপাদান পড়ার পরামর্শ দিই ।

ক্রিয়া "কিছু বলুন"

  1. আপনি স্ক্রিনে কিছু মুদ্রণ
  2. আপনি এই বার্তাটি কয়েক সেকেন্ডের জন্য উপস্থিত হতে চান
  3. "আপডেট" এ:
    • পরিবর্তনশীল সরান_আম_এর পরে তৈরি করুন এবং সময় হিসাবে এটি কমে যান
    • যখন ভেরিয়েবল 0 হয় আপনি ক্রিয়া সারি থেকে এই ক্রিয়াটি সরিয়ে দিন
    • আপনি এই বস্তুটিও সরিয়ে ফেলুন (বা এটি সরানোর জন্য নির্ধারিত সময় ...)

ক্রিয়া "কী প্রয়োজন"

  1. আপনি কীভাবে এটি তৈরি করতে চান তা এটির উপর নির্ভর করে তবে আমি মনে করি আপনি একটি বার্তা তৈরি করেছেন
  2. "আপডেট" "এ:
    • আপনি কেবল ওয়ান্ডপ্রেস ইভেন্টটি পরীক্ষা করে দেখুন
    • কিপ্রেস ইভেন্টগুলি রাখতে আপনার সম্ভবত কিছু অ্যারে / সারি প্রয়োজন
    • তারপরে আপনি এটিকে ক্রিয়া সারি থেকে সরিয়ে এবং অবজেক্টটি সরাতে পারেন

কি পদ্ধতি শিখতে হবে


-১ ঠিক আছে, বা তিনি কেবল কোনও ফাংশন কল করেছেন, গুরুত্ব সহকারে, ওপি কেবল কোনও শর্ত পূরণ করার সময় একটি বার্তা বাক্স চায়
মাইক সেমডার

খুব সুন্দর লেখার কথা, তবে ঠিক আমি যা খুঁজছিলাম তা নয়। আমি কী চাই তা ব্যাখ্যা করতে আমার খুব কষ্ট হয়েছিল। আমি একটি দ্বিতীয় ব্যাখ্যা যুক্ত করেছি: আমার যে সমস্যাটি হচ্ছে তা হ'ল গেমটিতে কিছু অতিরিক্ত ক্রিয়া এমন পদ্ধতিতে রাখা যা সবসময় প্রায় একই রকম হয়। আরপিজি যুদ্ধের মতো, প্রত্যেকেরই পালা থাকে, একটি দক্ষতা ইত্যাদি থাকে - এটি সর্বদা একই থাকে। তবে যদি এমন কোনও ঘটনা ঘটে থাকে যেখানে আমি কোথাও কোথাও একটি কাট দৃশ্য প্রদর্শন করতে পারি। কাটসিন অন্তর্ভুক্ত পরিবর্তিত যুদ্ধের ক্লাসে পাস করার জন্য পুরো গেম স্ট্রাকচারকে মোডিফাই করা খুব অকার্যকর বলে মনে হচ্ছে। আমি ভাবছি কীভাবে এটি সাধারণত হয়?
omgnoseat
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.