使相邻对象交互[c#]

本文关键字:交互 对象 | 更新日期: 2023-09-27 18:16:27

我正在用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是一个类,我没有包括在这个代码片段中)

我试图让移动功能执行一些改变值在GameWorldMainMap对象。我开始觉得我做错了,所以…

如果我想在InputHandler function中已有的实例"GameWorld"answers"GameSystems"上运行一个方法,我该怎么做?

使相邻对象交互[c#]

就像Sami Kuhmonen说的,你代码中的问题是你不断地传递和重新分配你的对象,这些对象本质上应该是全局的。这不仅要求您将它们作为参数传递给任何需要它们的对象,而且还非常容易出错(正如您已经发现的)。

使用单例设计,而不是让这些对象表现得像实例对象。

这意味着这些对象不是实例成员,而是静态成员,它们代表一个全局对象,供其他所有对象访问。

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);
    }
}

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

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

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