让相邻的对象进行交互[C#]

时间:2016-11-06 05:20:16

标签: 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)并给出{{1} }。 (rkcPosition是一个我没有包含在此代码段中的类别)

我试图让Move功能对null ref exceptionGameWorld对象中的值执行一些更改。我开始认为我这样做是错的,所以...

如果我想在现有实例上运行方法&#34; GameWorld&#34;和#34; GameSystems&#34;来自MainMap,我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:0)

您不断重新定义覆盖成员变量的方法中的变量。当您的调试器显示ex.html时,GameWorld等为空,您正在尝试使用它们。我不知道它是如何进入MainMap的,因为成员变量Move()也将为空。

删除方法中变量的定义,这样你实际上是将对象存储在某个地方,而不是在方法结束后立即丢弃它们。例如:

GameSystems

答案 1 :(得分:0)

就像Sami 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);
    }
}