Trình phát và troll của bạn không là gì ngoài bộ dữ liệu, cái mà chúng ta gọi là Mô hình dữ liệu mô tả thế giới của bạn. Cuộc sống, hàng tồn kho, khả năng tấn công, kiến thức của họ về thế giới thậm chí - tất cả bao gồm trong mô hình dữ liệu.
Giữ một đối tượng Mô hình chính duy nhất chứa tất cả dữ liệu mô tả thế giới của bạn. Nó sẽ chứa thông tin chung về thế giới như độ khó, thông số vật lý, v.v. Nó cũng sẽ chứa một danh sách / mảng dữ liệu của các thực thể cụ thể như tôi đã mô tả ở trên. Mô hình chính này có thể bao gồm nhiều tiểu dự án để mô tả thế giới của bạn. Không ở đâu trong mô hình của bạn, bạn nên có bất kỳ chức năng nào điều khiển logic trò chơi hoặc logic hiển thị; getters là ngoại lệ duy nhất và sẽ chỉ được sử dụng để cho phép bạn lấy dữ liệu từ mô hình dễ dàng hơn (nếu các thành viên công cộng chưa thực hiện thủ thuật này).
Tiếp theo, tạo các hàm trong một hoặc nhiều lớp "trình điều khiển"; bạn có thể viết tất cả chúng dưới dạng các hàm trợ giúp trong lớp chính của mình, mặc dù điều này có thể hơi lớn sau một thời gian. Chúng sẽ được gọi mỗi bản cập nhật để hành động theo dữ liệu của các thực thể cho các mục đích khác nhau (di chuyển, tấn công, v.v.). Giữ các chức năng này bên ngoài một lớp thực thể hiệu quả hơn về tài nguyên và khi bạn biết những gì mô tả thực thể của mình, bạn sẽ tự động biết những chức năng nào cần phải hành động trên nó.
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.
}
Một lưu ý cuối cùng là nó cũng hữu ích để giữ logic hiển thị của bạn tách biệt với logic trò chơi của bạn. Logic hiển thị sẽ là "Tôi vẽ cái này trên màn hình ở đâu và màu gì?" so với logic trò chơi là những gì tôi đã phác thảo trong mã giả ở trên.
. Mục tiêu của việc phân tách các mối quan tâm rõ ràng. Xem câu hỏi này .)