我正在使用enum
s在主菜单上使用但我遇到了一个错误,我已经查看了一段时间,但找不到有什么问题。
我正在做的是菜单的每个页面我有一个包含图像的类和矩形。当鼠标悬停在图像上并单击它时,它会将字符串更改为名称以使程序执行某些操作。
由于某些原因,当mouseOn
更新时,字符"None"
不会从TitleScreen.cs
更改。有什么问题?
TitleScreen类:
public class TitleScreen
{
Game1 game1;
public void Initialize()
{
game1 = new Game1();
}
public void Update(GameTime gameTime)
{
MouseState mouse = Mouse.GetState();
if (mouse.LeftButton == ButtonState.Pressed && game1.mouseUsed == false && game1.mouseActive == true)
{
if (play.Contains(mouse.X, mouse.Y))
{
game1.mouseOn = "Play";
game1.mouseUsed = true;
}
else if (title.Contains(mouse.X, mouse.Y))
{
game1.mouseOn = "Title";
game1.mouseUsed = true;
}
else if (options.Contains(mouse.X, mouse.Y))
{
game1.mouseOn = "Options";
game1.mouseUsed = true;
}
else if (quit.Contains(mouse.X, mouse.Y))
{
game1.mouseOn = "Quit";
game1.mouseUsed = true;
}
}
}
内部主要类别:
public Game1()
{
graphics = new GraphicsDeviceManager(this);
Content.RootDirectory = "Content";
images = new Images();
startup = new StartUp();
resolution = new Resolution(new Vector2(screenWidth, screenHeight));
options = new Options();
credits = new Credits();
titlescreen = new TitleScreen();
images.Content = Content;
graphics.PreferredBackBufferHeight = (int)resolution.screenResolution.Y;
graphics.PreferredBackBufferWidth = (int)resolution.screenResolution.X;
graphics.ApplyChanges();
}
protected override void Initialize()
{
titlescreen.Initialize();
base.Initialize();
}
答案 0 :(得分:1)
您正在TitleScreen类中创建另一个Game对象。我不确定为什么你需要在标题屏幕中引用完整的Game类,如果只是输入命令,你通常最好制作一个单独的输入类并引用它。无论如何,如果你想要一个适当的参考Game1而不是一个新的,你需要这样做:
public class TitleScreen
{
Game1 game1;
public void Initialize(Game game1) //Or (Game1 game1) both work since Game1 is a child from Game.
{
this.game1 = new Game1();
}
}
现在,当您在TitleScreen对象上调用Initialize方法时,使用this
将Game1对象传递给它。
protected override void Initialize()
{
titlescreen.Initialize(this);
base.Initialize();
}
如果您实际上正在检查Game1类中的输入,则不会将其传递给TitleScreen。解决此问题的最简单方法是在更新方法中传递Game1,方法与上面相同。
public void Update(GameTime gameTime, Game1 game1)
{
this.game1 = game1;
MouseState mouse = Mouse.GetState();
}
同样,您需要在Game1更新方法中传递每个更新循环:
titleScreen.Update(gameTime, this);
我不能保证这会起作用,你可能只需要一个更好的架构(只需传递完整的Game1对象就不是一个好主意)。当我需要Game1中的特定事物时,我只是为它创建属性并引用它。我希望事情能够为你清理一下,就像你传递GameTime和SpriteBatch一样,如果你已经传递了整个Game1对象,你就不需要传递它们。