গেম ক্রিয়া সম্পাদনের জন্য প্যাটার্ন


11

কোনও গেমের মধ্যে বিভিন্ন ক্রিয়া সম্পাদনের জন্য কি সাধারণভাবে গ্রহণযোগ্য প্যাটার্ন রয়েছে? কোনও খেলোয়াড় ক্রিয়া সম্পাদন করতে পারে এবং কোনও এআই ক্রিয়া সম্পাদন করতে পারে যেমন চলন, আক্রমণ, স্ব-ধ্বংস ইত্যাদি actions

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

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

সুতরাং ... এটি করার একটি আরও গ্রহণযোগ্য উপায় আছে, বা এই শব্দ ঠিক আছে?


এটা ভাল লাগছে, প্রশ্ন আপনি সারি বলতে কি বোঝাতে চেয়েছেন? বেশিরভাগ গেমের খুব দ্রুত প্রতিক্রিয়া আছে? "এআই বিভিন্ন পদক্ষেপের জন্য সারিবদ্ধ করতে পারে"
আতুরস্যামস

ভাল যুক্তি. কোনও সারি নেই। এটি কেবল ব্যস্ত কিনা তা জানতে হবে এবং যদি না হয় তবে ক্রিয়া চালান।
আরকিলিকনাম

উত্তর:


18

আমি সেখানে মনে করি না এক এই ধারণা বাস্তবায়ন গৃহীত পথ, কিন্তু আমি সত্যিই ভাগ করতে চান কিভাবে চাই আমি সাধারণত এই সঙ্গে আমার খেলায় মোকাবেলা। এটি কমান্ড ডিজাইন প্যাটার্ন এবং কম্পোজিট ডিজাইনের প্যাটার্নের সংমিশ্রণ ।

আমার ক্রিয়াগুলির জন্য একটি বিমূর্ত বেস শ্রেণি রয়েছে যা 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);

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


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

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

1
প্রথম পরিস্থিতিতে, আসুন আমরা বলি যে আপনার Characterশ্রেণীর একটি Positionসম্পত্তি রয়েছে এবং একটি Drawপদ্ধতি যা বর্তমানের মূল্যটি কী তা পড়ে Positionএবং সেখানে সঠিক চিত্রটি আঁকে। এই পরিস্থিতিতে, আপনাকে কেবল তার মানটি আপডেট করতে Positionহবে ফলাফলটি স্বয়ংক্রিয়ভাবে স্ক্রিনে দেখা যাবে।
ডেভিড গাউভিয়া

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

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