我在寫遊戲,它將使用基於組件的實體系統。我正在實現的前兩個組件是EntityRepresentation和EntityState。該表示包含動畫,狀態決定實體如何對遊戲事件做出反應(EntityStates的例子:站立,跳躍,攻擊,死亡,墜落)。基於組件的遊戲實體和類型檢查
EntityRepresnetation根據Entity的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的每個類是唯一的(對於類是唯一的,而不是實例)。基本上是必須在類的構造函數中手寫的字符串,這意味着它們更容易發生名稱衝突—,因爲我打算讓遊戲可腳本化(Python)。
有人可以給我一些建議,關於如何我可以減輕我與ID的問題。我在遊戲中看到很多基於組件的系統的實現,這些遊戲也使用了ID,但我仍然不喜歡它們。它只是歪曲我的方式。
也許你可以建議一個設計更改,以便EntityRepresentation不必知道EntityState的類型,同時仍然保留封裝。
「取決於實體的狀態」 - 這是與EntityState相關的,或者例如到更廣義的國家? – 2011-06-16 12:35:06
@Luc在EntityState類上。 EntityState是所有狀態的基類。 EntityState有一個類型爲EntityState :: Id的字段(它只是一個字符串),對於每種類型的EntityState來說都是(應該是)唯一的。 – 2011-06-16 12:40:14