интерфейс - пустое исключение - PullRequest
1 голос
/ 24 марта 2012

я и новичок в этом сайте и новичок в программировании Недавно я пытался освоить новые навыки, которые помогут лучше организовать / управлять моим кодом и сделать его более эффективным, читаемым и содержательным.

Хорошо, я не буду слишком много говорить об этом, у меня проблема в XNA 3.1, я использую C # express 08.

У меня есть автономный компонент Game под названием InputHandler, обновление проходит после базового цикла (Game1), который до сих пор просто проверяет ввод с клавиатуры и сохраняет результат в экземпляре KeyboardState, который имеет свойство Get, единственное другое на самом деле код выходит из Game1, если нажата клавиша Escape, которую он проверяет после сохранения ввода.

Код:

        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 пытается получить доступ к свойству Keyboard_State InputHandler через экземпляр IInputHandler (кстати, это интерфейс)

    public interface IInputHandler
    {
        KeyboardState Keyboard_State { get; }
    }

Само собой разумеется, что этот интерфейс реализован в компоненте InputHandler. Переходя к ошибке, у меня в цикле обновления внутри компонента Camera есть некоторый логический код, который пытается получить доступ к свойству Keyboard_State через интерфейс, проверить некоторые условия и затем соответствующим образом изменить камеру.

            private IInputHandler input;

следующий код находится в цикле обновления void .. в компоненте Camera.

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

Я получаю исключительную ссылку Null в строке * if (input.Keyboard_State! = Null) *, жалуясь, что это не экземпляр.

Я новичок в области интерфейсов, в прошлом я никогда не видел для них особой пользы, пока не начал пытаться изучать 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 input.

         private InputHandler input;

надеюсь, это поможет:)

1 Ответ

0 голосов
/ 24 марта 2012

Мне кажется, что вы нигде не инициализируете переменную "input" в камере (= input имеет значение null).

Из-за этого if (input.Keyboard_State !=null) -line генерирует исключение NullReferenceException (и, кстати, KeyboardState является структурой, поэтому она не может быть нулевой). Вы сказали, что и 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;
}

РЕДАКТИРОВАТЬ, Обновленный код:

Измените свой Game-конструктор на это:

  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

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...