布尔值似乎在改变自己(XNA)
本文关键字:XNA 改变自己 布尔值 | 更新日期: 2024-11-06 15:42:30
我目前正在我的XNA游戏中开发一个保存系统,该系统在完成保存时会触发一个事件。
我的游戏有多个屏幕,由屏幕管理器管理,每个屏幕都有自己的更新和绘制方法。
在构造函数中,我的_newSave布尔值被标记为 true,这个布尔值启动游戏保存过程(由助手管理),一旦它启动该过程,它就会被标记为 false 以防止不断循环(因为我只想为每个保存屏幕保存一次)。
当帮助程序完成保存时,它会在 SaveScreen 类中触发事件,这会_newSave设置回 true,并告诉 ScreenManager 更改屏幕。
玩游戏似乎一切正常,直到第二次保存,当尝试此保存时,游戏冻结。值得注意的是,这个布尔值是私有的,只在这种方法中使用了4次(视觉工作室发现用法确认)
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());
}
}
通过 DoneSave 事件中的断点,我确认布尔值正在更改为 true,这是正确的,但是,if 语句上下一个保存周期的以下断点显示布尔值为 false。
我对此感到非常困惑,因为唯一的 _newSave = false 语句位于需要为 true 才能访问的 if 语句中,事件内的断点显示它是真的,但在更新代码的第一个"新"循环中,它是假的。
我真的在用这个拔头发,不明白发生了什么。
非常感谢任何帮助,如果这是愚蠢的事情,我很抱歉,我是一个相对较新的程序员:)
谢谢!<3
编辑:整个助手的粘贴.cs类:http://pastebin.com/uJ0g6e00
加载屏幕类:pastebin.com/8W8HxBnq
屏幕类别:pastebin.com/qr29gzuq
您是否使用多个线程?如果是这样,我想知道这是否是一种竞争条件。
例如:
Update
被称为
让我们假设_newSave
是真的
RequestSave
被称为
在RequestSave
回来之前,Update
再次被召唤,但_newSave
仍然是真的......
我想通了问题所在,为浪费时间向大家道歉,并感谢您尝试提供帮助,事实证明,只需切换_newSave; = 假和助手。请求保存(_player);周围的语句解决了这个问题,我认为问题被单独隔离到这个类中,因为它是唯一发生更改的地方,实际上问题是当玩家分数不大于高分时,我在 RequestSave 方法中调用了委托,这导致代码然后返回到 if 块,并且由于"_newSave = false;"语句直接在方法调用之后, 它正在将语句恢复为错误!
我太傻了,但有时真的很难看到简单的问题:P再次感谢您!
<3>