【问题标题】:Boolean seemingly changing itself (XNA)布尔值似乎在改变自己 (XNA)
【发布时间】:2012-08-07 05:33:51
【问题描述】:

我目前正在我的 XNA 游戏中开发一个保存系统,该系统在完成保存时会触发一个事件。

我的游戏有多个由屏幕管理器管理的屏幕,每个屏幕都有自己的 Update 和 Draw 方法。

在构造函数中,我的 _newSave 布尔值被标记为 true,这个布尔值启动游戏保存过程(由助手管理),一旦启动过程,它被标记为 false 以防止不断循环(因为 i每个保存屏幕只想保存一次)。

当助手完成保存时,它会触发事件,返回到 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,但在第一个“新”循环中更新代码,是假的。

我真的被这个吓坏了,无法理解发生了什么。

非常感谢任何帮助,如果它是愚蠢的,我很抱歉,我是一个相对较新的程序员:)

谢谢!

编辑:整个 Helper.cs 类的 Pastebin:http://pastebin.com/uJ0g6e00

加载屏幕类:pastebin.com/8W8HxBnq

屏幕分类:pastebin.com/qr29gzuq

【问题讨论】:

  • 尝试设置一个变量断点,当变量被修改时触发;不过不太确定它是否在 C# 中可用;你在使用多个线程,也许是异步操作?
  • 何时(以及多久)调用更新? helper.RequestSave 和 helper.UpdateSaving 有什么作用?它们会导致 FinshedSaving 触发吗?
  • 我向你保证问题在RequestSave 之内,因为它每次调用LoadingScreen 时都会将_newsave 设置为false。您应该学习命名变量的正确方法。
  • 我没有使用多个线程,而且我不知道如何使用异步操作(仅在使用 StorageContainer 和 StorageDevice 检查之前在保存期间使用它们),这里是 Request save 只是在里面设置一个状态助手,它将允许 UpdateSaving 执行保存所需的操作,即创建 StorageDevice 和 StorageContainer,然后保存,一旦保存完全完成,就会触发 FinishedSaving。这是整个助手类的pastebin! pastebin.com/uJ0g6e00(如果写得不好,请见谅:P)
  • Ramhound FinishedSaving 仅在 UpdateSaving 到达 Helper.cs 中显示的循环结束时才被调用,至于我的变量命名,我只是使用我在大学所学的内容和 resharper 建议的内容

标签: c# xna boolean


【解决方案1】:

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

例如:

Update 被调用

假设_newSave 为真

RequestSave 被调用

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

【讨论】:

  • 我不使用多个线程,除非它们默认与 EventHandler 一起使用?
【解决方案2】:

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

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

【讨论】:

  • 我觉得问题出在RequestSave 内很有趣,因为这是您没有发布的唯一方法。
  • 我真的很高兴你觉得这很有趣,但该方法在我发布的帮助程序类中。
猜你喜欢
  • 1970-01-01
  • 2021-01-02
  • 2017-10-15
  • 2012-10-10
  • 2012-11-08
  • 2015-02-08
  • 2011-04-18
  • 2023-04-10
  • 1970-01-01
相关资源
最近更新 更多