1

Renderer クラスに Animation クラスの 2 つのオブジェクトがあり、サルのアニメーションの 2 つのファイルを取得します。

今、左に行くサルを描画するアニメーションの 3 番目のオブジェクトを作成しようとしています。

私は 2 番目のアニメーション (猿が右に行く) の画像を反転し、最終的に 3 番目のオブジェクトのリソースとして使用される配列に追加しようとしています。

問題は、2 番目のアニメーションの画像を反転して追加すると、元のアニメーション オブジェクトが「破損」することです。私が損傷したと言うとき、右に行く猿の画像を含むアニメーションも突然左に「反転」し、左に行く猿を表す 2 つのアニメーション オブジェクトがあることを意味します。

これを処理するコードの一部を次に示します。

monkeyAnimStraight = new Animation(1/20.0f, AssetsManager.getAsset("animations/monkeywalkaway.txt", TextureAtlas.class).getRegions());
        monkeyAnimStraight.setPlayMode(Animation.PlayMode.LOOP_REVERSED);
        monkeyAnimRight = new Animation(1/10.0f, AssetsManager.getAsset("animations/monkeywalk.txt", TextureAtlas.class).getRegions());
        monkeyAnimRight.setPlayMode(Animation.PlayMode.LOOP_REVERSED);
        Array<AtlasRegion> temp = AssetsManager.getAsset("animations/monkeywalk.txt", TextureAtlas.class).getRegions();
        Array<AtlasRegion> keyFramesTemp = new Array<TextureAtlas.AtlasRegion>();
        keyFramesTemp.addAll(temp);
        for(AtlasRegion keyFrame : keyFramesTemp) {
            keyFrame.flip(true, false);
        }
        monkeyAnimLeft = new Animation(1/20.0f, keyFramesTemp);

ご覧のとおり、元の画像が反転しないようにコピーしようとしていますが、それでも機能しません。

元の AtlasRegion 配列を正常にコピーするにはどうすればよいですか?

4

1 に答える 1

3

元のテクスチャ領域を台無しにしたくない場合は、新しい領域を作成してください。AtlasRegions は TextureRegions のサブクラスですが、アニメーションに本当に必要なのは TextureRegions だけであることに注意してください。

TextureRegions の元のインスタンスを変更する代わりに、それらをコピーして新しいインスタンスを作成する必要があります。それらを新しい配列にドロップするだけではコピーされません。新しい配列は、まだ同じ元のインスタンスを参照しています。

だからこれをしてください:

Array<TextureRegion> monkeyWalkRightRegions = AssetsManager.getAsset("animations/monkeywalk.txt", TextureAtlas.class).getRegions();
monkeyAnimRight = new Animation(1/10.0f, monkeyWalkRightRegions);
monkeyAnimRight.setPlayMode(Animation.PlayMode.LOOP_REVERSED);

Array<TextureRegion> monkeyWalkLeftRegions = new Array<TextureRegion>();

//copy and then flip each region and add it to the new array
for(TextureRegion keyFrame : monkeyWalkRightRegions ) {
    TextureRegion region = new TextureRegion(keyFrame); //copy of region created
    region.flip(true, false);
    monkeyWalkLeftRegions.add(region);
}

monkeyAnimLeft = new Animation(1/20.0f, monkeyWalkLeftRegions );
于 2014-10-25T01:09:40.117 に答える