2009-10-24 79 views
2

我已經使用C++編程了一段時間,並且我非常熟悉語法。我正在嘗試使用Allegro製作紙牌遊戲。我明白我需要爲遊戲邏輯做的一切,而不是。讓我感到困惑的是如何推動遊戲。我是基於循環的應用程序的新手。我習慣了VB.Net中基於事件的編程。我只是不確定正確的方式,例如切換球員並在沒有很多ifs和bools的情況下舉起「事件」。此外,我現在有一個布爾數組來檢查哪個牌正在玩。而且我的遊戲每次都會遍歷整個布爾數組,這對我來說似乎很混亂。另外,如果我想從我的菜單循環到我的設置循環,那麼沒有一個大布爾怎麼做呢? 謝謝遊戲編程結構

+1

什麼是大布爾? 「長長的布爾」? ;) – 2009-10-24 23:29:46

回答

5

大多數遊戲框架都提供了你需要實現(兩者都被稱爲一個循環)兩種方法:

  • 更新
  • 繪製

Update是你應該把所有的東西,它應該檢查用戶輸入,狀態的變化,時間間隔的行動等。例如,物理,Butto nPressed等等。沒有什麼能阻止你在這裏處理事件(看看BoostLibrary Signals)。

void Game::update() { 
    if(pushedButton) { 
     this->cardsOnTable->add(this->hand->remove(0)); 
     this->activePlayer = nextPlayer(); 
    } 
} 

Draw應該只顯示屏幕上當前的基礎狀態。所以你必須確保你的基礎狀態/模型很容易訪問。

void Game::render() { 
    this->table->render(); 
    this->cardsOnTable->render(); 
    this->hand->render(); 
    // ... 
    flipBuffers(); 
} 

可以解決你的菜單/ SettingsMenu問題與ScenesSceneManager(可以是一個Stack)。因此,不要直接將邏輯放入Game,而要將其放入Scenes。您還可以在管理器中推送/彈出場景。

void Game::update() { 
    this->sceneManager->activeScene->update(); 
} 

void MenuScene::update() { 
    if(settingsMenuItemSelected) { 
    game->sceneManager->push(new SettingsMenuScene)); 
    // now the next time Game::update() is called 
    // the active scene of the SceneManager will be 
    // the settings menu. And once it is closed/cancelled 
    // it will pop itself from the manager and we are back 
    // in the regular menu 
    } 
} 

如果你想開始更先進的東西,你可以嘗試「事件」存儲到一個巨大的名單,當你進入Game::update方法解僱所有事件 - 這是VB如何可以確保您能」從另一個線程修改控件而不是UI線程 - 但我不認爲這是你會用C++做的事情。

0

這些是很多不同的問題。我的第一個建議是尋找類似遊戲的在線源代碼。如果您需要代碼幫助,請將其與問題一起發佈。

0

你很可能需要有一堆的IFS和循環會是這樣的:

while(1){ 
    initYourLevel(); 
    while(levelNotOver){ 
    //do things 
    } 
} 

然後這一切都取決於你想要做什麼,你的問題是一種模糊的給我。開始尋找tutorials來圍繞人們如何做事。這裏有很多示例代碼!

希望幫助

2

一般來說,你可能想看一本關於編程習語和設計模式的書,這裏已經討論過其他問題。即使不與遊戲直接相關,他們也會幫助你。

遊戲引擎是狀態機的一個很好的例子(狀態在遊戲中,狀態在設置和子狀態) - 你可以通過條件分支等方式來完成。,但是如果它變得更大,就不要失去理智。在基於模板的多態類(請參閱您最喜歡的C++模式手冊),基於模板的(boost.statechart),...
有什麼常見的是,使用中央循環時,您轉發事件到一些處理程序(代表狀態或子狀態),這些處理程序將執行適合當前情況的處理程序。需要改變行爲(例如從遊戲到選項)?切換處理程序。您還需要包裝和抽象當前的遊戲狀態 - 不需要顯式處理例如遊戲狀態。卡在每個地方。將物品包裹在例如一個內部處理它的卡牌或球員管理員。
也可以使用容器和算法C++免費給你,你可以例如管理std::map s或std::set s的卡或玩家。當你達到標準庫的限制時,檢查一下提升。