forked from jMonkeyEngine/jmonkeyengine
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHelloAnimation.java
More file actions
123 lines (108 loc) · 4.41 KB
/
HelloAnimation.java
File metadata and controls
123 lines (108 loc) · 4.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/*
* Copyright (c) 2009-2021 jMonkeyEngine
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* * Neither the name of 'jMonkeyEngine' nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package jme3test.helloworld;
import com.jme3.anim.AnimComposer;
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.BlendSpace;
import com.jme3.anim.tween.action.LinearBlendSpace;
import com.jme3.app.SimpleApplication;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.light.DirectionalLight;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
/**
* Sample 7 - Load an OgreXML model and play some of its animations.
*/
public class HelloAnimation extends SimpleApplication {
private Action advance;
private AnimComposer control;
public static void main(String[] args) {
HelloAnimation app = new HelloAnimation();
app.start();
}
@Override
public void simpleInitApp() {
viewPort.setBackgroundColor(ColorRGBA.LightGray);
initKeys();
/* Add a light source so we can see the model */
DirectionalLight dl = new DirectionalLight();
dl.setDirection(new Vector3f(-0.1f, -1f, -1).normalizeLocal());
rootNode.addLight(dl);
/* Load a gltf model that contains animation */
Node player = (Node) assetManager.loadModel("Models/Oto/Oto.gltf");
player.setLocalScale(0.5f);
rootNode.attachChild(player);
/* Use the model's AnimComposer to play its "stand" animation clip. */
control = player.getControl(AnimComposer.class);
control.setCurrentAction("stand");
/* Compose an animation action named "halt"
that transitions from "Walk" to "stand" in half a second. */
BlendSpace quickBlend = new LinearBlendSpace(0f, 0.5f);
Action halt = control.actionBlended("halt", quickBlend, "stand", "Walk");
halt.setLength(0.5);
/* Compose an animation action named "advance"
that walks for one cycle, then halts, then invokes onAdvanceDone(). */
Action walk = control.action("Walk");
Tween doneTween = Tweens.callMethod(this, "onAdvanceDone");
advance = control.actionSequence("advance", walk, halt, doneTween);
}
/**
* Callback to indicate that the "advance" animation action has completed.
*/
void onAdvanceDone() {
/*
* Play the "stand" animation action.
*/
control.setCurrentAction("stand");
}
/**
* Map the spacebar to the "Walk" input action, and add a listener to initiate
* the "advance" animation action each time it's pressed.
*/
private void initKeys() {
inputManager.addMapping("Walk", new KeyTrigger(KeyInput.KEY_SPACE));
ActionListener handler = new ActionListener() {
@Override
public void onAction(String name, boolean keyPressed, float tpf) {
if (keyPressed && control.getCurrentAction() != advance) {
control.setCurrentAction("advance");
}
}
};
inputManager.addListener(handler, "Walk");
}
}