3

2 つのパスに沿ってスプライト (以下の「ポインタ」) を 1 つずつ作成しようとしています。これが私のコードです:

    scene.attachChild(pointer);

    pointer.clearEntityModifiers();
    pointer.registerEntityModifier(new MoveModifier(
        1.0f, 540, 960, 1000, 1000,
        new IEntityModifierListener() {
            public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {}
            public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
                clickSound.play();

                pointer.clearEntityModifiers();
                pointer.registerEntityModifier(new MoveModifier(
                    1.0f, pointer.getX(), pointer.getY(), 500, 2500,
                    new IEntityModifierListener() {
                        public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {}
                        public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
                            pointer.clearEntityModifiers();
                            pointer.detachSelf();
                        }
                    },
                    EaseCubicInOut.getInstance()
                ));
            }
        },
        EaseCubicInOut.getInstance()
    ));

ポインタは期待どおり最初のパスに沿って移動し、次に clickSound が再生されますが、何も起こりません。2 番目の MoveModifier には効果がありません。ここで何が間違っていますか?

4

2 に答える 2

11

コードが機能しない理由はわかりませんが、を使用して同じことを達成できると思いますSequenceEntityModifier:

scene.attachChild(pointer);

    pointer.clearEntityModifiers();
    pointer.registerEntityModifier(new SequenceEntityModifier(
        new MoveModifier#1(...),
        new MoveModifier#2(...)));
于 2012-06-25T03:34:19.780 に答える
1

私の最初の推測pointer.clearEntityModifiers();は、修飾子の登録を解除するため、後のコードはもう実行されないということです。ここで大声で考えているだけなので、間違っていたら教えてください。何かをログに記録して、この行の後にメソッドが戻るかどうかを確認してみてください。何かのようなもの:

pointer.clearEntityModifiers();
Log.v("EntityModifier", "the method continues...");

内部からアクセスされる変数の状態が原因で、内部クラスの定義を管理するのはいつも難しいと思います。あなたの場合のようにpointer。他に何も機能しない場合でも、1 回の実行ですべてを実行できます。したがって、最初の修飾子リスナーを破棄して別のリスナーを登録する代わりに、独自のリスナーを作成し、何をすべきかを伝えるフラグをどこかに付けて、そのリスナーを再利用します。

public class MyModifierListener extends IEntityModifierListener{

    private Pointer pointer;   // declare your pointer, so you have a reference within the listener
    private boolean firstRun;  // a flag to check if it is the first time the modifier is used

    public MyModifierListener(Pointer pointer){
        super();
        this.pointer = pointer;  // init the pointer within the constructor
        this.firstRun = true;    // should be true the first time
    }

    public void onModifierStarted(IModifier<IEntity> pModifier, IEntity pItem) {
    }

    public void onModifierFinished(IModifier<IEntity> pModifier, IEntity pItem) {
        if(firstRun){
             clickSound.play();
         firstRun=false;
             pointer.registerEntityModifier(new MoveModifier(1.0f, pointer.getX(), pointer.getY(), 500, 2500, this), EaseCubicInOut.getInstance());
        }else{
             pointer.detachSelf();
        }
    }
}

そして、それを次のように使用するには:

MyModifierListener myListener = new MyModifierListener(pointer);
pointer.registerEntityModifier(new MoveModifier(1.0f, 540, 960, 1000, 1000,     myListener), EaseCubicInOut.getInstance());

これをテストできなかったので、これらは単なる推測です。何か見つけたら教えて。

よろしくクリストフ

于 2012-06-25T00:27:26.827 に答える