আমি সেখানে মনে করি না এক এই ধারণা বাস্তবায়ন গৃহীত পথ, কিন্তু আমি সত্যিই ভাগ করতে চান কিভাবে চাই আমি সাধারণত এই সঙ্গে আমার খেলায় মোকাবেলা। এটি কমান্ড ডিজাইন প্যাটার্ন এবং কম্পোজিট ডিজাইনের প্যাটার্নের সংমিশ্রণ ।
আমার ক্রিয়াগুলির জন্য একটি বিমূর্ত বেস শ্রেণি রয়েছে যা Update
প্রতিটি ফ্রেম হিসাবে পরিচিত হওয়া পদ্ধতির চারপাশে মোড়ক ছাড়া আর কিছুই নয় , এবং Finished
ক্রিয়াটি শেষ হয়ে যাওয়ার পরে চিহ্নিত করার জন্য একটি পতাকা রয়েছে।
abstract class Action
{
abstract void Update(float elapsed);
bool Finished;
}
আমি এমন একধরণের ক্রিয়া তৈরি করতে সম্মিলিত নকশার প্যাটার্নটিও ব্যবহার করি যা অন্যান্য ক্রিয়াগুলি হোস্টিং এবং সম্পাদন করতে সক্ষম। এটিও একটি বিমূর্ত শ্রেণি। সারবস্তুটা হচ্ছে:
abstract class CompositeAction : Action
{
void Add(Action action) { Actions.Add(action); }
List<Action> Actions;
}
তারপরে আমার দুটি যৌগিক ক্রিয়াকলাপ রয়েছে, একটি সমান্তরাল সম্পাদনের জন্য এবং একটি ক্রমিক ক্রিয়াকলাপের জন্য । তবে সৌন্দর্যটি হ'ল যেহেতু সমান্তরাল এবং ক্রমগুলি ক্রিয়া হয় তাই আরও জটিল নির্বাহের প্রবাহ তৈরি করার জন্য এগুলি একত্রিত করা যেতে পারে ।
class Parallel : CompositeAction
{
override void Update(float elapsed)
{
Actions.ForEach(a=> a.Update(elapsed));
Actions.RemoveAll(a => a.Finished);
Finished = Actions.Count == 0;
}
}
এবং এক যে ক্রমিক ক্রিয়াকলাপ পরিচালনা করে।
class Sequence : CompositeAction
{
override void Update(float elapsed)
{
if (Actions.Count > 0)
{
Actions[0].Update(elapsed);
if (Actions[0].Finished)
Actions.RemoveAt(0);
}
Finished = Actions.Count == 0;
}
}
এটি স্থানে রেখে এটি কেবল কংক্রিট অ্যাকশন বাস্তবায়ন তৈরি করার Parallel
এবং Sequence
কার্যকর করার প্রবাহকে নিয়ন্ত্রণ করার জন্য এবং কার্যগুলি ব্যবহার করার বিষয় । আমি একটি উদাহরণ দিয়ে শেষ করব:
// Create a parallel action to work as an action manager
Parallel actionManager = new Parallel();
// Send character1 to destination
Sequence actionGroup1 = new Sequence();
actionGroup1.Add(new MoveAction(character1, destination));
actionGroup1.Add(new TalkAction(character1, "Arrived at destination!"));
actionManager.Add(actionGroup1);
// Make character2 use a potion on himself
Sequence actionGroup2 = new Sequence();
actionGroup2.Add(new RemoveItemAction(character2, ItemType.Potion));
actionGroup2.Add(new SetHealthAction(character2, character2.MaxHealth));
actionGroup2.Add(new TalkAction(character2, "I feel better now!"));
actionManager.Add(actionGroup2);
// Every frame update the action manager
actionManager.Update(elapsed);
আমি এই সিস্টেমটি ইতিপূর্বে একটি গ্রাফিক অ্যাডভেঞ্চারে সমস্ত গেমপ্লে চালাতে সফলভাবে ব্যবহার করেছি তবে এটি সম্ভবত বেশ কিছু কিছুর জন্য কাজ করা উচিত। এটি অন্যান্য ধরণের সংমিশ্রিত ক্রিয়া যুক্ত করার জন্যও যথেষ্ট সহজ ছিল, যা এক্সিকিউশন লুপ এবং শর্তসাপেক্ষ তৈরি করার জন্য ব্যবহৃত হয়েছিল।