소스 검색

Using Tweens methods instead of the inner class

Simplification using Tweens methods instead of NoLoopAction inner class
Jérôme 5 년 전
부모
커밋
b48391399b
1개의 변경된 파일13개의 추가작업 그리고 39개의 파일을 삭제
  1. 13 39
      jme3-examples/src/main/java/jme3test/model/anim/TestOgreAnim.java

+ 13 - 39
jme3-examples/src/main/java/jme3test/model/anim/TestOgreAnim.java

@@ -36,6 +36,7 @@ import com.jme3.anim.AnimClip;
 import com.jme3.anim.AnimComposer;
 import com.jme3.anim.SkinningControl;
 import com.jme3.anim.tween.Tween;
+import com.jme3.anim.tween.Tweens;
 import com.jme3.anim.tween.action.Action;
 import com.jme3.anim.tween.action.BaseAction;
 import com.jme3.anim.tween.action.LinearBlendSpace;
@@ -55,7 +56,7 @@ import com.jme3.scene.shape.Box;
 public class TestOgreAnim extends SimpleApplication implements ActionListener {
 
     private AnimComposer animComposer;
-    private static LoopAction currentAction;
+    private static Action currentAction;
 
     public static void main(String[] args) {
         TestOgreAnim app = new TestOgreAnim();
@@ -80,9 +81,12 @@ public class TestOgreAnim extends SimpleApplication implements ActionListener {
         animComposer.actionBlended("Attack", new LinearBlendSpace(0f, 0.5f), "Dodge");
         for (AnimClip animClip : animComposer.getAnimClips()) {
             Action action = animComposer.action(animClip.getName());
-            animComposer.addAction(animClip.getName(), new LoopAction(action, animComposer));
+            if(!"stand".equals(animClip.getName())) {
+                action = new BaseAction(Tweens.sequence(action, Tweens.callMethod(this, "backToStand", animComposer)));
+            }
+            animComposer.addAction(animClip.getName(), action);
         }
-        currentAction = (LoopAction) animComposer.setCurrentAction("stand"); // Walk, pull, Dodge, stand, push
+        currentAction = animComposer.setCurrentAction("stand"); // Walk, pull, Dodge, stand, push
 
         SkinningControl skinningControl = model.getControl(SkinningControl.class);
         skinningControl.setHardwareSkinningPreferred(false);
@@ -100,48 +104,18 @@ public class TestOgreAnim extends SimpleApplication implements ActionListener {
         inputManager.addMapping("Attack", new KeyTrigger(KeyInput.KEY_SPACE));
     }
 
+    public Tween backToStand(AnimComposer animComposer) {
+        currentAction =  animComposer.setCurrentAction("stand");
+        return currentAction;
+    }
+    
     @Override
     public void onAction(String binding, boolean value, float tpf) {
         if (binding.equals("Attack") && value) {
             if (currentAction != null && !currentAction.equals(animComposer.getAction("Dodge"))) {
-                currentAction = (LoopAction) animComposer.setCurrentAction("Dodge");
-                currentAction.setNextAnim("stand");
+                currentAction = animComposer.setCurrentAction("Dodge");
                 currentAction.setSpeed(0.1f);
             }
         }
     }
-
-    static class LoopAction extends BaseAction {
-
-        final AnimComposer ac;
-        private boolean loop = false;
-        private String nextAnim = null;
-
-        public LoopAction(Tween delegate, AnimComposer ac) {
-            super(delegate);
-            this.ac = ac;
-        }
-
-        public void setLoop(boolean loop) {
-            this.loop = loop;
-        }
-
-        public void setNextAnim(String nextAction) {
-            this.nextAnim = nextAction;
-        }
-
-        @Override
-        public boolean interpolate(double t) {
-            boolean running = super.interpolate(t);
-            if (!loop && !running) {
-                setSpeed(0);
-                ac.removeCurrentAction(AnimComposer.DEFAULT_LAYER);
-                if (nextAnim != null && ac.hasAction(nextAnim)) {
-                    currentAction = (LoopAction) ac.setCurrentAction(nextAnim);
-                }
-            }
-            return running;
-        }
-
-    }
 }