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