2011-03-23 23 views
3

我是一個自學成才的Java程序員,所以我不知道正確的方式做的事情很多。什麼是存儲在一個先進的java遊戲全局/靜態變量的最佳方式?

我已經寫了幾個簡單的遊戲(如小行星,蛇,等。),所以我知道該怎麼做的基本知識。現在我正在研究一個更復雜的遊戲,一個有殭屍的角色扮演遊戲。我開始寫這篇文章時沒有考慮到我將如何構造它。首先,我製作了一個'物品'類來保存一個簡單物品的數據(價值,重量,傷害)。然後我製作了一個課程來保存玩家的變量(生命值,裝甲值,物品)。我最終創建了菜單,它自己需要變量來保存當前正在選擇的菜單項。

我很快意識到,我有我需要以某種方式保存全局變量很大。我需要在單獨的類中使用變量(例如打印到屏幕的類必須知道所有內容的位置)。

那麼,什麼是寫全局變量的一個大的量的最佳方法?就像我說的,我不知道正確的方式做事情,我無法找到一個很好的網站,說明大規模變量聲明。我會做一個擁有所有變量的類,並讓'Main'類有一個'VariableStorage'類的靜態聲明?

在此先感謝!

P.S.如果可以,請提供鏈接! :d

回答

8

經常使用靜態字段是有原因的,原因是靜態字段比非靜態字段更不靈活,因爲只能有一個靜態字段的副本,而非靜態字段字段可以爲每個對象實例保存不同的值。

通過使用靜態字段,你是限制自己永遠只能有一名球員。如果你想要做多人遊戲模式,你不能 - 如果沒有重寫那麼多。

這通常做的方法是這樣的:

class Player { 
    String name; 
    Location loc; 
    List<Item> inventory; 

    void pickup() { 
     if (itemsOnGround.isEmpty()) { 
      throw new InvalidActionException("There appears to be nothing to pick up here"); 
     } 
     inventory.add(loc.itemsOnGround.get(0)); 
     loc.itemsOnGround.remove(0); 
    } 
} 

class Location { 
    List<Items> itemsOnGround; 

    /** null if there isn't a monster here */ 
    Monster monster; 
} 

class Game { 
    Player player; 
} 

class Ui { 
    Game game; 

    void keypressed(char key) { 
     try { 
      if (key == 'p') { 
       game.player.pickup(); 
      } else { 
       showKeyboardHelp(); 
      } 
     } catch (InvalidActionException e) { 
      showErrorMessage(e.getMessage()); 
     } 
    } 
} 

正如你所看到的,連一個靜態字段被發現。這使您可以切換遊戲,無需重新啓動應用程序(只覆蓋所有靜態字段是很容易出錯 - ?如果你忘記一個人應該具有獲得玩家yendor的護身符在之前的比賽確實結轉),同時允許您創建附加物品,玩家(或角色扮演者角色,通常稱爲RPG術語中的NPC),並且仍然允許您將相關字段邏輯地分組到類中,以便在從現在起數月後再次查看代碼時再次找到它們。

如果你的遊戲變得不平凡的你也應該考慮封裝。我通常是在小項目中使用的策略是,字段可能只能通過代碼在聲明它們的類寫入,但整個程序中讀取。在一個較大的項目,特別是當它涉及到幾個人,你可能會想,編譯器執行的是通過使私人領域,並通過公開方式訪問他們的狀態(通常被稱爲「干將」)爲目的編寫的。

+1

謝謝!代碼對我非常有幫助! :D你是一個很棒的程序員!我將用這個結構來製作我的遊戲。當我進一步下調生產時,請讓我知道它的進展情況如何? – 2011-03-23 02:29:10

1

沒有一個答案,可以給出。在一般情況下,「大量的全局變量」是一個反模式 - 誰也不需要知道的一切的位置不應該是能 - 這樣你的那部分代碼不能搞砸了。因此,請一個案例。

您需要一種方法來了解所有對象的位置?例如,有一個名爲ObjectMap的類,並將所有位置放在那裏。

話又說回來,你總是可以有類似

public class Everything { 
    public static HashMap<Object, Object> everythingHolder = new HashMap<Object, Object>(); 
} 

,但如果你沿着這些路線走,你的代碼很快就會變得難以維護。

+1

我會盡可能地說,它不可維護*立即*。將位置存儲爲項目的一個字段而不是地圖會不會更加地道?玩家庫存中物品的位置是多少?每當玩家移動時都需要更新嗎? – meriton 2011-03-23 01:54:44

+0

當然,對象的位置應該與對象一起存儲。我建議使用地圖作爲將所有對象位置感興趣的對象組合在一起的方式 – iluxa 2011-03-23 01:57:08

1

老實說,我會做的類結構進行徹底的檢查,看是否有更好的設計比把一切都全球。像MVC使用範例真的可以簡化您的代碼組織。我不知道你的具體需求是什麼,但通常一個好的設計可以讓你訪問一個簡單的方法所需要的數據。

//A possible heirarchy 
PlayableCharacter 
|-Stats 
| |-int totalHealth 
| |-int currentHealth 
| |-int speed 
| \-int strength 
| 
|-List<Equipment> inventory 
|-Helmet head //Helmet would be a subclass of Equipment 
|-HandEquipment leftHand 
|-HandEquipment rightHand 
|-ChestEquipment torso 
\-LegEquipment legs 

由於組織結構既符合您的需求,又是遊戲世界的良好抽象,訪問您的變量將變得簡單而有意義。

public int getAttackLevel() { 
    return leftHand.getAttackPoints() + 
     rightHand.getAttackPoints() + 
     stats.getStrength(); 
} 

如果發現,有一些全局變量是不可避免的,我會再次嘗試組織他們以有意義的方式。

GameVariables 
|-LocationVariables 
| |-int worldX 
| |-int worldY 
| \-int worldZ 
| 
|-QuestVariables 
| |-String questName 
| \-double questProgress 
| 
|-GameSettings 
| |-int resolutionX 
| |-int resolutionY 
| \-Difficulty difficultyLevel 
| 
| //And so on.... 
相關問題