布尔值似乎在改变自己(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

布尔值似乎在改变自己(XNA)

您是否使用多个线程?如果是这样,我想知道这是否是一种竞争条件。

例如:

Update被称为

让我们假设_newSave是真的

RequestSave被称为

RequestSave回来之前,Update再次被召唤,但_newSave仍然是真的......

我想通了问题所在,为浪费时间向大家道歉,并感谢您尝试提供帮助,事实证明,只需切换_newSave; = 假和助手。请求保存(_player);周围的语句解决了这个问题,我认为问题被单独隔离到这个类中,因为它是唯一发生更改的地方,实际上问题是当玩家分数不大于高分时,我在 RequestSave 方法中调用了委托,这导致代码然后返回到 if 块,并且由于"_newSave = false;"语句直接在方法调用之后, 它正在将语句恢复为错误!

我太傻了,但有时真的很难看到简单的问题:P再次感谢您!

<3>