问题
I'm trying to have a sprite ("pointer" below) along two paths, one after the other. Here is my code:
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()
));
The pointer moves along the first path as expected, and then the clickSound plays, and then nothing happens. The second MoveModifier doesn't have any effect. What am I doing wrong here?
回答1:
I'm not sure why your code is not working, but I think you can achieve the same thing using the SequenceEntityModifier:
scene.attachChild(pointer);
pointer.clearEntityModifiers();
pointer.registerEntityModifier(new SequenceEntityModifier(
new MoveModifier#1(...),
new MoveModifier#2(...)));
回答2:
My first guess woud be, that the code after pointer.clearEntityModifiers(); isn't executed anymore, since it unregisters the modifiers. I am just thinking out loud here, so please tell me if I am wrong. Maybe you can try logging something to see if the method returns after this line. Something like:
pointer.clearEntityModifiers();
Log.v("EntityModifier", "the method continues...");
I always find it hard to manage internal class definitions, because of the state of the variables that are accessed from inside. Like in your case the pointer.
If nothing else works, you could still try to do it all in one run. So instead of disposing the first modifier listener and registering another, create your own Listener, with a flag somewhere to tell it what to do and reuse that listener:
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();
}
}
}
And to use it something like that:
MyModifierListener myListener = new MyModifierListener(pointer);
pointer.registerEntityModifier(new MoveModifier(1.0f, 540, 960, 1000, 1000, myListener), EaseCubicInOut.getInstance());
I couldn't test this, so these are just wild guesses. Tell me if you find something.
regards Christoph
来源:https://stackoverflow.com/questions/11170486/queue-multiple-entity-modifiers-in-andengine