আপনার প্লেয়ার এবং আপনার ট্রোল ডেটার সেট ছাড়া কিছুই নয়, আমরা যাকে ডেটা মডেল বলি যা আপনার বিশ্বের বর্ণনা করে। জীবন, জায়, আক্রমণ ক্ষমতা, তাদের এমনকি বিশ্বের জ্ঞান - সমস্ত ডেটা মডেলের অন্তর্ভুক্ত।
একটি একক, প্রধান মডেল অবজেক্ট রাখুন যা আপনার পৃথিবীর বর্ণনা দিয়ে সমস্ত ডেটা ধারণ করে। এটি সাধারণ বিশ্বের তথ্য যেমন অসুবিধা, পদার্থবিজ্ঞানের পরামিতি ইত্যাদি ধারণ করবে এটি উপরে বর্ণিত হিসাবে এটি নির্দিষ্ট সত্তার ডেটাগুলির একটি তালিকা / অ্যারে ধারণ করবে । আপনার বিশ্বের বর্ণনা দেওয়ার জন্য এই প্রধান মডেলটিতে অনেকগুলি সাববোজেক্ট থাকতে পারে। গেম লজিক বা ডিসপ্লে লজিক নিয়ন্ত্রণ করে এমন কোনও ফাংশন আপনার মডেলের কোথাও থাকা উচিত নয়; প্রাপ্তরা একমাত্র ব্যতিক্রম, এবং কেবলমাত্র আপনাকে আরও সহজেই মডেল থেকে ডেটা পাওয়ার অনুমতি দেওয়ার জন্য ব্যবহার করা হবে (যদি জন সদস্যরা ইতিমধ্যে কৌশলটি না করেন))
এর পরে, এক বা একাধিক "নিয়ামক" শ্রেণিতে ফাংশন তৈরি করুন; আপনি এগুলি সমস্তগুলিকে আপনার মূল শ্রেণিতে সহায়ক ফাংশন হিসাবে লিখতে পারেন, যদিও এটি কিছুক্ষণ পরে কিছুটা বড় হতে পারে। এগুলিকে বিভিন্ন উদ্দেশ্যে (চলাচল, আক্রমণ ইত্যাদি) সত্তাগুলির ডেটা অনুসারে কাজ করতে প্রতিটি আপডেট বলা হবে। কোনও সত্তা শ্রেণীর বাইরে এই ফাংশনগুলি রাখুন আরও সংস্থান-দক্ষ, এবং একবার আপনার সত্তার বর্ণনা দিলে আপনি স্বয়ংক্রিয়ভাবে জানতে পারবেন যে এতে কী কী ফাংশনগুলি কাজ করা প্রয়োজন।
class Main
{
//...members variables...
var model:GameModel = new GameModel();
//...member functions...
function realTimeUpdate() //called x times per second, on a timer.
{
for each (var entity in model.entities)
{
//command processing
if (entity == player)
decideActionsFromPlayerInput(entity);
else //everyone else is your enemy!
decideActionsThroughDeviousAI(entity);
act(entity);
}
}
//OR
function turnBasedUpdate()
{
if (model.whoseTurn == "player")
{
decideActionsFromInput(model.player); //may be some movement or none at all
act(player);
}
else
{
var enemy;
for each (var entity in model.entities)
{
if (entity != model.player)
{
enemy = entity;
decideActions(enemy);
act(enemy);
}
}
}
}
//AND THEN... (common to both turn-based and real-time)
function decideActionsThroughDeviousAI(enemy)
{
if (distanceBetween(enemy, player) <= enemy.maximumAttackDistance)
storeAttackCommand(enemy, "kidney punch", model.player);
else
storeMoveCommand(player, getVectorFromTo(enemy, model.player));
}
function decideActionsFromPlayerInput(player)
{
//store commands to your player data based on keyboard input
if (KeyManager.isKeyDown("A"))
storeMoveCommand(player, getForwardVector(player));
if (KeyManager.isKeyDown("space"))
storeAttackCommand(player, "groin slam", currentlyHighlightedEnemy);
}
function storeAttackCommand(entity, attackType, target)
{
entity.target = target;
entity.currentAttack = attackType;
//OR
entity.attackQueue.add(attackType);
}
function storeMoveCommand(entity, motionVector)
{
entity.motionVector = motionVector;
}
function act(entity)
{
entity.position += entity.motionVector;
attack(entity.target, entity.currentAttack);
}
}
class GameModel
{
var entities:Array = []; //or List<Entity> or whatever!
var player:Entity; //will often also appear in the entity list, above
var difficultyLevel:int;
var globalMaxAttackDamage:int;
var whoseTurn:Boolean; //if turnbased
//etc.
}
একটি চূড়ান্ত নোট এটি আপনার গেম যুক্তি থেকে আপনার প্রদর্শন লজিক পৃথক রাখা দরকারী। ডিসপ্লে যুক্তিযুক্ত হবে, "আমি এটি পর্দায় কোথায় আঁকবো এবং কোন রঙে?" বনাম। গেম যুক্তি যা আমি উপরের সিউডকোডে উল্লেখ করেছি।
(দেবের দ্রষ্টব্য: ক্লাসগুলি ব্যবহার করার সময়, এটি আলগাভাবে একটি কার্যকরী প্রোগ্রামিং পদ্ধতির অনুসরণ করে যা সমস্ত পদ্ধতিকে আদর্শিকভাবে রাষ্ট্রহীন হিসাবে বিবেচনা করে, একটি পরিষ্কার ডেটা মডেল এবং প্রসেসিং পদ্ধতির জন্য অনুমতি দেয় যা বজায় থাকা অবস্থায় সৃষ্ট বাগগুলি কমিয়ে দেয় F এফপি চূড়ান্ত এমভিসি, যেহেতু এটি এমভিসি'র অর্জন করে উদ্বেগের স্পষ্টভাবে বিচ্ছিন্নকরণের লক্ষ্য this এই প্রশ্নটি দেখুন ))