1

我目前正在我的 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

4

2 回答 2

0

你在使用多个线程吗?如果是这样,我想知道这是否是竞争条件。

例如:

Update叫做

让我们假设这_newSave是真的

RequestSave叫做

RequestSave返回之前,Update再次调用,但_newSave仍然是真的......

于 2012-08-06T19:07:36.863 回答
0

我发现了问题,向大家道歉浪费了他们的时间,并感谢您的帮助,结果证明只是切换_newSave;= false 和 helper.RequestSave(_player); 围绕解决问题的陈述,我认为问题仅在这个类中被隔离,因为它是发生变化的唯一地方,实际上问题是当玩家得分不大于时,我在 RequestSave 方法中调用了委托高分,这导致代码返回到 if 块,因为“_newSave = false;” 语句直接在方法调用之后,它将语句恢复为false!

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

<3

于 2012-08-06T21:33:51.160 回答