অ্যানিমেশন এবং ড্র লুপ থেকে গেম লজিককে আলাদা করার কিছু উপায় কী?


9

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

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

আমি কীভাবে এই মানসিকতাটি ছিন্ন করতে এবং গেমগুলির জন্য আরও সার্থক করে তোলে এমন প্যাটার্নগুলি সম্পর্কে ভাবতে শুরু করব?

উত্তর:


6

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

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

রেন্ডারিং অংশে, আপনি কেবল এটি যথারীতি করুন, আপনার মডেল থেকে সেই আয়তক্ষেত্রটি পান এবং গ্রাফিক্স এপিআইতে কল করার জন্য আপনার রেন্ডারারটি ব্যবহার করুন।

কোডে (এখানে সি ++ সিনট্যাক্স ব্যবহার করে):

class Sprite //Model
{
    private:
       Rectangle subrect;
       Vector2f position;
       //etc.

    public:
       Rectangle GetSubrect() 
       {
           return subrect;
       }
       //etc.
};

class AnimatedSprite : public Sprite, public Updatable //arbitrary interface for classes that need to change their state on a regular basis
{
    AnimationController animation_controller;
    //etc.
    public:
        void Update()
        {
            animation_controller.Update(); //Good OOP design ;) It will take control of changing animations in time etc. for you
            this.SetSubrect(animation_controller.GetCurrentAnimation().GetRect());
        }
        //etc.
};

এই তথ্য। আপনার রেন্ডারার সেই ডেটা নেবে এবং এটি আঁকবে। যেহেতু সাধারণ স্প্রাইটস এবং অ্যানিমেটেড উভয়ই একইভাবে আঁকা, আপনি এখানে পলিমারফি ব্যবহার করতে পারেন!

class Renderer
{
    //etc.
    public:
       void Draw(const Sprite &spr)
       {
           graphics_api_pointer->Draw(spr.GetAllTheDataThatINeed());
       }
};

TMV:

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

বিশ্বের মানচিত্র সরাসরি খেলোয়াড়ের অবস্থান সম্পর্কে জানে না (এর কোনও ভেক্টর 2f বা এর মতো কিছু নেই যা সরাসরি খেলোয়াড়ের অবস্থানকে সঞ্চিত করে =, পরিবর্তে এটির খেলোয়াড়ের সাথে সরাসরি প্রত্যক্ষ রেফারেন্স রয়েছে যা অ্যানিমেটেডস্পাইট থেকে প্রাপ্ত যাতে আপনি এটি সহজেই রেন্ডারারের কাছে দিতে পারেন এবং এটি থেকে প্রয়োজনীয় সমস্ত ডেটা পান।

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

প্লেয়ারটি চললে আপনি কীভাবে মডেলটি আপডেট করতে চান তা নির্ভর করে আপনি কী করতে চান।

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

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

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


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

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

আমি আপনার প্রশ্নের উত্তরে সম্পাদনা করেছি, কারণ মন্তব্যগুলি এর জন্য যথেষ্ট অক্ষরের অনুমতি দেয় না।
ট্র্যাভিসজি

যদি আমি সবকিছু সঠিকভাবে বুঝতে পারি:
টিএমভি

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

2

আপনি যদি চান তবে আমি এটি নিয়ে বিকাশ করতে পারি তবে আমার কাছে একটি কেন্দ্রীয় রেন্ডারার রয়েছে যা লুপ আঁকতে বলে gets বরং

handle input

for every entity:
    update entity

for every entity:
    draw entity

আমার মতো আরও একটি সিস্টেম আছে

handle input (well, update the state. Mine is event driven so this is null)

for every entity:
    update entity //still got game logic here

renderer.draw();

রেন্ডারার ক্লাসটি কেবলমাত্র বস্তুর অঙ্কনযোগ্য উপাদানগুলির জন্য রেফারেন্সের একটি তালিকা ধারণ করে। এগুলি নির্মাতাদের সরলতার জন্য বরাদ্দ করা হয়েছে।

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

ফ্রেমের স্বতন্ত্র অ্যানিমেশনের জন্য ড্র লুপটি করার জন্য খুব বেশি প্রয়োজন হবে না।


0

আমি ইদানীং দৃষ্টান্তগুলি শিখছি, সুতরাং এই উত্তরটি যদি অসম্পূর্ণ হয় তবে আমি নিশ্চিত যে এটির সাথে কেউ যুক্ত করবে add

গেম ডিজাইনের জন্য যে পদ্ধতিটি সর্বাধিক বোধ করে বলে মনে হচ্ছে তা হ'ল পর্দার আউটপুট থেকে যুক্তিকে আলাদা করা।

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

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

একবার আপনি সমঝোতার চারপাশে মাথা পেলে, বাকিটি মোটামুটি বোধগম্য। যদি আপনার সম্মতিতে অভিজ্ঞতা না থাকে তবে আমি দৃ strongly়ভাবে আপনাকে কয়েকটি সহজ পরীক্ষা প্রোগ্রাম লেখার পরামর্শ দিচ্ছি যাতে আপনি বুঝতে পারেন যে প্রবাহটি কীভাবে ঘটে।

আশাকরি এটা সাহায্য করবে :)

[সম্পাদনা] যে সমস্ত সিস্টেমে মাল্টিথ্রেডিং সমর্থন করে না, অ্যানিমেশনটি এখনও ড্র লুপের মধ্যে যেতে পারে, তবে আপনি রাষ্ট্রটিকে এমনভাবে যুক্ত করতে চান যে কোনও ভিন্নরকম ঘটনা ঘটছে এবং সংশ্লেষের প্রক্রিয়া চালিয়ে যাবেন না signal বর্তমান স্তর / মানচিত্র / ইত্যাদি ...


1
আমি এখানে অসমত। বেশিরভাগ ক্ষেত্রে আপনি মাল্টি-থ্রেড করতে চান না, বিশেষত যদি এটি একটি ছোট খেলা।
কমিউনিস্ট হাঁস

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