构造函数将在LoadContent 之前调用。届时,switch 语句中的行都会将null 分配给 spriteTexture。
最简单的解决方法是保存requestedMenuButtonType 的值并将switch 语句(或对包含switch 语句的方法的调用)放入LoadContent(在图标加载后的某个时间点) .例如:
private static MenuButtonType savedMenuButtonType;
public MenuButton(int requestedX, int requestedY, int requestedWidth, int requestedHeight, MenuButtonType requestedMenuButtonType)
: base(requestedX, requestedY, requestedWidth, requestedHeight)
{
...
savedMenuButtonType = requestedMenuButtonType;
...
}
public static void LoadContent(ContentManager Content)
{
...
//Main Menu Icons
...
//About Menu Icons
...
spriteTexture = GetRequestedSpriteTexture();
}
private static Texture2D GetRequestedSpriteTexture()
{
switch (savedMenuButtonType)
{
case MenuButtonType.play:
return playButtonIcon;
break;
...
}
更好的解决方案可能是将Texture2Ds 包装在一些Icon 类中,该类有自己的LoadContent 方法(它调用LoadContent 为其特定的Texture2D)。然后当调用 LoadContent 时,它会加载 Texture2Ds 而不会丢弃 Icon 引用。
public class Icon
{
private string mTextureName;
private Texture2D mTexture;
public Icon(string pTextureName)
{
mTextureName = pTextureName;
}
...
public void LoadContent(ContentManager Content)
{
mTexture = Content.Load<Texture2D>(mTextureName);
}
...
}
public class MenuButton : SpriteObject
{
private Icon spriteIcon;
//Different Icons, static for loading
private static Icon playButtonIcon = new Icon("Menu Items/Menu Buttons/PlayButtonIcon");
...
public MenuButton(int requestedX, int requestedY, int requestedWidth, int requestedHeight, MenuButtonType requestedMenuButtonType)
: base(requestedX, requestedY, requestedWidth, requestedHeight)
{
...
spriteIcon = playButtonIcon;
...
}
public void LoadContent(ContentManager Content)
{
...
playButtonIcon.LoadContent(Content);
...
}
}