1

現在、XNAゲームで、保存が完了するとイベントを発生させる保存システムに取り組んでいます。

私のゲームには、画面マネージャーによって管理される複数の画面があり、各画面には独自のUpdateメソッドとDrawメソッドがあります。

コンストラクターでは、私の_newSaveブール値にtrueのフラグが付けられ、このブール値はゲームの保存プロセス(ヘルパーによって管理されます)を開始し、プロセスを開始すると、常にループするのを防ぐためにfalseのフラグが付けられます(保存画面ごとに1回保存します)。

ヘルパーが保存を終了すると、イベントを発生させてSaveScreenクラス内に戻り、_newSaveをtrueに戻し、ScreenManagerに画面を変更するように指示します。

ゲームをプレイすると、2回目の保存まで、すべてが正しく機能しているように見えます。この保存を試みると、ゲームがフリーズします。このブール値はプライベートであり、この方法では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であることを示しています。

アクセスするにはtrueである必要があるifステートメント内に唯一の_newSave=falseステートメントがあるため、これには完全に混乱しています。イベント内のブレークポイントは、それが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 に答える