2017-08-25 74 views
2

我正在用C++開發2D戰鬥遊戲(用於學習目的),而且我很難搞清楚如何正確實現遊戲邏輯。爲了快速瀏覽我當前的體系結構,我有作爲數據持有者的組件類,並且我擁有「系統」,這些「系統」只是設計用於處理這些組件的功能。我有保持當前正在遊戲的戰士的陣列的場景類和該場景被傳遞給各個子系統然後可以自由地對戰鬥機部件起作用,更新戰士狀態:將遊戲邏輯層實現爲當前2D遊戲架構的方法

//Add a fighter object to array of fighters and set starting position 
scene.CreatePlayerFighter(160.0f, 0.0f); 
scene.CreateAIFighter(80.0f, 45.0f); 

gameWolrd.Init(scene); 
Renderer.Init(scene, window); 
AI.Init(scene); 
//etc... 

//Game loop 
while (true) 
{ 
    Input.Update(scene); 

    Physics.Update(scene); 
    AI.Update(scene); 
    //etc.... 

    window.ClearBuffers(); 

    Renderer.Update(scene, colorShaderProgram); 

    window.SwapBuffers(); 
} 

同樣,內部的各子系統(渲染器,AI,輸入等)所有戰鬥機部件被傳遞到系統的功能和吐回了用新值然後將其插回戰機:

void Physics::Update(Scene& scene) 
{ 
    for (Fighter& fighter : scene.fighters) 
    { 
     //Update fighter position based on fighter's current velocity which has been set by input 
     TransformComponent newFighterPosition = System::MoveFighter(fighter.GetComponent<TransformComponent>(), fighter.GetComponent<VelocityComponent>()); 

     //Insert new TransformComponent to update fighter's position 
     fighter.Insert<TransformComponent>(newFighterPosition); 
    } 
} 

該電流架構具有的優點因爲我可以非常容易地添加和刪除系統,而不影響戰鬥機類或組件直接跳轉。問題是一切都是絕望的連續,因爲我的場景被逐一傳遞到每個子系統來更新戰士。我提到這個問題是因爲我的一個想法是實現一個遊戲邏輯層,就是讓更高等級的類直接調用特定的遊戲引擎系統函數,如physics.MoveFighter(TransformComponent, VelocityComponent, float amountToMove);,我可以在其中添加額外的參數,以便讓用戶在遊戲邏輯層級更具控制力。當然,以這種方式做事意味着系統功能將以遊戲邏輯的用戶所看到的任何順序被調用和調用。有沒有辦法以這種方式仍然實現遊戲邏輯層,並可能將所有調用排隊並重新排列它們以在遊戲引擎中正確運行?或者是否有更好的方法來嘗試在當前體系結構中實現遊戲邏輯?

+0

你可以做的一個方法是建立一個新的系統讓RW訪問所有的組件和戰鬥機,然後把它放在幀的結尾打勾? –

回答

0
  1. 當我看到你的目標,你可以只存儲movementFactor領域中的戰鬥機,並允許它從遊戲邏輯層改變。在物理課上,三角洲則由該領域培育出來。如果您使用類似系統的組件,則可能不想手動更新組件,只能使用數據進行操作。

  2. 邏輯更新順序是一個複雜的問題:想象一隻雞落在一個雞蛋上。它發生在同一幀雞觸及雞蛋,雞蛋準備向我們展示新的小雞。什麼應該先執行?這取決於首先更新的內容:物理或雞蛋,以及是否立即應用反應。最好的場景(通常最公平)是讓他們不要馬上應用,而是形成一堆對象(組件)狀態的變化,讓他們在行動階段後獨立解決。

此外,請確保您不想堅持像entityx這樣的現有實體系統。