Пустая ссылка исключение получает значение из базового класса - PullRequest
0 голосов
/ 15 ноября 2011

У меня есть небольшой движок (определенный как public class ScreenManager : DrawableGameComponent) для управления вводом и экранами (с переходами и т. Д.), Который работает с public abstract class GameScreen.Для экранов меню у меня есть abstract class MenuScreen : GameScreen.Я пытаюсь получить из class OptionsMenuScreen : MenuScreen значение, хранящееся в основном классе игры (тот, который вызывается Program.cs), но я всегда получаю исключение NullReferenceException.Мне нужно это значение, потому что при запуске приложения мне нужно получить некоторые параметры, и эти параметры можно изменить из OptionsMenuScreen, но я хочу, чтобы изменения с этого экрана автоматически отражались на остальной части приложения, поэтому экран может основывать свои вычисления на этом значениибез необходимости перезагружать все приложение, чтобы значения в основном классе обновлялись.Я делаю это с

public ScreenManager ScreenManager
{
    get { return screenManager; }
    internal set { screenManager = value; }
}

ScreenManager screenManager;

в GameScreen.cs и

/// <summary>
/// Adds a new screen to the screen manager.
/// </summary>
public void AddScreen(GameScreen screen, PlayerIndex? controllingPlayer)
{
    screen.ControllingPlayer = controllingPlayer;
    screen.ScreenManager = this;
    screen.IsExiting = false;

    // If we have a graphics device, tell the screen to load content.
    if (isInitialized)
    {
        screen.LoadContent();
    }

    screens.Add(screen);

    // update the TouchPanel to respond to gestures this screen is interested in
    TouchPanel.EnabledGestures = screen.EnabledGestures;
}

в качестве метода добавления экрана в список экранов ScreenManager.Но когда я пытаюсь сделать что-то вроде

separateAxis = (ScreenManager.GameInstance as Main).SeparateAxis;

, я всегда получаю NullReferenceException.Несмотря на то, что он работает с других экранов (производных непосредственно от GameScreen, а не MenuScreen).

Есть идеи?

1 Ответ

1 голос
/ 15 ноября 2011

В вашем коде есть 2 позиции, либо ScreenManager равно нулю, либо (ScreenManager.GameInstance as Main) равно.


Для первого случая:

Я думаю, что вы звонитеСтрока проблемы изнутри в конструкторе экрана параметров или, по крайней мере, до вызова метода AddScreen диспетчера экрана.

Переместите его в метод LoadContent экрана.

Для второго случая:

Убедитесь, что GameInstance является экземпляром Main.


Стоит отметить, что это пример GameStateManagement , на котором вы основываете свой код.

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