3

我试图让一个精灵(下面的“指针”)沿着两条路径,一个接一个。这是我的代码:

    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 播放,然后什么也没有发生。第二个 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。如果没有其他方法,您仍然可以尝试一次完成所有操作。因此,与其处理第一个修饰符侦听器并注册另一个,不如创建您自己的侦听器,并在某处使用一个标志来告诉它要做什么并重用该侦听器:

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 回答