簡體   English   中英

Liskov替換原則和游戲的類設計

[英]Liskov Substitution Principle and class design for a game

在我的游戲中,我定義了一個Screen類,其中包含對可以繪制到顯示的許多可視Entity對象的引用:

class Screen {
public:

private:
  std::vector<Entity*> entities_;
};

所有Entity都有一個Draw()函數:

class Entity {
  public:
    void Draw();
  private:
    int xpos;
    int ypos;
};

Screen負責在每個Entity上調用Draw()函數。

問題是一些(但不是全部) Entity也需要更新,即隨着時間的推移它們將改變它們的外觀/位置。 Screen還需要調用Update()函數, 但僅適用於那些可更新的對象

我的問題是:

從具有Update函數的Entity派生類是否有意義:

class ChangingEntity : public Entity {
  public: 
     void Update(int time);
};

Screen看起來像這樣:

class Screen {
public:

private:
  std::vector<Entity*> entities_;
  std::vector<ChangingEntity*> changing_entities_;
};

如果我執行上述操作,那么我只為每個Entity調用Draw() ,並在每個ChangingEntity上調用Draw()Update()

或者 - 我應該只將Update()函數放在Entity ,如果Entity對象無法更新,那么Update()是否沒有實現?

你可以在這里增強一些東西;

最好不要讓實體自己繪制,使用單獨的Draw()函數或Drawable類( 單一責任原則 )。 在您當前的方法中,您正在創建任何需要繪制以擴展實體的類,下次您將發現一個類不需要是一個可繪制的實體。 所以使用單獨的繪圖功能。

其次你應該定義一個實體是什么,例如Ogre3D將實體定義為an instance of a discrete, movable object based on a Mesh ,我沒有看到你當前的定義是足夠的,它只包含位置和繪制函數。 您可以將實體定義為Updatable對象,另一個名為StaticEntity類不需要多態。 讓場景有兩個單獨的列表,實際上能夠更新對象,再次將渲染器與場景分開。

第三,您的Screen類應該被稱為Renderer並且具有可以根據其靜態類型進行渲染的對象。 您還可以使用Drawable界面。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM