2017-08-25 3 views
2

私はC言語で2度の戦闘ゲームを開発しています(学習目的のため)、ゲームロジックを適切に実装する方法を考え出すのは難しいです。私の現在のアーキテクチャの概要を知るために、私はデータ保持者として機能するコンポーネントクラスを持っています。これらのコンポーネントに作用するように設計された関数だけの「システム」を持っています。私は、ゲームに現在ある戦闘機の配列を保持しているシーンのクラスを持っており、このシーンは、戦闘機の状態を更新し、その後、自由に戦闘機の部品に作用することができ、個々のサブシステムに渡されます。それぞれの内部で、現在の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); 
    } 
} 

この現在のアーキテクチャは利点を有します私は戦闘機のクラスやそれを支配することなくシステムを非常に簡単に追加したり取り外したりすることができるという点で、直接。私のシーンが各サブシステムに1つずつ渡されて戦闘機を更新するので、問題はすべてが絶望的に​​連続していることです。私はゲームロジックレイヤーを実装する私の考えの1つが、より高いレベルのクラスを持っていただけでゲームロジックレイヤレベルのユーザーにより多くのコントロールを与えるために追加のパラメーターを追加することができるphysics.MoveFighter(TransformComponent, VelocityComponent, float amountToMove);のような特定のゲームエンジンシステム関数を直接呼び出したので、もちろん、このようにすることで、ゲームロジックのユーザーがどのような順序でシステム関数を呼び出すか呼び出すことができます。このようにゲームロジックレイヤーを実装し、すべての呼び出しをキューに入れて、ゲームエンジン内で正しく動作するように並べ替える方法はありますか?それとも、私の現在のアーキテクチャ内でゲームロジックを実装しようとするより良い方法がありますか?

+0

あなたができることの1つは、新しいシステムを構築してRWのすべてのコンポーネントにアクセスし、ファイターが持っていることです。 –

答えて

0
  1. あなたの目標を見ると、単にmovementFactorフィールドを戦闘機に保存してゲームロジックレイヤーから変更することができます。物理学のクラスでは、デルタはそのフィールドによって多重化されます。コンポーネントのようなシステムを使用している場合、おそらくコンポーネントを手動で更新したくない場合は、データだけを操作してください。

  2. ロジックの更新順序は複雑な問題です。鶏が卵に落ちると想像してください。それは同じフレームで鶏が卵に触れ、卵が私たちに新しい小さな雛を見せる準備ができていることが起こります。まず何が実行されるべきですか?それは最初に更新されるものに依存します:物理学や卵、反応が即時に適用されるかどうかという事実です。最も適切なシナリオ(通常最も公平)は、即座に適用するのではなく、アクションフェーズ後に独立して解決するために、オブジェクト(コンポーネント)の状態変更のスタックを形成することです。

はまた、あなたがentityxのような既存のエンティティのシステムに固執したくないことを確認してください。

関連する問題