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

时间:2012-08-06 18:47:28

标签: c# xna boolean

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

2 个答案:

答案 0 :(得分:0)

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

例如:

Update被称为

我们假设_newSave为真

RequestSave被称为

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

答案 1 :(得分:0)

我弄清楚了这个问题,为每个人浪费时间向所有人道歉,并感谢你们试图提供帮助,事实证明只需切换_newSave; = false和helper.RequestSave(_player);围绕修复问题的陈述,我认为问题被单独隔离到这个类中,因为它是唯一发生变化的地方,实际上问题是当玩家得分不大于我时,我在RequestSave方法中调用了委托。高分,这导致代码然后返回到if块并且因为“_newSave = false;”语句是在方法调用之后直接进行的,它将语句恢复为false!

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

&LT; 3