【发布时间】:2012-08-07 05:33:51
【问题描述】:
我目前正在我的 XNA 游戏中开发一个保存系统,该系统在完成保存时会触发一个事件。
我的游戏有多个由屏幕管理器管理的屏幕,每个屏幕都有自己的 Update 和 Draw 方法。
在构造函数中,我的 _newSave 布尔值被标记为 true,这个布尔值启动游戏保存过程(由助手管理),一旦启动过程,它被标记为 false 以防止不断循环(因为 i每个保存屏幕只想保存一次)。
当助手完成保存时,它会触发事件,返回到 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,但在第一个“新”循环中更新代码,是假的。
我真的被这个吓坏了,无法理解发生了什么。
非常感谢任何帮助,如果它是愚蠢的,我很抱歉,我是一个相对较新的程序员:)
谢谢!
编辑:整个 Helper.cs 类的 Pastebin:http://pastebin.com/uJ0g6e00
加载屏幕类:pastebin.com/8W8HxBnq
屏幕分类:pastebin.com/qr29gzuq
【问题讨论】:
-
尝试设置一个变量断点,当变量被修改时触发;不过不太确定它是否在 C# 中可用;你在使用多个线程,也许是异步操作?
-
何时(以及多久)调用更新? helper.RequestSave 和 helper.UpdateSaving 有什么作用?它们会导致 FinshedSaving 触发吗?
-
我向你保证问题在
RequestSave之内,因为它每次调用LoadingScreen时都会将_newsave设置为false。您应该学习命名变量的正确方法。 -
我没有使用多个线程,而且我不知道如何使用异步操作(仅在使用 StorageContainer 和 StorageDevice 检查之前在保存期间使用它们),这里是 Request save 只是在里面设置一个状态助手,它将允许 UpdateSaving 执行保存所需的操作,即创建 StorageDevice 和 StorageContainer,然后保存,一旦保存完全完成,就会触发 FinishedSaving。这是整个助手类的pastebin! pastebin.com/uJ0g6e00(如果写得不好,请见谅:P)
-
Ramhound FinishedSaving 仅在 UpdateSaving 到达 Helper.cs 中显示的循环结束时才被调用,至于我的变量命名,我只是使用我在大学所学的内容和 resharper 建议的内容