我目前正在使用XNA游戏中的一个保存系统,该系统会在完成保存时触发一个事件。
我的游戏有多个屏幕,由屏幕管理器管理,每个屏幕都有自己的更新和绘图方法。
在构造函数中,我的_newSave布尔值被标记为true,这个布尔值从游戏保存过程(由助手管理)开始,一旦启动过程,它被标记为false以防止不断循环(因为我只想在每个保存屏幕上保存一次。)
当helper完成保存时,它会触发事件,返回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语句在if语句中需要为true才能访问,事件中的断点显示它是真的,但是在第一个“new”循环中更新代码,它是错误的。
我真的把头发拉出来,无法理解发生了什么。
非常感谢任何帮助,如果这是愚蠢的话,我很抱歉,我是一个相对较新的程序员:)
谢谢! &LT; 3
编辑:整个Helper.cs类的Pastebin:http://pastebin.com/uJ0g6e00
载入画面类:pastebin.com/8W8HxBnq
屏幕类:pastebin.com/qr29gzuq
答案 0 :(得分:0)
您使用的是多线程吗?如果是这样,我想知道这是否是竞争条件。
例如:
Update
被称为
我们假设_newSave
为真
RequestSave
被称为
在RequestSave
返回之前,再次调用Update
,但_newSave
仍然是真的......
答案 1 :(得分:0)
我弄清楚了这个问题,为每个人浪费时间向所有人道歉,并感谢你们试图提供帮助,事实证明只需切换_newSave; = false和helper.RequestSave(_player);围绕修复问题的陈述,我认为问题被单独隔离到这个类中,因为它是唯一发生变化的地方,实际上问题是当玩家得分不大于我时,我在RequestSave方法中调用了委托。高分,这导致代码然后返回到if块并且因为“_newSave = false;”语句是在方法调用之后直接进行的,它将语句恢复为false!
我很傻但有时很难看到简单的问题:P再次感谢你!
&LT; 3