0

私のコードでは、異なる値を持つ 4 つのキーをそれぞれ次のものを使用して SortedList に入力します。

animations.Add(0, new Animation("prefix", textures, timer, looped));

ソートされたリストは次のように作成されます。

private SortedList<int, Animation> animations = new SortedList<int, Animation>();

ただし、再生中の現在のアニメーションを変更するために呼び出すと、読み取られるキー (ID) は変更されますが、値は変更されません。値は常に、SortedList に最後に入力された値のままです。

これは、変更アニメーション メソッドです。

    private void setAnimation(int ID)
    {
        Utilities.Log("Animation set to: " + ID + " of " + animations.Count);
        curAnim = animations[ID];
        curAnimID = ID;
        curAnim.reset();
    }

どの出力

[29/07/2013 08:09:00 PM] Animation set to: 1 of 4
[29/07/2013 08:09:01 PM] Animation set to: 4 of 4

しかし、視覚的なアニメーションは常に同じままです。変更は、キーボード イベントによってトリガーされます。

私はこれに一日中立ち往生しています。助けていただければ幸いです。コードのその他の部分は、リクエストに応じて提供されます。

編集: curAnim は、Animation クラスの getTexture() というメソッドによって表示されます。このメソッドは、最後に入力されたエントリのものであるかのように常に戻ります。

インサート:

        //----------------IDLE----------------//
        TextureBank idleTb = new TextureBank();
        idleTb.add("idle1", c.Load<Texture2D>("idle"));
        idleTb.add("idle1" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/idle")));
        animations.Add(ANIMATIONS.IDLE, new Animation("idle", idleTb, 200, true));

        //----------------JUMP----------------//
        TextureBank jumpTb = new TextureBank();
        jumpTb.add("jump1", c.Load<Texture2D>("jump"));
        jumpTb.add("jump1" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/jump")));
        animations.Add(ANIMATIONS.JUMP, new Animation("jump", jumpTb, 200, false));

        //----------------PUNCH----------------//
        TextureBank punchTb = new TextureBank();
        punchTb.add("punch1", c.Load<Texture2D>("punch"));
        punchTb.add("punch1" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/punch")));
        animations.Add(ANIMATIONS.PUNCH, new Animation("punch", punchTb, 200, false));

        //----------------WALK----------------//
        TextureBank walkTb = new TextureBank();
        walkTb.add("walk1", c.Load<Texture2D>("walk"));
        walkTb.add("walk1" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/walk")));
        walkTb.add("walk2", c.Load<Texture2D>("walk2"));
        walkTb.add("walk2" + flip_str, Utilities.FlipHorizontal(c.Load<Texture2D>("characters/wife/walk2")));
        animations.Add(ANIMATIONS.WALK, new Animation("walk", walkTb, 200, true));

        setAnimation(ANIMATIONS.IDLE);
4

1 に答える 1

0

setAnimationから読み取ったスレッドとは別のスレッドから が呼び出された場合はcurAnim、更新された値を使用して表示スレッドが実際に開始されるように、何らかのロックが必要です。そうしないと、以前のアニメーション オブジェクトを置き換えたと思った後も、ずっと前のアニメーション オブジェクトを喜んで使い続けることができます。

于 2013-07-29T20:16:34.980 に答える