2011-06-12 61 views
1

我使用C++和OpenGL使用Visual Express 2010製作Pong。它是我製作的第一款遊戲之一,我想知道如何最好地構建它。擊敗我的主要部分是遊戲菜單。我應該把不同的遊戲模式放在不同的功能中,並且在我的主要功能中有一個開關?例如,在Main.cpp的,我將包括線SONG PONG

glutDisplayFunction(maincode) 

在另一文件中,我將定義maincode作爲像這樣(再次,僞碼):

maincode(): 
    switch m: 
     case 1: 
      singleplayer = true 
      multiplayer = false 
      menu = false 
     case 2: 
      singleplayer = false 
      multiplayer = true 
      menu = false 
     case 3: 
      singleplayer = false 
      multiplayer = false 
      menu = true 

我會然後,在每個文件,檢查單人,多人和菜單的值,以確定我在哪個模式,然後相應地顯示代碼。

但是,當遊戲變得更加複雜時,我覺得這種方法會變得複雜得多,所以我不認爲這是做到這一點的正確方法。

我該如何構建遊戲和菜單?

P.S.我是一名C++程序員,但我只是沒有編程經驗。

+2

這個問題的範圍很廣。我建議讀一本關於遊戲編程的書。 – 2011-06-12 17:50:14

+0

一個人不能同時擁有單人遊戲和多人遊戲,所以他們是互斥的。保持一個'multiplayer',如果它是'true',遊戲模式multiplater,如果它是'false'則是單人遊戲。 – phoxis 2011-06-12 17:50:59

回答

4

這只是有3角不同的bool秒(共8個不同的國家,其中3個是有效的),當你需要的唯一信息是您當前所處的模式不必要的複雜性。

更好地利用枚舉,即

enum GameMode { 

    GM_SinglePlayer, GM_Multiplayer, GM_Menu 

}; 

GameMode類型的單個變量:

GameMode mode; 
mode = GM_Menu; 

具有不同,互斥(這就是你錯過的地方!)之間切換是編程中的一個重要概念,所以你肯定是在正確的軌道上。繼續工作。

+0

我明白你在說什麼(枚舉是一個更好的方法,我不能相信我從來沒有想到這一點!),但我想知道這種方法是否是健全的。 – 2011-06-12 17:58:00

+0

這是常見的做法(特別是對於像Pong這樣的小遊戲)讓遊戲狀態像這樣構建。通常有一個主循環根據當前狀態將工作分派到菜單或遊戲邏輯。所以你做得很好。 – 2011-06-12 17:59:27

+0

好的。非常感謝,這清除了一切! – 2011-06-12 18:00:24

0

組織GUI應用程序的最佳方式是使用MVC design pattern。要麼,要麼是小修改presenter first

知道的是,這些問題的答案爲您簡單回答(亞歷山大·蓋斯勒的答案是相當確定)

0

glutDisplayFunc()是顯示的東西的快捷方式,但它很快變得更爲麻煩比它寫一個簡單的項目時的價值。

除非你是多線程的,並且爲glutDisplayFunc()保存一個不變的遊戲狀態副本,否則我會避免使用它 - 甚至可能也是如此。

對於遊戲循環,我相信最好是駕駛OpenGL而不是讓它駕駛。

enum EMode { ...etc }; 

EMode menu(); 
void single(); 
void multi(); 

int main() 
    { 
    init(...); 
    bool loop = true; 
    while(loop) 
     { 
     switch(menu()) 
      { 
      case EMode.single: 
       game_loop(1); 
       break; 
      case EMode.multi: 
       game_loop(2); 
       break; 
      case quit: 
       loop = false; 
      ...etc 
      } 
     } 
    finish(...); 
    return 0; 
    } 

簡單的菜單循環。 (原諒我的代碼風格與平時不同)。
這不是一個很好的佈局,但它可以用於一個簡單的遊戲。

  • init()初始化openGL。
  • menu(),single()multi()每個都有自己的循環,它們手動渲染和交換緩衝區。
  • menu()返回一個值,指定選擇哪個菜單項。


運行在恆定的速度和不浪費CPU

遊戲循環。

void game_loop(int players) 
    { 
    CGame game = new Game(players); 
    bool loop = true; 
    time_type next_frame = get_time() - 1; 
    while(loop) 
     { 
     time_type time = get_time(); 
     if(time > next_frame) 
      { 
      do_input(game); 
      while(time > next_frame) 
       { 
       game.tick(); 
       next_frame += frame_period; 
       } 
      do_render(game); // draw stuff here, and swap buffers. 
      } 
     else 
      { 
      // Don't waste CPU (optional). 
      wait_till(next_frame); 
      } 
     } 
    } 

再次,不是很好,但功能不夠。 (我使用這樣的東西)。

  • CGame是遊戲類(如果你想成爲OO)。

  • get_time(),wait_till(),time_type等全部組成。使用任何功能/類型適合。

快速和我的頭頂 - 可能甚至有一些錯誤 - 但它可以給你一個想法。