我目前正在我的 XNA 游戏中开发一个保存系统,该系统在完成保存时会触发一个事件。
我的游戏有多个由屏幕管理器管理的屏幕,每个屏幕都有自己的 Update 和 Draw 方法。
在构造函数中,我的 _newSave 布尔值被标记为 true,这个布尔值开始游戏保存过程(由助手管理),一旦开始该过程,它被标记为 false 以防止不断循环(因为我只想每个保存屏幕保存一次)。
当助手完成保存时,它会触发事件,返回到 SaveScreen 类中,该类将 _newSave 设置回 true,并告诉 ScreenManager 更改屏幕。
玩游戏似乎一切正常,直到第二次保存,当尝试保存时游戏冻结。值得注意的是,这个 bool 是私有的,并且只在这个方法中使用了显示的 4 次(找到了 Visual Studio 的用法来确认)
class SaveScreen : LoadingScreen
{
private bool _newSave;
private Player _player;
public SaveScreen(EventHandler screenEvent, ContentManager Content, GraphicsDevice GraphicsDevice, Player player)
: base(screenEvent, Content, GraphicsDevice)
{
screenTexture = Content.Load<Texture2D>("saving");
_newSave = true;
this._player = player;
helper.FinishedSaving = new EventHandler(FinishedSaving);
}
public override void Update(GameTime gameTime)
{
if (_newSave)
{
helper.RequestSave(_player);
_newSave = false;
}
helper.UpdateSaving();
base.Update(gameTime);
}
private void FinishedSaving(object o, EventArgs e)
{
_newSave = true;
screenEvent.Invoke(this, new EventArgs());
}
}
通过 FinishedSaving 事件中的断点,我确认 bool 正在更改为 true,这是正确的,但是,在 if 语句的下一个保存周期中的下一个断点显示 bool 为 false。
我对此感到非常困惑,因为唯一的 _newSave = false 语句位于需要为 true 才能访问的 if 语句中,事件内的断点表明它是 true,但在更新的第一个“新”循环中代码,它是错误的。
我真的把头发拉出来了,无法理解发生了什么。
非常感谢任何帮助,如果这很愚蠢,我很抱歉,我是一个相对较新的程序员:)
谢谢你!<3
编辑:整个 Helper.cs 类的 Pastebin:http: //pastebin.com/uJ0g6e00
加载屏幕类:pastebin.com/8W8HxBnq
屏幕类:pastebin.com/qr29gzuq