JME基础教程代码分析7
对原版做了一定的修改
package com.hello;
import com.jme3.animation.AnimChannel;
import com.jme3.animation.AnimControl;
import com.jme3.animation.AnimEventListener;
import com.jme3.animation.LoopMode;
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.FastMath;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
//AnimEventListener对动画的监听
/** Sample 7 - how to load an OgreXML model and play an animation,
* using channels, a controller, and an AnimEventListener. */
public class HelloAnimation extends SimpleApplication
implements AnimEventListener {
//AnimChannel动画渠道, AnimControl动画控制
private AnimChannel channel;
private AnimControl control;
Node player;
private int NAME_ID = 0;
private Object[] names;
public static void main(String[] args) {
HelloAnimation app = new HelloAnimation();
app.start();
}
@Override
public void simpleInitApp() {
viewPort.setBackgroundColor(ColorRGBA.LightGray);
initKeys();
DirectionalLight dl = new DirectionalLight();
dl.setDirection(new Vector3f(-0.1f, -1f, -1).normalizeLocal());
rootNode.addLight(dl);
//设置模型Ninja.mesh.xml,它隐含对应了一个Ninja.skeleton.xml文件描述了模型的动画效果
player = (Node) assetManager.loadModel("Models/Ninja/Ninja.mesh.xml");
// player.setLocalScale(0.5f);
player.scale(0.05f, 0.05f, 0.05f);
player.rotate(0, FastMath.PI + FastMath.HALF_PI/2, 0);
player.setLocalTranslation(0.0f, -5.0f, -2.0f);
rootNode.attachChild(player);
//从player获取动画控制对象
control = player.getControl(AnimControl.class);
//绑定动画监听
control.addListener(this);
//由控制器加载动画渠道
channel = control.createChannel();
//设置初始动画渠道名称,注Ninja.skeleton.xml文件中必定包含该名称
channel.setAnim("Attack1");
names = control.getAnimationNames().toArray();
}
//一个动画周期结束后所触发的监听方法
public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName) {
if (animName.equals("Walk")) {
channel.setAnim("Attack1", 0.50f);
channel.setLoopMode(LoopMode.DontLoop);
channel.setSpeed(1f);
}
}
//当一个动画改变时所触发的监听方法,这里没有用到
public void onAnimChange(AnimControl control, AnimChannel channel, String animName) {
// unused
}
/** Custom Keybinding: Map named actions to inputs. */
//控制不同动作名称的按键设置
private void initKeys() {
inputManager.addMapping("Walk", new KeyTrigger(KeyInput.KEY_SPACE), new KeyTrigger(KeyInput.KEY_B));
inputManager.addMapping("Attack2", new KeyTrigger(KeyInput.KEY_1));
inputManager.addMapping("Attack3", new KeyTrigger(KeyInput.KEY_2));
inputManager.addMapping("HighJump", new KeyTrigger(KeyInput.KEY_A));
inputManager.addMapping("Transf", new KeyTrigger(KeyInput.KEY_T));
inputManager.addListener(actionListener, "Walk");
inputManager.addListener(actionListener, "Attack2");
inputManager.addListener(actionListener, "Attack3");
inputManager.addListener(actionListener, "HighJump");
//最后这个是我加的,用于遍历切换所有动画效果
inputManager.addListener(actionListener, "Transf");
}
private ActionListener actionListener = new ActionListener() {
public void onAction(String name, boolean keyPressed, float tpf) {
if (name.equals("Walk") && !keyPressed) {
if (!channel.getAnimationName().equals("Walk")) {
//设置动画融入,第一个参数是要融入的动画名称,第二个参数是融入动画的时间比,若为零是没有新老动画混合发生,会瞬间进行新的动画
channel.setAnim("Walk", 0.50f);
//循环模式为Loop,也可以设置成不循环。
channel.setLoopMode(LoopMode.Loop);
}
}
if (name.equals("Attack2") && !keyPressed) {
if (!channel.getAnimationName().equals("Attack2")) {
channel.setAnim("Attack2", 0.50f);
channel.setLoopMode(LoopMode.DontLoop);
}
}
if (name.equals("Attack3") && !keyPressed) {
if (!channel.getAnimationName().equals("Attack3")) {
channel.setAnim("Attack3", 0.50f);
channel.setLoopMode(LoopMode.DontLoop);
}
}
if (name.equals("HighJump") && !keyPressed) {
if (!channel.getAnimationName().equals("HighJump")) {
channel.setAnim("HighJump", 0.50f);
channel.setLoopMode(LoopMode.DontLoop);
}
}
//names是通过AnimationControl得到的动画效果名称集合,看上边的代码
if(name.equals("Transf")&& !keyPressed) {
NAME_ID++;
if(NAME_ID>=names.length) {
NAME_ID=0;
}
channel.setAnim((String)names[NAME_ID], 0.50f);
channel.setLoopMode(LoopMode.DontLoop);
}
}
};
}
posted on 2011-08-12 11:28 苏桓(osbert) 阅读(417) 评论(0) 编辑 收藏 举报