Pemain Anda dan troll Anda hanyalah kumpulan data, yang kami sebut Model data yang menggambarkan dunia Anda. Kehidupan, inventaris, kemampuan serangan, bahkan pengetahuan mereka tentang dunia - semua terdiri dari model data.
Simpan satu objek Model utama yang menyimpan semua data yang menggambarkan dunia Anda. Ini akan menyimpan informasi dunia umum seperti kesulitan, parameter fisika dll. Ia juga akan menyimpan daftar / array data entitas tertentu seperti yang telah saya jelaskan di atas. Model utama ini dapat terdiri dari banyak sub-objek untuk menggambarkan dunia Anda. Tidak ada dalam model Anda jika Anda memiliki fungsi yang mengontrol logika game atau logika tampilan; getter adalah satu-satunya pengecualian, dan akan digunakan hanya untuk memungkinkan Anda mendapatkan data dari model lebih mudah (jika anggota publik belum melakukan triknya).
Selanjutnya, buat fungsi di satu atau lebih kelas "controller"; Anda dapat menulis semuanya sebagai fungsi pembantu di kelas utama Anda, meskipun ini mungkin menjadi agak besar setelah beberapa saat. Ini akan disebut setiap pembaruan untuk bertindak berdasarkan data entitas untuk tujuan yang berbeda (pergerakan, serangan, dll.). Menjaga fungsi-fungsi ini di luar kelas entitas lebih efisien sumber daya, dan begitu Anda tahu apa yang mendeskripsikan entitas Anda, Anda akan secara otomatis tahu fungsi apa yang perlu ditindaklanjuti.
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.
}
Catatan terakhir adalah bahwa berguna juga untuk menjaga logika tampilan Anda terpisah dari logika game Anda. Logika tampilan adalah, "Di mana saya menggambar ini di layar dan dalam warna apa?" vs logika permainan menjadi apa yang telah saya uraikan dalam pseudcode di atas.
(Catatan Dev: Saat menggunakan kelas, ini secara longgar mengikuti pendekatan pemrograman fungsional yang menganggap semua metode sebagai stateless stateless, memungkinkan untuk model data bersih dan pendekatan pemrosesan yang meminimalkan bug yang disebabkan oleh keadaan yang dipertahankan. FP adalah MVC utama, karena mencapai MVC's Tujuan dari pemisahan masalah secara eksplisit. Lihat pertanyaan ini .)