2016-11-06 14 views
0

私はC#で基本的なゲームをしていますが、解決できない問題が発生しています。 - それは私が(rkcPosition/w)が含まれるコードの最後の行を強調表示するためにジャンプしています隣のオブジェクトとのやり取り[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を呼び出すようにしようと一部である:ここで(関連)コードですnull ref exception。 (rkcPositionはこのコードスニペットに含まれていないクラスです)

GameWorldオブジェクトとMainMapオブジェクト内の値にいくつかの変更を実行させようとしています。私はこれがすべて間違っていると思っています。

InputHandler functionの既存のインスタンス「GameWorld」と「GameSystems」でメソッドを実行するにはどうすればよいでしょうか?

答えて

0

は、あなたのコード内の問題は、常に周りに渡すと、本質的にグローバルなことになっている、あなたのオブジェクトを再割り当てされていることです。これは、それらを必要とするものにパラメータとして渡す必要があるだけでなく、(あなたが発見したように)非常にエラーを起こしやすいです。

これらのオブジェクトをインスタンスオブジェクトのように動作させる代わりに、シングルトンデザインを使用します。

これは、インスタンスメンバーの代わりに、これらのオブジェクトがアクセスする他のすべてのオブジェクトに対して単一のグローバルオブジェクトを表す静的メンバーであることを意味します。

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

メンバ変数をオーバーライドするメソッドの中で変数を常に再定義しています。あなたのデバッガはGameWorldと表示されているので、MainMapなどはnullであり、それらを使用しようとしています。メンバー変数GameSystemsもnullになるため、Move()にどのように行くのかわかりません。

メソッド内の変数の定義を削除します。つまり、メソッドを終了した直後にオブジェクトをどこかに格納していなくてもすぐに削除します。たとえば:サミKuhmonenが言ったように

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

私はすべてが間違っていると考えました。したがって、クラスインスタンス内にデータが格納されていて、メソッドを使用してそのデータを操作したい場合、そのオブジェクトを適切に送信して操作するにはどうすればよいですか?たとえば、CharacterObjectには整数Xが含まれています。現在の値は「4」です。私はそれをそのまま "5"に変更する関数に送信したいと思います。 – user1002617

+0

@ user1002617 "送信"という意味に依存します。メソッド変数でクラス変数を隠すよりも、コードに間違ったことはありません。これは、私が示した方法で修正することができます。 –

関連する問題