使相邻对象交互[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是一个类,我没有包括在这个代码片段中)
我试图让移动功能执行一些改变值在GameWorld
和MainMap
对象。我开始觉得我做错了,所以…
如果我想在InputHandler function
中已有的实例"GameWorld"answers"GameSystems"上运行一个方法,我该怎么做?
就像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);
}