आपका खिलाड़ी और आपका ट्रोल कुछ और नहीं बल्कि डेटा के सेट हैं, जिसे हम डेटा मॉडल कहते हैं जो आपकी दुनिया का वर्णन करता है। जीवन, सूची, हमले की क्षमता, दुनिया का उनका ज्ञान - यहां तक कि सभी डेटा मॉडल में शामिल हैं।
एक एकल, मुख्य मॉडल ऑब्जेक्ट रखें जो आपकी दुनिया का वर्णन करने वाले सभी डेटा को रखता है। यह सामान्य दुनिया की जानकारी जैसे कि कठिनाई, भौतिकी मापदंडों आदि को धारण करेगा । जैसा कि मैंने ऊपर वर्णित किया है, यह विशिष्ट संस्थाओं के डेटा की एक सूची / सरणी भी रखेगा । इस मुख्य मॉडल में आपकी दुनिया का वर्णन करने के लिए कई उप-विषय शामिल हो सकते हैं। आपके मॉडल में कहीं भी आपके पास कोई कार्य नहीं होना चाहिए जो गेम लॉजिक या डिस्प्ले लॉजिक को नियंत्रित करता है; गेटर्स एकमात्र अपवाद हैं, और इसका उपयोग केवल मॉडल से डेटा को अधिक आसानी से प्राप्त करने की अनुमति देने के लिए किया जाएगा (यदि सार्वजनिक सदस्य पहले से ही चाल नहीं करते हैं)।
अगला, एक या अधिक "नियंत्रक" कक्षाओं में फ़ंक्शन बनाएं; आप उन सभी को अपने मुख्य वर्ग में सहायक कार्यों के रूप में लिख सकते हैं, हालांकि यह थोड़ी देर बाद बड़ा हो सकता है। इन्हें हर अपडेट को विभिन्न उद्देश्यों (आंदोलन, हमले आदि) के लिए संस्थाओं के डेटा पर कार्य करने के लिए कहा जाएगा। एक इकाई वर्ग के बाहर इन कार्यों को रखने के लिए अधिक संसाधन-कुशल है, और एक बार जब आप जानते हैं कि आपकी इकाई का क्या वर्णन है, तो आप स्वचालित रूप से जान पाएंगे कि कार्यों को इसके लिए क्या करने की आवश्यकता है।
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.
}
एक अंतिम नोट यह है कि आपके डिस्प्ले लॉजिक को आपके गेम लॉजिक से अलग रखना भी उपयोगी है। प्रदर्शन तर्क होगा, "मैं इसे स्क्रीन पर और किस रंग में खींचता हूं?" बनाम खेल तर्क मैं ऊपर छद्म में उल्लिखित किया जा रहा है।
(देव का ध्यान दें: कक्षाओं का उपयोग करते समय, यह शिथिल एक कार्यात्मक प्रोग्रामिंग दृष्टिकोण का अनुसरण करता है, जो सभी तरीकों को आदर्श रूप से स्टेटलेस मानता है, एक स्वच्छ डेटा मॉडल और प्रसंस्करण दृष्टिकोण के लिए अनुमति देता है जो कि बनाए रखा राज्य की वजह से कीड़े को कम करता है। एफपी अंतिम एमवीसी है, क्योंकि यह एमवीसी को प्राप्त करता है। स्पष्ट रूप से चिंताओं को अलग करने का लक्ष्य। इस प्रश्न को देखें ।)