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编辑  收藏  举报

导航