Votre joueur et votre troll ne sont que des ensembles de données, ce que nous appelons le modèle de données qui décrit votre monde. La vie, l'inventaire, les capacités d'attaque, leur connaissance du monde même - tout se compose du modèle de données.
Conservez un seul objet Model principal contenant toutes les données décrivant votre monde. Il contiendra des informations générales sur le monde telles que la difficulté, les paramètres physiques, etc. Il contiendra également une liste / tableau de données d' entités spécifiques comme je l'ai décrit ci-dessus. Ce modèle principal peut se composer de nombreux sous-objets afin de décrire votre monde. Nulle part dans votre modèle vous ne devriez avoir de fonctions qui contrôlent la logique du jeu ou la logique d'affichage; les getters sont la seule exception, et ne seraient utilisés que pour vous permettre d'obtenir plus facilement les données du modèle (si les membres du public ne font pas déjà l'affaire).
Ensuite, créez des fonctions dans une ou plusieurs classes "contrôleur"; vous pouvez tous les écrire en tant que fonctions d'assistance dans votre classe principale, bien que cela puisse devenir un peu volumineux après un certain temps. Ceux-ci seront appelés à chaque mise à jour pour agir sur les données des entités à différentes fins (mouvement, attaque, etc.). Garder ces fonctions en dehors d'une classe d'entité est plus efficace en termes de ressources, et une fois que vous saurez ce qui décrit votre entité, vous saurez automatiquement quelles fonctions doivent agir sur elle.
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.
}
Une note finale est qu'il est également utile de séparer votre logique d'affichage de votre logique de jeu. La logique d'affichage serait: "Où puis-je dessiner cela à l'écran et dans quelle couleur?" contre la logique du jeu étant ce que j'ai décrit dans le pseudcode ci-dessus.
(Note du développeur: lors de l'utilisation des classes, cela suit une approche de programmation fonctionnelle qui considère toutes les méthodes comme étant idéalement sans état, permettant un modèle de données et une approche de traitement propres qui minimisent les bogues causés par l'état conservé. FP est le MVC ultime, car il atteint les MVC objectif de séparation explicite des préoccupations. Voir cette question .)