2016-11-06 59 views
0

我正在做一個基本的C#遊戲,而且我遇到了一個我無法解決的問題。這裏的(相關)代碼:獲取相鄰對象進行交互[C#]

public class GameManager 
    { 
     public GameMap MainMap; 
     public EntityManager GameWorld; 
     public SystemManager GameSystems; 

     public GameManager() 
     { 
      EntityManager GameWorld = new EntityManager(); 
      SystemManager GameSystems = new SystemManager(); 
      GameMap MainMap = new GameMap(61, 41); 
     } 

     public void InputHandler(string Trigger) 
     { 
      switch (Trigger) 
      { 
       case "north": 
        GameSystems.Move(GameWorld, MainMap, 0, 8); 
        break; 
       //etc 
      } 
     } 
    } 

    public class SystemManager 
    { 
     public rkcPosition _position; 

     public SystemManager() 
     { 
     } 

     public bool Move(EntityManager TargetWorld, GameMap TargetMap, int TargetID, int TargetDirection) 
     { 
      rkcPosition _position = TargetWorld.GetPosition(TargetID); 
      // here, GetPosition returns an instance of rkcPosition 
      // pulled from a List<rkcPosition> - this seems to be the problem point 
     } 
    } 

我得到的問題是,我嘗試調用GameSystems.Move的一部分 - 它跳轉到突出我包括代碼的最後一行(W/rkcPosition),並給出了一個null ref exception。 (rkcPosition是我沒有包含在此代碼段中的類)

我試圖讓Move函數對GameWorldMainMap對象中的值執行一些更改。我開始認爲我這樣做都是錯誤的,所以...

如果我想在我的現有實例「GameWorld」和「GameSystems」上運行InputHandler function,我該如何正確執行此操作?

回答

0

像薩米Kuhmonen說,在你的代碼的問題是,你經常路過周圍,重新分配你的對象基本上應該是全球性的。這不僅要求你將它們作爲參數傳遞給任何需要它們的參數,它也非常容易出錯(正如你發現的那樣)。

不是讓這些對象像實例對象一樣工作,而是利用Singleton設計。

這意味着,這些對象不是實例成員,而是靜態成員,它們代表訪問其他任何內容的單個全局對象。

public class GameManager 
{ 
    public static GameMap MainMap; 
    public static EntityManager GameWorld; 
    public static SystemManager GameSystems; 

    static GameManager() 
    { 
     GameWorld = new EntityManager(); 
     GameSystems = new SystemManager(); 
     MainMap = new GameMap(61, 41); 
    } 

    //... 
} 

現在在其他類中,不必擔心傳遞的是正確的對象,只需從GameManager中引用這些單例即可。

public class SystemManager 
{ 
    public rkcPosition _position; 

    //... 

    public bool Move(int TargetID, int TargetDirection) 
    { 
     rkcPosition _position = GameManager.MainMap.GetPosition(TargetID); 
    } 
} 
0

您不斷重新定義重寫成員變量的方法內的變量。由於你的調試器顯示GameWorldMainMap等是空的,你試圖使用它們。因爲成員變量GameSystems也將爲空,所以我不知道它如何變爲Move()

刪除方法內變量的定義,這樣你實際上將對象存儲在某個地方,而不是在方法結束後立即丟棄它們。例如:

public GameManager() 
{ 
    GameWorld = new EntityManager(); 
    GameSystems = new SystemManager(); 
    MainMap = new GameMap(61, 41); 
} 
+0

我想我做的一切都是錯的。因此,如果我有一個存儲數據的類實例,並且我想使用一種方法對這些數據進行操作,那麼我該如何恰當地發送該對象以進行操作?例如,CharacterObject包含當前爲「4」的整數X.我想將它發送到一個函數,它會將其更改爲「5」,否則保持原樣。 – user1002617

+0

@ user1002617取決於「發送」的含義。你的代碼沒有任何問題比用方法變量隱藏類變量,並且可以按我的方式修復。 –