我有一个小引擎(定义为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)。
有什么想法吗?
答案 0 :(得分:1)
您的代码中有2个posibilies,ScreenManager
为空,或(ScreenManager.GameInstance as Main)
为。
我认为你是在选项屏幕的构造函数中调用问题行,或者至少在调用screenmanager的AddScreen
方法之前调用问题行。
将其移至屏幕的LoadContent
方法。
检查GameInstance
是Main
的实例。
值得注意的是,这是基于您的代码的GameStateManagement sample。