2010-11-05 81 views
1

在大多數或所有面向對象的遊戲中,每個類不僅依賴於它自己的父類。這個類的連接是如何在C++中實現的?你只需要爲你需要的父類添加一個指針,或者有更好的方法嗎?oo遊戲的「概念」

例如一場足球比賽,當人員點擊它時,問場景課程他是否踢任何球,並且他是否隨後移動它。我希望這是可以理解的,不要太抽象。

回答

1

我不認爲在構造函數中傳遞父項是一個好主意。相反,您應該使用一個維護所有遊戲元素和設施之間交互的列表;例如,下面所示的遊戲類將檢查任何兩個玩家之間的碰撞,並且如果它被檢測到告訴他們每個人他們被擊中以及由誰擊中。

我不確定這是否會對您有所幫助,但我已將其輸入以供初始回覆,因此我不妨提交。請注意,如果您正在討論純文本遊戲,所有這些仍然是相關的,只是在這種情況下忽略對圖形的暗指。遊戲的設計是圍繞一個連續的遊戲循環,並且可以被認爲是非常簡單的:

while(true) 
    for each tick: 
     react to user input 
     update player, enemies, objects, etc. 
end while 

其中,「嘀」的比賽計時鐘的每一次迭代,但是你選擇來實現它 - 基於FPS ,每一秒,無論如何。在你的例子中,用戶點擊足球,遊戲看到點擊並告訴足球移動。要做到這一點很簡單,維護一個列表中維護狀態的所有遊戲元素。爲了說明,這裏是你可以實現這是一個非常基本的方法:設置傳入攬入motion--

class Game { 
    vector<GameElement> elements; 
Football football; 
Player currentPlayer; 

Game() { 
    this.football = new Football(); 
} 

    void update() { 
     for e in elements: 
      e.update(); 

     // Once every element has been updated for the current tick, redraw them on the screen 
     screen.redraw(); 
    } 
    void addElement(GameElement e) { 
     elements.add(e); 
    } 
} 

class GameElement { 
    int posx, posy;  // screen coordinates 
    void paint() {}; // method to draw this element to the screen 
    virtual void update(); 
} 

class Football: public GameElement { 
    bool kicked; 
    int anglex, angley; 
    double velocity; 

    void update() { 
     if(kicked){ 
      // update position, angle, velocity; slow it down, check for bounce, whatever 
      posx = new x position; 
      posy = new y position; 
     if(velocity == 0) 
      kicked = false;  
     } 
     paint(); // call the paint method after the new position has been found 
    } 
} 

假設有另一個類,從GameElement,播放器繼承,有一種方法踢(足球)即,set kicked = True。所以初始化遊戲,你會喜歡的東西將它設置:

Game game = Game(); 
game.add(new Football()); 
game.add(new Player()); 
while(true) { 
if(user_input==X) 
    game.currentPlayer.kick(football); 
    game.update(); 
    sleep(1); 
} 

可以改成維護,例如層,而不是整場比賽,再上一個臺階類可以調用每個更新按順序排列圖層,允許將事物塗在彼此之上,讓孩子只與兄弟姐妹互動。有很多可能性。

1

陶然成在撲克遊戲的工作類似的問題:這是我所採取的方式:

在你的榜樣,一個場景* the_scene添加到人的構造函數。然後,當人初始化時,傳遞一個指向場景的指針。既然你說父母和孩子,如果父母是場景,那麼它只會使用「this」,它會發送父母的地址。

然後,看起來好像你是這麼做的。還有一件事,如果你需要人與多於一個類不直接交互的類進行交互,你可以創建一些容器類來存儲指向它們的指針,並且只傳遞一個類來避免構造函數與參數太多。