2016-08-25 20 views
0

我在努力使我的代碼更加面向對象。C++:事件序列不是很面向對象

我有一個小程序希望完成2個非常簡單的狀態:輸入狀態和結果狀態。

輸入狀態似乎很容易解決,因爲它雖然是圖形化的,卻是「自我更新」。用戶放棄精靈並將精靈移除到屏幕上以產生輸入。

結果狀態令人討厭,因爲我爲它製作了一些非常難看的代碼,這並不是面向對象的。

這種狀態是需要做的事情按順序和我正在努力找到如何完成對象的例子。它基本上是一些具有相同對象的動畫:這裏是一些僞代碼。

Static int objectx = 120, object y = 120; 
Static int state=0 

switch(state) 
{ 
Case 0: 
//....move object right 
//....once object is far enough right 
state = 1; 

Case 1: 
//....move object down 
//....once object is far enough down 
state = 2; 

...etc 

所以我猜它需要移動到某種狀態引擎,但我很努力地看到如何使用狀態完成順序事件。這些狀態總是相同的,所以可以進行硬編碼,它們不會根據給定的輸入而改變。

任何幫助將最感激地收到。

UPDATE

也許我們可以想想這第二個狀態作爲一個2D遊戲切場景。我們希望一個角色走到屏幕上,說點什麼,然後走開。

所以我現在做的方式是通過switch語句管理這部分程序狀態。每次我們進入程序的「結果」部分時都會調用這個函數,我們使用switch語句來更新我們精靈的位置。一旦我們到達第一組運動的末尾,我們就轉到下一個開關語句,並繼續這樣做直到它完成。它工程但我希望能使用「遊戲狀態」類,它可以取得圖形和聲音的所有權,並適當地移動東西。

+0

「我正在努力使我的代碼更加面向對象。」 - 在1995年,在E3宣佈這個名爲「Java」的新事物之後,每個人都是這樣。 「超過18個gazillion不同的整數,你永遠無法探索它們,每個班都不同,以光速執行你的代碼。」 –

+0

你需要重構你的代碼,而不是隻是跳到「面向對象的編程訓練」,直到它被重構。除非我們看到你沒有發佈的功能中常見的東西,否則這就是所有可以說的。 – PaulMcKenzie

回答

1

注意:在這裏做一些假設是因爲我沒有任何上下文。

聽起來像每個精靈都應該有自己的循環,而不是整個遊戲邏輯移動的精靈。 適應到面向對象的設計,這一點,你可以在一些 類包裝每個精靈:

class NPC : Sprite { 
    private: 
     Position CurrentPosition; 
     int CurrentState; 

    public: 
     virtual void Think() = 0; 
     virtual void Render() = 0; 
}; 

然後你可以從該類繼承的特定精靈:

class GobbledyGook : NPC { 
    private: 
     const int FinalState = 10; 

    public:   
     bool Completed = false; 

     void Think() override { 
      if(Completed) 
       return; 

      switch(CurrentState) { 
       // ... repeating logic here ... 
      } 

      CurrentState++; 

      if(CurrentState == FinalState) 
       Completed = true; 
     } 

     void Render() override { 
      // ... draw the sprite ... 
     } 
} 

從主遊戲邏輯然後您可以更新每一個角色:

// Spawn a GobbledyGook into existence. 
my_npcs.insert(new GobbledyGook()); 

// In frame logic. 
bool finished = true; 
for(NPC* n : my_npcs) 
{ 
    n->Think(); 
    if(!n->Completed) 
     finished = false; 
} 

if(finished) { 
    // Result state. 
} 

// In render logic. 
for(NPC* n : my_npcs) 
{ 
    n->Render(); 
} 

可以自然地採用這樣的邏輯對於整個場面太:

class Intro : Cutscene { 
    private: 
     vector<NPC*> SceneSprites; 

    public: 
     void Think() override { 
      switch(CurrentState) { 
       ... 
      } 

      for(NPC* n : SceneSprites) { 
       n->Think(); 
      } 
     } 

     ... 
}; 

至於你是否應該刪除或改變使用狀態,你打算從這樣做中獲得什麼?

在不瞭解當前方法的所有缺陷的情況下,很難推薦不同的方法。

+0

這是我開始的好地方。感謝您花時間打破這一切並寫出來,我非常感謝。我確信我可以根據自己的需要調整這種方法。 –