গেমসের জন্য আচরণ / উপাদান ভিত্তিক সিস্টেম তৈরি করুন


11

পটভূমি

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

public class Baddie:AnimatedSprite //(or StaticSprite if needed, which inherit Sprite)
{
    //sprite base will have things like what texture to use, 
    //what the current position is, the base Update/Draw/GetInput methods, etc..
    //an AnimatedSprite contains helpers to animated the player while 
    //a StaticSprite is just one that will draw whatever texture is there
}

সমস্যাটি

বলি যে আমি একটি 2 ডি প্ল্যাটফর্মার তৈরি করছি, এবং লাফ দিতে সক্ষম হওয়ার জন্য ব্যাডির প্রয়োজন need সাধারণত আমি যা করি তা হ'ল আপডেট / গেটইনপুট পদ্ধতিগুলিতে উপযুক্ত কোড যুক্ত করা। তারপরে যদি আমার প্লেয়ারটিকে ক্রল, হাঁস, আরোহণ ইত্যাদি করা দরকার হয় ... কোড সেখানে যাবে।

যদি আমি সাবধান না হন তবে এই পদ্ধতিগুলি বিশৃঙ্খলাবদ্ধ হয়ে যায়, তাই আমি এই জাতীয় পদ্ধতিগুলির জোড়া তৈরি করে শেষ করি

CheckForJumpAction(Input input) এবং DoJump()

CheckforDuckAction(Input input) এবং DoDuck()

সুতরাং গেটইনপুটের মত দেখাচ্ছে

public void DoInput(Input input)
{
    CheckForJumpAction(input);
    CheckForDuckAction(input);
}

এবং আপডেট মত দেখাচ্ছে

public void Update()
{
    DoJump();
    DoDuck();
}

যদি আমি গিয়ে অন্য একটি গেম তৈরি করি যেখানে প্লেয়ারকে লাফিয়ে হাঁসের দরকার হয় তবে আমি সাধারণত একটি গেমের মধ্যে যাই যা কার্যকারিতা রয়েছে এবং এটি অনুলিপি করে। অগোছালো, আমি জানি। আমি কেন আরও ভাল কিছু খুঁজছি ts

সমাধান?

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

আমি একটি বেস বিহেভিয়ার অবজেক্ট তৈরি করব

public class Behavior
{
    public void Update()
    Public void GetInput()
}

এবং আমি এটি ব্যবহার করে আচরণ তৈরি করতে পারি। JumpBehavior:BehaviorএবংDuckBehavior:Behavior

তারপরে আমি স্প্রাইট বেসে আচরণের সংকলন যুক্ত করতে এবং প্রতিটি সত্তায় আমার যা প্রয়োজন তা যুক্ত করতে পারি।

public class Baddie:AnimatedSprite
{
    public Baddie()
    {
        this.behaviors = new Behavior[2];
        this.behaviors[0] = new JumpBehavior();
        //etc...
    }

    public void Update()
    {
        //behaviors.update
    }

    public GetInput()
    {
        //behaviors.getinput
    }
}

তাই এখন যদি আমি অনেক গেমগুলিতে জাম্প এবং হাঁস ব্যবহার করতে চাইতাম তবে আমি কেবল আচরণগুলি আনতে পারি। এমনকি সাধারণদের জন্য আমি একটি লাইব্রেরি তৈরি করতে পারতাম।

এটা কি কাজ করে?

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

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

আমি নিশ্চিত যে আরও কিছু সমস্যা আমি লক্ষ্য করছি are তবে পুরো উদ্দেশ্যটি হ'ল গেমস এবং একই গেমের সত্তার মধ্যে এই আচরণগুলি সহজেই পুনরায় ব্যবহার করতে সক্ষম হওয়া আমার পক্ষে purpose

তাই আমি এটি আপনার কাছে ফিরিয়ে দিই। কীভাবে / যদি এটি করা যায় তা ব্যাখ্যা করার জন্য যত্নশীল? আপনি একটি ভাল ধারণা আছে? আমি উত্কর্ণ.


এটিকে আরও ভাল জিজ্ঞাসা করা যেতে পারে gamedev.stackexchange.com এ ?
rcapote

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

@ ক্র্যাপোট এই সাইটে হোয়াইটবোর্ডিং / আলোচনার জন্য নয়?

2
@ জো - না, না এমনকি এখানে "আলোচনার" কথাও উল্লেখ করবেন না বা আপনি অস্তিত্বের বাইরে চলে যাবেন। এই সাইটটি কেবল প্রশ্ন-> উত্তর-> ধরণের ধরণের মিথস্ক্রিয়া জন্য।
এডওয়ার্ড স্ট্রেঞ্জ

ঠিক আছে, উপাদান-ভিত্তিক সত্তা সিস্টেমগুলি এমন কিছু যা ইদানীং গেম ডে সম্প্রদায়ে ট্রেন্ডিং শুরু করেছে যাতে আমি বুঝতে পেরেছিলাম যে আপনি ভাল মনোযোগ পেতে পারেন তবে আপনি সম্ভবত এখানে ভাল উত্তর পাবেন। এই সমস্যাটি সম্পর্কে এখানে গেমদেব.টনে একটি আকর্ষণীয় আলোচনা যা আপনাকে আকর্ষণীয় মনে করতে পারে: গেমদেব.ট.
টপিক /

উত্তর:


1

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


9

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

(স্বীকৃত) উদাহরণ হিসাবে:

// The basic definition of the jump behavior
public interface IJumpBehavior {
    void Jump();
}

প্রতিটি নির্দিষ্ট জাম্প সম্পর্কে অগত্যা তথ্য না জেনে এখন আপনি বিভিন্ন ধরণের জাম্প প্রয়োগ করতে পারেন যা আপনার চরিত্রটি ব্যবহার করতে পারে:

// This is the jump the character may have when first starting
public class NormalJump : IJumpBehavior {

     public void Jump() {
         Console.WriteLine("I am jumping, and being pretty boring about it!");
     }

}

// This is the jump of a character who has consumed a power-up
public class SuperJump : IJumpBehavior {
    public void Jump() { 
         Console.WriteLine("I am all hopped up on star power, now my jumps can do damage!");
     }
}

যে সমস্ত অক্ষর আপনি লাফানোর ক্ষমতা রাখতে চান তা এখনই আইজেম্পেবলের একটি রেফারেন্স ধারণ করতে পারে এবং আপনার বিভিন্ন বাস্তবায়ন গ্রাস করতে শুরু করতে পারে

public class HeroCharacter {

    // By default this hero can perform normal jump.
    private IJumpBehavior _jumpBehavior = new NormalJump();

    public void Jump() {
        _jumpBehvaior.Jump();
    }

    // If you want to change the hero's IJumpable at runtime
    public void SetJump(IJumpBehavior jumpBehavior) {
      _jumpBehavior = jumpBehavior;
    }

}

তারপরে আপনার কোডটি এমন কিছু দেখতে পারে:

HeroCharacter myHero = new HeroCharacer();

// Outputs: "I am jumping, and being pretty boring about it!"
myHero.Jump()

// After consuming a power-up
myHero.SetJump(new SuperJump());

// Outputs: "I am all hopped up on star power, now my jumps can do damage!"
myHero.Jump();

এখন আপনি সহজেই এই আচরণগুলি পুনরায় ব্যবহার করতে পারেন, বা এমনকি পরে আরও প্রসারিত করতে পারেন কারণ আপনি আরও ধরণের জাম্প যুক্ত করতে চান, বা একক সাইড-স্ক্রোলিং প্ল্যাটফর্মে আরও গেম তৈরি করতে পারেন।


আমি যা খুঁজছি ঠিক তা নয়, এটি খুব কাছাকাছি এবং এটির মতো। আমি নিশ্চিত হয়ে এটির সাথে খেলব। ধন্যবাদ!

1

DCI আর্কিটেকচারটি একবারে দেখুন ওও প্রোগ্রামিংয়ের একটি আকর্ষণীয় গ্রহণ যা আপনাকে সহায়তা করতে পারে।

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

আপনি সাধারণ আচরণ এবং ভূমিকার একটি গ্রন্থাগার তৈরি করতে পারেন যা পৃথক প্রকল্পের ডোমেন অবজেক্টের মধ্যে ভাগ করা যায়।

সি # তে কোড উদাহরণের জন্য সি # তে ডিসিআই দেখুন ।


0

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

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