• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2009-2010 jMonkeyEngine
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are
7  * met:
8  *
9  * * Redistributions of source code must retain the above copyright
10  *   notice, this list of conditions and the following disclaimer.
11  *
12  * * Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in the
14  *   documentation and/or other materials provided with the distribution.
15  *
16  * * Neither the name of 'jMonkeyEngine' nor the names of its contributors
17  *   may be used to endorse or promote products derived from this software
18  *   without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
22  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
24  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
25  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
26  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
27  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
28  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
29  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
30  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  */
32 
33 package jme3test.helloworld;
34 
35 import com.jme3.animation.AnimChannel;
36 import com.jme3.animation.AnimControl;
37 import com.jme3.animation.AnimEventListener;
38 import com.jme3.animation.LoopMode;
39 import com.jme3.app.SimpleApplication;
40 import com.jme3.input.KeyInput;
41 import com.jme3.input.controls.ActionListener;
42 import com.jme3.input.controls.KeyTrigger;
43 import com.jme3.light.DirectionalLight;
44 import com.jme3.math.ColorRGBA;
45 import com.jme3.math.Vector3f;
46 import com.jme3.scene.Node;
47 
48 /** Sample 7 - how to load an OgreXML model and play an animation,
49  * using channels, a controller, and an AnimEventListener. */
50 public class HelloAnimation extends SimpleApplication
51                          implements AnimEventListener {
52 
53   Node player;
54   private AnimChannel channel;
55   private AnimControl control;
56 
main(String[] args)57   public static void main(String[] args) {
58     HelloAnimation app = new HelloAnimation();
59     app.start();
60   }
61 
62   @Override
simpleInitApp()63   public void simpleInitApp() {
64     viewPort.setBackgroundColor(ColorRGBA.LightGray);
65     initKeys();
66 
67     /** Add a light source so we can see the model */
68     DirectionalLight dl = new DirectionalLight();
69     dl.setDirection(new Vector3f(-0.1f, -1f, -1).normalizeLocal());
70     rootNode.addLight(dl);
71 
72     /** Load a model that contains animation */
73     player = (Node) assetManager.loadModel("Models/Oto/Oto.mesh.xml");
74     player.setLocalScale(0.5f);
75     rootNode.attachChild(player);
76 
77     /** Create a controller and channels. */
78     control = player.getControl(AnimControl.class);
79     control.addListener(this);
80     channel = control.createChannel();
81     channel.setAnim("stand");
82   }
83 
84   /** Use this listener to trigger something after an animation is done. */
onAnimCycleDone(AnimControl control, AnimChannel channel, String animName)85   public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName) {
86     if (animName.equals("Walk")) {
87       /** After "walk", reset to "stand". */
88       channel.setAnim("stand", 0.50f);
89       channel.setLoopMode(LoopMode.DontLoop);
90       channel.setSpeed(1f);
91     }
92   }
93 
94   /** Use this listener to trigger something between two animations. */
onAnimChange(AnimControl control, AnimChannel channel, String animName)95   public void onAnimChange(AnimControl control, AnimChannel channel, String animName) {
96     // unused
97   }
98 
99   /** Custom Keybindings: Mapping a named action to a key input. */
initKeys()100   private void initKeys() {
101     inputManager.addMapping("Walk", new KeyTrigger(KeyInput.KEY_SPACE));
102     inputManager.addListener(actionListener, "Walk");
103   }
104 
105   /** Definining the named action that can be triggered by key inputs. */
106   private ActionListener actionListener = new ActionListener() {
107     public void onAction(String name, boolean keyPressed, float tpf) {
108       if (name.equals("Walk") && !keyPressed) {
109         if (!channel.getAnimationName().equals("Walk")) {
110           /** Play the "walk" animation! */
111           channel.setAnim("Walk", 0.50f);
112           channel.setLoopMode(LoopMode.Loop);
113         }
114       }
115     }
116   };
117 
118 }
119