我是这个网站的新手,也是编程新手。我最近一直在努力学习新的技能,以帮助更好地组织/管理我的代码,使其更有效,可读和包含。
好吧,我不会继续这么做,我遇到的问题是在XNA 3.1中,我正在使用C#express 08。
我有一个名为InputHandler的自包含游戏组件,更新在基本循环(Game1)之后循环,到目前为止只检查键盘输入并将结果存储到KeyboardState的实例中 - 它具有Get属性,唯一的其他代码实际上是按下Escape键退出Game1,它会在存储输入后检查。
代码:
private KeyboardState keyboardstate;
public KeyboardState Keyboard_State
{
get { return (keyboardstate); }
}
public override void Update(GameTime gameTime)
{
keyboardstate = Keyboard.GetState();
if (keyboardstate.IsKeyDown(Keys.Escape))
Game.Exit();
base.Update(gameTime);
}
转移问题,另一个名为Camera的游戏组件尝试通过IInputHandler的实例访问InputHandler的Keyboard_State属性(这是一个接口btw)
public interface IInputHandler
{
KeyboardState Keyboard_State { get; }
}
不用说,这个接口是在InputHandler组件中实现的。转到错误,我在Camera组件的更新循环中有一些逻辑代码,它试图通过接口访问Keyboard_State属性,检查某些条件,然后适当地改变相机。
private IInputHandler input;
以下代码位于相机组件内的虚拟更新循环内。
if (input.Keyboard_State !=null)
{
if (input.Keyboard_State.IsKeyDown(Keys.Left))
cameraYaw += spinRate;
if (input.Keyboard_State.IsKeyDown(Keys.Right))
cameraYaw -= spinRate;
if (cameraYaw > 360)
cameraYaw -= 360;
else if (cameraYaw < 360)
cameraYaw += 360;
}
我在* if(input.Keyboard_State!= null)*行得到一个Null引用异常,抱怨它不是一个实例。
我是Interfaces的新手,我以前从未见过很多用途,直到我开始尝试学习XNA,并开始学习配件,最终我想创建管理3D的基本组件游戏(没什么特别的,有组织的,可管理的)。
任何帮助将不胜感激。谢谢:))
*其他信息*
我的相机构造是:
public Camera(Game game)
: base(game)
{
graphics = (GraphicsDeviceManager)Game.Services.GetService(typeof(IGraphicsDeviceManager));
input = (IInputHandler)game.Services.GetService(typeof(IInputHandler));
}
我的InputHandler构造函数为空,我的Game1构造函数是:
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
camera = new Camera(this);
Components.Add(camera);
input = new InputHandler(this);
Components.Add(input);
input.UpdateOrder = 0;
camera.UpdateOrder = 1;
// this component alows Asyncroniously save/load game.
Components.Add(new GamerServicesComponent(this));
#if DEBUG
fps = new FPS(this);
Components.Add(fps);
fps.UpdateOrder = 1;
camera.UpdateOrder = 2;
#endif
}
input是Input handler game组件的一个实例。
private InputHandler input;
希望这有助于:)
答案 0 :(得分:0)
在我看来,你没有在相机的任何地方初始化“输入”变量(=输入为空)。
因此,if (input.Keyboard_State !=null)
-line抛出NullReferenceException(并且通过KeyboardState是一个结构,因此它不能为null)。你说InputHandler和Camera都是游戏组件吗?尝试做这样的事情:
在InputHandler构造函数中:
public InputHandler(...)
{
// Your initialization code here
this.Game.Services.AddService(typeof(IInputHandler), this);
}
在Camera构造函数中:
public Camera(...)
{
// Your initialization code here
input = this.Game.Services.GetService(typeof(IInputHandler)) as IInputHandler;
}
编辑,更新代码:
将您的游戏构造函数更改为:
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
input = new InputHandler(this);
Components.Add(input);
Services.AddService(typeof(IInputHandler), input);
camera = new Camera(this);
Components.Add(camera);
input.UpdateOrder = 0;
camera.UpdateOrder = 1;
// this component alows Asyncroniously save/load game.
Components.Add(new GamerServicesComponent(this));
#if DEBUG
fps = new FPS(this);
Components.Add(fps);
fps.UpdateOrder = 1;
camera.UpdateOrder = 2;
#endif
}