小さな演習として、エンティティ(移動、基本的なAIなど)を処理するだけの非常に小さくてシンプルなゲームエンジンを作成しようとしています。
そのため、ゲームがすべてのエンティティの更新をどのように処理するかを考えようとしていますが、少し混乱しています(おそらく間違った方法で行っているためです)
そこで、この質問をここに投稿して、私の現在の考え方を示し、誰かが私にそれを行うためのより良い方法を提案できるかどうかを確認することにしました。
現在、必要な他のクラス(CWindowクラス、CEntityManagerクラスなど)へのポインターを受け取るCEngineクラスがあります。
擬似コードでは次のようなゲームループがあります(CEngineクラス内)
while(isRunning) {
Window->clear_screen();
EntityManager->draw();
Window->flip_screen();
// Cap FPS
}
私のCEntityManagerクラスは次のようになりました。
enum {
PLAYER,
ENEMY,
ALLY
};
class CEntityManager {
public:
void create_entity(int entityType); // PLAYER, ENEMY, ALLY etc.
void delete_entity(int entityID);
private:
std::vector<CEntity*> entityVector;
std::vector<CEntity*> entityVectorIter;
};
そして、私のCEntityクラスは次のようになりました。
class CEntity() {
public:
virtual void draw() = 0;
void set_id(int nextEntityID);
int get_id();
int get_type();
private:
static nextEntityID;
int entityID;
int entityType;
};
その後、例えば敵のクラスを作成し、それにスプライトシートや独自の機能などを与えます。
例えば:
class CEnemy : public CEntity {
public:
void draw(); // Implement draw();
void do_ai_stuff();
};
class CPlayer : public CEntity {
public:
void draw(); // Implement draw();
void handle_input();
};
これらはすべて、画面にスプライトを描画するだけで問題なく機能しました。
しかし、あるエンティティには存在するが別のエンティティには存在しない関数を使用するという問題に直面しました。
上記の擬似コードの例では、do_ai_stuff(); およびhandle_input();
私のゲームループからわかるように、EntityManager-> draw();への呼び出しがあります。これはentityVectorを繰り返し処理し、draw()を呼び出しました。各エンティティの関数-すべてのエンティティにdraw()があるため、これは問題なく機能しました。働き。
しかし、入力を処理する必要があるのがプレーヤーエンティティである場合はどうなるでしょうか?それはどのように機能しますか?
試したことはありませんが、敵のようなエンティティにはhandle_input()関数がないため、draw()関数のようにループすることはできないと思います。
次のように、ifステートメントを使用してentityTypeをチェックできます。
for(entityVectorIter = entityVector.begin(); entityVectorIter != entityVector.end(); entityVectorIter++) {
if((*entityVectorIter)->get_type() == PLAYER) {
(*entityVectorIter)->handle_input();
}
}
しかし、私は人々が通常どのようにこのようなものを書くのかわからないので、それを行うための最良の方法がわかりません。
私はここにたくさん書いたが、具体的な質問はしなかったので、ここで探しているものを明確にします。
- コードのレイアウト/設計方法は問題ありませんか?それは実用的ですか?
- 自分のエンティティを更新し、他のエンティティにはない関数を呼び出すためのより効率的な方法はありますか?
- 列挙型を使用してエンティティタイプを追跡することは、エンティティを識別するための良い方法ですか?