2012-06-23 41 views
3

我試圖沿着兩個路徑,一個接一個地有一個精靈(下面的「指針」)。這裏是我的代碼:預期沿第一條路徑在AndEngine中排隊多個實體修飾符

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沒有任何作用。我在這裏做錯了什麼?

回答

11

我不知道爲什麼你的代碼不能正常工作,但我認爲你可以使用SequenceEntityModifier實現同樣的事情:

scene.attachChild(pointer); 

    pointer.clearEntityModifiers(); 
    pointer.registerEntityModifier(new SequenceEntityModifier(
     new MoveModifier#1(...), 
     new MoveModifier#2(...))); 
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()); 

我無法測試這個,所以這些只是野生的猜測。告訴我,如果你找到一些東西。

問候 克里斯托夫