コンポーネント ベースのエンティティ システムを使用するゲームを作成しています。私が実装している最初の 2 つのコンポーネントは、EntityRepresentation と EntityState です。表現はアニメーションを保持し、状態はエンティティがゲーム イベントにどのように反応するかを決定します (EntityStates の例: 立っている、ジャンプしている、攻撃している、死んでいる、落下している)。
EntityRepresnetation は、エンティティの EntityState に応じて、画面に描画するアニメーションを決定します。エンティティが「ジャンプ」状態の場合、対応するアニメーションが再生されます。(EntityRepresentation::changeAnimation() 関数を参照してください。)
これが大まかなクラスの書き方です...
class EntityRepresentation
{
public:
void draw(float x, float y, long currentTime, DrawingContext& dc) {
// ...
}
void changeAnimation(const EntityState::Id& stateId) {
currentAnimation = animationMap_[stateId];
}
private:
map<EntityState::Id, const Animation*> animationMap_;
const Animation* currentAnimation_;
};
現在のアプローチで本当に気に入らないことがあります... >:( EntityState::Id 部分。現在、EntityRepresentation は、保持する各アニメーションを特定の EntityState::Id にマップします。ID はすべてのクラスに固有です。これは EntityState から派生します (インスタンスではなく、クラスに固有です). これらの ID は基本的に、クラスのコンストラクターで手動で記述しなければならない文字列です。ゲームをスクリプト可能にします (Python)。
ID に関するこの問題を軽減する方法について、アドバイスをいただけないでしょうか。ID も使用するコンポーネント ベースのシステムの実装をゲームでたくさん見てきましたが、それでも好きではありません。それは私を間違った方法でこするだけです。
カプセル化を維持しながら、EntityRepresentation が EntityState の型を知る必要がないように、設計変更を提案できるかもしれません。