【问题标题】:Queue multiple entity modifiers in AndEngine在 AndEngine 中排队多个实体修饰符
【发布时间】:2012-06-23 14:57:33
【问题描述】:

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

    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 没有任何效果。我在这里做错了什么?

【问题讨论】:

    标签: android andengine


    【解决方案1】:

    我不确定您的代码为什么不起作用,但我认为您可以使用 SequenceEntityModifier 实现相同的目标:

    scene.attachChild(pointer);
    
        pointer.clearEntityModifiers();
        pointer.registerEntityModifier(new SequenceEntityModifier(
            new MoveModifier#1(...),
            new MoveModifier#2(...)));
    

    【讨论】:

      【解决方案2】:

      我的第一个猜测是,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());
      

      我无法对此进行测试,所以这些只是疯狂的猜测。如果你发现了什么,请告诉我。

      问候 克里斯托夫

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        • 2021-09-30
        • 1970-01-01
        • 2014-06-08
        • 2021-11-07
        相关资源
        最近更新 更多