এক্সএনএ গেমস কম্পোনেন্টগুলির মধ্যে (বা কোনও গেমের কোনও ধরণের উপাদানগুলির মধ্যে) যোগাযোগের সুবিধার্থে আমার কোন কৌশলটি ব্যবহার করা উচিত?


9

আমি আমার প্রথম 'যথাযথ' গেম প্রকল্পটি শুরু করছি এবং এক্সএনএ-তে গেমের উপাদানগুলি কীভাবে যোগাযোগ করা উচিত তা সিদ্ধান্ত নেওয়ার চেষ্টা করে একটি অনিবার্যভাবে আমি আঘাত করেছি।

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

class SpriteManager
    Update(){
        if(player.collidesWith(enemy)
             // create new 'PlayerCollisionEvent'
    }

class HUDManager
    onPlayerCollisionEvent(){
        // Update the HUD (reduce lives etc)
    }

তবে আমি কোড সেটআপ সম্পর্কে নিশ্চিত নই (সি # তে) যা এটি সম্পূর্ণরূপে সম্পন্ন করার প্রয়োজন হবে। কী ঘটনার ট্র্যাক রাখে (কোনও ধরণের বাস?) এবং এটি কীভাবে কাঠামোগত করা হয়?

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

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

নাকি এই নিকৃষ্ট কৌশলগুলি অন্য কিছু?

আমি বুঝতে পারি এটি গেম যোগাযোগের দৃষ্টান্তগুলির মতো আংশিকভাবে আমার দুর্বল সি # জ্ঞান, তবে আমি সত্যিই এই মূল জিনিসটি সঠিকভাবে পেতে চাই।

হালনাগাদ

পরিষেবাদিগুলির দিকে নজর দেওয়া আরও বিশদ আমি কম বিশ্বাস করি - এটি মূলত একটি বিশ্বব্যাপী পরিবর্তনশীল (যা আমি বুঝতে পারি) এর পাশ দিয়ে চলেছে।

আপডেট 2

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


আমি আপনাকে প্রথমে ফ্ল্যাটরেডবাল চেষ্টা করার পরামর্শ দিচ্ছি। এটি এক্সএনএর শীর্ষে বসে এবং জীবনকে সত্যই সহজ করে তোলে।
ashes999

3
আমি ইঞ্জিনে ঝাঁপ দেওয়ার আগে কী চলছে তার মূল কথাগুলি বুঝতে চাই really
কোডিংহ্যান্ডস

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

1
আমি কিছুটা হলেও সম্মত হই তবে গেমকম্পন্টগুলির মধ্যে বেশিরভাগ ইন্টারক্লাস যোগাযোগ পরিষেবাদি ব্যবহার করে করা যায়। আমি ইভেন্ট ব্যবহার করতে অভ্যস্ত। কোনটি সেরা তা আমি নিশ্চিত নই, বা যদি বৈধ বিকল্প রয়েছে (তবে সিঙ্গলটনের, স্থিতিযুক্ত ক্লাসগুলি যে সমস্ত অন্যান্য পদ্ধতি বাদ দিয়েছিল, যেমন গ্লোবাল হিসাবে মাস্ক্রেড করছে)
কোডিংহ্যান্ডস

উত্তর:


4

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

সি # তে ইভেন্ট বাসগুলি সম্পর্কে আপনি বেশি কিছু না পাওয়ার কারণ হ'ল আমার অভিজ্ঞতায় জাভা এর বাইরে কেউ এ জাতীয় জিনিসটিকে 'বাস' বলে মনে করেন না। আরও সাধারণ পদগুলি বার্তার সারি, ইভেন্ট ম্যানেজার, সিগন্যাল / স্লট, প্রকাশ / সাবস্ক্রাইব ইত্যাদি হতে পারে be

একটি কার্যক্ষম গেমটি তৈরি করতে আপনার কোনওটির প্রয়োজন নেই, তবে যদি এটি সেই ধরণের সিস্টেমের সাথে আপনি স্বাচ্ছন্দ্য বোধ করেন তবে এটি এখানেও আপনাকে ভালভাবে পরিবেশন করবে। দুর্ভাগ্যক্রমে কেউ কীভাবে এটি তৈরি করতে হয় তা আপনাকে বলতে পারে না কারণ প্রত্যেকে এগুলিকে কিছুটা আলাদাভাবে রোল করে, এমনকি যদি সেগুলি এগুলি ব্যবহার করেও। (আমি উদাহরণস্বরূপ বলছি না)) System.Collections.Generic.List<Event>আপনার বিভিন্ন ইভেন্ট ইভেন্টের সাবক্লাস হিসাবে এবং প্রতিটি ইভেন্টের ধরণের গ্রাহকদের একটি তালিকা দিয়ে আপনি কাতারটির জন্য একটি সাধারণ দিয়ে শুরু করতে পারেন । সারিতে থাকা প্রতিটি ইভেন্টের জন্য, গ্রাহকদের তালিকা এবং প্রতিটি গ্রাহকের জন্য, handle(this_event)এটিতে কল করুন। তারপরে এটি সারি থেকে সরান। পদ্ধতি পুনরাবৃত্তি করুন।

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

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

আমি বুঝতে পারি এটি গেম যোগাযোগের দৃষ্টান্তগুলির মতো আংশিকভাবে আমার দুর্বল সি # জ্ঞান, তবে আমি সত্যিই এই মূল জিনিসটি সঠিকভাবে পেতে চাই।

সি # জাভাতে অনেকটা অভিন্ন ভাষা। আপনি জাভাতে যা কিছু করেছেন তা কেবল সি সিনেমায় করা যেতে পারে, ঠিক বিভিন্ন সিনট্যাক্স দিয়ে। আপনার যদি কোনও ধারণাটি অনুবাদ করতে সমস্যা হয় তবে এটি সম্ভবত আপনি এটির জন্য একটি জাভা-নির্দিষ্ট নাম জানেন know


কাইলোটান আপনাকে ধন্যবাদ কৌতূহলের বাইরে, আপনি নিজে কোন সিস্টেমটি ইন্টারক্লাস যোগাযোগের জন্য ব্যবহার করেন - পরিষেবাদিগুলির কাছে যোগাযোগ বা অন্য কিছু?
কোডিংহ্যান্ডস

আফাইক, ইভেন্ট বাসগুলি ম্যাসেজিং সারি স্টাফের মতো, তবে ইভেন্টগুলির জন্য।
ashes999

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

@ ashes999 - বার্তাগুলি এবং ইভেন্টগুলি এই প্রসঙ্গে খুব একই জিনিস। যদি আপনি কোনও ইভেন্ট একটি কাতারে, বা একটি বাসে বা অন্য যে কোনও কিছুতে রাখেন তবে আপনি যা যা সত্যিই সংরক্ষণ করছেন তা হ'ল একটি বার্তা যা কোনও ঘটনা ঘটেছে তা বোঝায়। একইভাবে একটি কাতারে একটি বার্তা রাখার অর্থ এই বার্তাটি উত্পন্ন করার জন্য একটি ইভেন্ট ঘটেছে। একটি অ্যাসিঙ্ক্রোনাস ফাংশন কল দেখার ঠিক বিভিন্ন উপায়।
কাইলোটন

দুঃখিত, আমি এটিকে এখনও 'জবাব' হিসাবে চিহ্নিত করি নি, তবে আমি ভেবেছিলাম যে এখানে আরও কিছু দৃষ্টিভঙ্গি থাকবে যে ভাষা নির্বিশেষে প্রতিটি গেমেরই কোনও না কোনও উপাদানগুলির মধ্যে যোগাযোগ করা দরকার ... আমরা কি মূল সম্ভাবনাগুলি আবরণ করেছি?
কোডিংহ্যান্ডস

1

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

Score.cs

class Score
{
    public int PlayerScore { get; set; }

    public Score()
    {
        EnemySpaceship.Death += new EventHandler<SpaceshipDeathEventArgs>(Spaceship_Death);
    }

    private void Spaceship_Death(object sender, SpaceshipDeathEventArgs e)
    {
        PlayerScore += e.Points;
    }
}

EnemySpaceship.cs

class EnemySpaceship
{
    public static event EventHandler<SpaceshipDeathEventArgs> Death;

    public void Kill()
    {
        OnDeath();
    }

    protected virtual void OnDeath()
    {
        if (Death != null)
        {
            Death(this, new SpaceshipDeathEventArgs(50));
        }
    }
}

SpaceshipDeathEventArgs.cs

class SpaceshipDeathEventArgs : EventArgs
{
    public int Points { get; private set; }

    internal SpaceshipDeathEventArgs(int points)
    {
        Points = points;
    }
}

1

আপনি যদি ইভেন্ট ভিত্তিক পদ্ধতির সাথে অস্বস্তি বোধ করেন, আর্টেমিসকে সি # একবার চেষ্টা করুন, এটি http://t-machine.org/index.php/2007/09/03/entity-systems-are ভিত্তিক একটি সত্ত্বার সিস্টেম কাঠামো is যে সময়টাতে-ভবিষ্যৎ অফ mmog-ডেভেলপমেন্ট পার্ট 1 /

সূত্র: https://github.com/tinnuxlich/artemis_CSharp উদাহরণ গেম: https://github.com/t ینوuxlich/ starwarrior_CSharp


0

মত ঘটনা সংযোগকারী ব্যবহারের চেষ্টা এই এক


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