Oynatıcınız ve trolünüz, dünyanızı tanımlayan veri Modeli olarak adlandırdığımız veri kümelerinden başka bir şey değildir. Yaşam, envanter, saldırı yetenekleri, dünya hakkındaki bilgileri bile - hepsi veri modelinden oluşur.
Dünyanızı tanımlayan tüm verileri tutan tek bir ana Model nesnesini saklayın. Zorluk, fizik parametreleri vb. Gibi genel dünya bilgilerini tutacaktır.Ayrıca yukarıda açıkladığım gibi belirli varlıkların verilerinin bir listesini / dizisini de tutacaktır . Bu ana model dünyanızı tanımlamak için birçok alt nesneden oluşabilir. Modelinizin hiçbir yerinde oyun mantığını veya ekran mantığını kontrol eden herhangi bir fonksiyonunuz olmamalıdır; alıcılar tek istisnadır ve yalnızca modelden daha kolay veri almanıza izin vermek için kullanılır (eğer kamu üyeleri hile yapmazsa).
Ardından, bir veya daha fazla "denetleyici" sınıfında işlevler oluşturun; hepsini ana sınıfınızda yardımcı işlevler olarak yazabilirsiniz, ancak bu bir süre sonra biraz büyüyebilir. Bunlara, kuruluşun verileri üzerinde farklı amaçlarla (hareket, saldırı vb.) Hareket etmek için her güncelleme denir. Bu işlevleri bir varlık sınıfının dışında tutmak daha kaynak verimlidir ve varlığınızı neyin tanımladığını öğrendikten sonra, hangi işlevlerin üzerinde işlem yapması gerektiğini otomatik olarak bilirsiniz.
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.
}
Son bir not, ekran mantığınızı oyun mantığınızdan ayrı tutmanın da yararlı olduğudur. Görüntü mantığı, "Bunu ekranda nerede ve hangi renkte çizerim?" Oyun mantığı, yukarıdaki sahte kodda özetlediğim şey.
(Dev'in notu: Sınıfları kullanırken, bu, tüm yöntemleri ideal olarak vatansız olarak gören fonksiyonel bir programlama yaklaşımını gevşek bir şekilde izler ve korunan durumun neden olduğu hataları en aza indiren temiz bir veri modeli ve işleme yaklaşımına izin verir. Endişelerin açıkça ayrılması hedefi. Bu soruya bakın .)