2014-05-21 69 views
1

這可能會是一個非常廣泛的問題,但我想知道什麼是在Java中使用多個狀態來構造和設計遊戲的最佳方法。遊戲架構和狀態設計

我已經開始設計一個具有多個狀態的戰艦遊戲(AI vs AI,Human vs Human等)。

它看起來像這樣:

Imgur

不幸的是,我的代碼已經變得非常混亂和混亂,由於處於邏輯和資源的多重變化的遊戲需要。我想找到一種更好的方式來清理我的代碼,並以易於維護且不復雜的方式組織它。

那麼對於像這樣的遊戲來說,保持良好設計的最佳方法是什麼?

+1

A [Model-view-controller](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)是我的主要建議,這樣你可以分開個人對可插拔責任領域的要求,並輕鬆地進行互換。例如,每個狀態的視圖不應該真正改變,但數據的模型方式可能和程序的控制方式將會...例如... ps - 漂亮的空間屏幕;) – MadProgrammer

+0

我的代碼基於模型 - 視圖 - 控制器,但一切似乎都非常骯髒和混亂。從狀態轉換到另一個狀態需要從一個面板切換到另一個面板,並根據它所處的遊戲狀態加載不同的邏輯。我正在尋找一種方式來更好地組織州內不同的邏輯和資源,例如在國家設計模式。 –

+1

更改狀態,假設主視圖不會更改,只需要更改模型和控制器即可。沒有看到你的代碼,很難100%確定,但從菜單切換到遊戲狀態可能需要你通過「設置」狀態才能建立所需的模型/控制器。同樣,這只是另一個MVC狀態,因爲每個「遊戲狀態」應該是它自己的MVC,其中主遊戲是另一個MVC ...... – MadProgrammer

回答

1

您可以同時使用inheritancecomposition來解決此問題。我假設你有一個主要的遊戲類或級別類,你想要存儲這些數據。你可能想要創建一個名爲GameState的接口,並創建所有的子類(AI vs AI,Human vs Human等... )。然後添加一個變量到你的關卡類:

class MainGame{ 
    GameState state; 

    public MainGame(){ 
     state = new HumanVsHumanState(); 
    } 
    public void update(){ 
     state.update(); 
    } 
    //etc... 
} 
0

我特別喜歡FlashPunk 2D遊戲引擎提供的抽象。在此框架內,你可以找出以下抽象:

  • 上下文(用於訪問全局屬性和功能的靜態類)
  • 發動機(主遊戲類)
  • 世界(每個可能的狀態遊戲
  • 實體(每個世界中的對象)

在此之後的),代碼應該是這樣的:

class MyGame extends Engine { 
    MyGame() { 
     // Here we code high level setup 
     Context.world = new MenuWorld() 
    } 
} 

class MenuWorld extends World { 
    MenuWorld() { 
     // Here we add the elements of the menu 
     this.add(new CompCompButton()); 
     this.add(new HumanHumanButton()); 
    } 
} 

class CompCompButton extends Entity { 
    CompCompButton() { 
     // Here we setup button properties 
    } 

    // This is a callback function that is automatically called by the framework. 
    void Update() { 
     if (Input.mousePressed()) { 
      onClick(); 
     } 
    } 

    void onClick() { 
     Context.world = new CompCompWorld(); 
    } 
} 

請注意使用靜態Context類。這個類應該實現渲染新世界的所有邏輯。

HumanHumanButton類的實現基本上與CompCompButton類相同。唯一的區別是,onClick函數現在將當前世界改爲HumanHumanWorld。實際上,您可以實現一個通用的Button類,然後對其進行擴展以實現更簡潔的代碼。

您可以在其網站上閱讀更多關於FlashPunk的內容。這也是值得去尋找Java遊戲引擎的,還有一種叫做LWJGL,雖然我沒有用過它,但我什麼都不知道。

希望有所幫助。