interface - 抛出null异常

时间:2012-03-24 17:51:19

标签: c# xna

我是这个网站的新手,也是编程新手。我最近一直在努力学习新的技能,以帮助更好地组织/管理我的代码,使其更有效,可读和包含。

好吧,我不会继续这么做,我遇到的问题是在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;

希望这有助于:)

1 个答案:

答案 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

    }