-
Walk Bugs emoji:
-
Jump Bugs emoji:
Memo:
-
jMonkeyEngine calls the update() methods of all AppState objects in the order in which you attached them.
-
jMonkeyEngine calls the controlUpdate() methods of all controls in the order in which you added them.
-
jMonkeyEngine calls the simpleUpdate() method of the main SimpleApplication class.
—AbstractPhysicBodyContext
package org.jmonkey3.chasecam;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.bullet.BulletAppState;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public abstract class AbstractPhysicBodyContext extends AbstractAppState
{
private AppStateManager stateManager = null;
//
private static final BulletAppState bulletAppState;
static
{
bulletAppState = new BulletAppState();
}
public AbstractPhysicBodyContext()
{
}
/**
@return the bulletAppState
*/
public BulletAppState getBulletAppState()
{
return bulletAppState;
}
/**
@param stateManager the stateManager to set
Attaching BulletAppstate to Initialize PhysicsSpace
*/
public void attachBulletAppstate(AppStateManager stateManager)
{
this.stateManager = stateManager;
stateManager.attach(bulletAppState);
}
}
—AbstractSpatialBodyContext.java
package org.jmonkey3.chasecam;
import com.jme3.app.state.AbstractAppState;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public abstract class AbstractSpatialBodyContext extends AbstractAppState
{
public AbstractSpatialBodyContext()
{
}
}
—ApplicationContext.java
package org.jmonkey3.chasecam;
import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager;
import com.jme3.input.FlyByCamera;
import com.jme3.input.InputManager;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera;
import com.jme3.scene.Node;
import com.jme3.system.AppSettings;
import org.jmonkey.utils.Debug;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class ApplicationContext extends AbstractAppState
{
private final Node rootNode;
//
private final CameraContext sceneCameraContext;
private final AvatarBodyManager avatarBodyManager;
private final SceneBodyManager sceneBodyManager;
/**
@param stateManager
@param am
@param settings
@param inputManager
@param rootNode
@param cam
@param flyByCam
*/
public ApplicationContext(AppStateManager stateManager, AssetManager am, AppSettings settings, InputManager inputManager, Node rootNode, Camera cam, FlyByCamera flyByCam)
{
this.rootNode = rootNode;
this.sceneCameraContext = new CameraContext(settings, inputManager, cam, flyByCam);
this.sceneBodyManager = new SceneBodyManager(stateManager, am, rootNode);
this.avatarBodyManager = new AvatarBodyManager(am, rootNode, sceneCameraContext);
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
//super.initialize(stateManager, app);
//TODO: initialize your AppState, e.g. attach spatials to rootNode
//this is called on the OpenGL thread after the AppState has been attached
//
stateManager.attach(this.sceneCameraContext);
stateManager.attach(this.sceneBodyManager);//initialize physic spacein constructor
stateManager.attach(this.avatarBodyManager);
//
Debug.showNodeAxes(app.getAssetManager(), this.rootNode, 1024.0f);
Debug.attachWireFrameDebugGrid(app.getAssetManager(), rootNode, Vector3f.ZERO, 2048, ColorRGBA.DarkGray);
}
@Override
public void update(float tpf)
{
}
}
—AvatarAnimationEventListener.java
package org.jmonkey3.chasecam;
import com.jme3.animation.AnimChannel;
import com.jme3.animation.AnimControl;
import com.jme3.animation.AnimEventListener;
import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.bullet.objects.PhysicsCharacter;
import com.jme3.scene.Spatial;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class AvatarAnimationEventListener extends AbstractAppState implements AnimEventListener
{
private final AnimChannel channel;
private final AnimControl control;
private final PlayerInputActionListener pial;
private final AvatarAnimationHelper animHelper;
private final PhysicsCharacter physicBody;
/**
@param pial
@param pc
@param avatarMesh
*/
public AvatarAnimationEventListener(PlayerInputActionListener pial, PhysicsCharacter pc, Spatial avatarMesh)
{
this.pial = pial;
this.control = avatarMesh.getControl(AnimControl.class);
assert (this.control != null);
this.channel = this.control.createChannel();
this.physicBody = pc;
this.animHelper = new AvatarAnimationHelper(this.physicBody, this.channel);
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
this.control.addListener(this);
this.channel.setAnim("Idle1");
this.channel.setSpeed(0.5f);
}
public void onAnimCycleDone(AnimControl control, AnimChannel channel, String animName)
{
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void onAnimChange(AnimControl control, AnimChannel channel, String animName)
{
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
/**
@return the channel
*/
protected AnimChannel getChannel()
{
return channel;
}
/**
@return the control
*/
protected AnimControl getControl()
{
return control;
}
/**
* @return the animHelper
*/
protected AvatarAnimationHelper getAnimHelper()
{
return animHelper;
}
}
—AvatarAnimationHelper.java
package org.jmonkey3.chasecam;
import com.jme3.animation.AnimChannel;
import com.jme3.animation.LoopMode;
import com.jme3.bullet.objects.PhysicsCharacter;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class AvatarAnimationHelper
{
private final AnimChannel animChannel;
private final PhysicsCharacter physicBody;
/**
@param pc
@param ac
*/
public AvatarAnimationHelper(PhysicsCharacter pc, AnimChannel ac)
{
this.animChannel = ac;
this.physicBody = pc;
}
protected void idle()
{
animChannel.setAnim("Idle1");
animChannel.setSpeed(0.5f);
}
protected boolean forward(boolean pressed)
{
if (pressed)
{
if (this.physicBody.onGround())
{
animChannel.setAnim("Walk");
animChannel.setSpeed(AvatarConstants.FORWARD_MOVE_SPEED * 2f);
animChannel.setLoopMode(LoopMode.Loop);
}
return true;
} else
{
idle();
return false;
}
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
protected boolean backward(boolean pressed)
{
if (pressed)
{
return true;
} else
{
return false;
}
}
protected boolean rightward(boolean pressed)
{
if (pressed)
{
return true;
} else
{
return false;
}
}
protected boolean leftward(boolean pressed)
{
if (pressed)
{
return true;
} else
{
return false;
}
}
protected boolean jump(boolean pressed)
{
if (pressed)
{
if (this.physicBody.onGround())
{
animChannel.setAnim("HighJump");
animChannel.setSpeed(AvatarConstants.FORWARD_MOVE_SPEED / 1.8f);
animChannel.setLoopMode(LoopMode.DontLoop);
//
this.physicBody.jump();
}
return true;
} else
{
return false;
}
}
}
—AvatarBodyManager.java
package org.jmonkey3.chasecam;
import com.jme3.app.Application;
import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager;
import com.jme3.bullet.control.BetterCharacterControl;
import com.jme3.bullet.objects.PhysicsCharacter;
import com.jme3.input.ChaseCamera;
import com.jme3.input.InputManager;
import com.jme3.renderer.Camera;
import com.jme3.scene.Node;
import org.jmonkey.utils.Debug;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class AvatarBodyManager extends AbstractPhysicBodyContext
{
private InputManager inputManager;
private final Node rootNode;
//
private final CameraContext cc;
private final Camera cam;
private final ChaseCamera chaseCam;
//
private final AvatarPhysicBodyContext apbc;
private final AvatarSpatialBodyContext asbc;
//
private final PhysicsCharacter physicBody;
private final Node avatar;
private final BetterCharacterControl bcc;
//
private final PlayerInputActionListener playerInputListener;
/**
@param am
@param rootNode
@param cc
*/
public AvatarBodyManager(AssetManager am, Node rootNode, CameraContext cc)
{
//
this.rootNode = rootNode;
//
this.asbc = new AvatarSpatialBodyContext(am, rootNode);
this.apbc = new AvatarPhysicBodyContext();
//
this.physicBody = apbc.getPhysicBody();
this.avatar = asbc.getAvatar();
this.bcc = new BetterCharacterControl(AvatarConstants.COLLISION_SHAPE_RADIUS, AvatarConstants.COLLISION_SHAPE_RADIUS * 2, AvatarConstants.PHYSIC_BODY_MASS);
//
this.playerInputListener = new PlayerInputActionListener(this.physicBody, this.asbc.getAvatarMesh());
//
this.cc = cc;
this.cam = cc.getCam();
this.chaseCam = cc.getChaseCam();
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
//TODO: initialize your AppState, e.g. attach spatials to rootNode
//this is called on the OpenGL thread after the AppState has been attached
stateManager.attach(this.asbc);
stateManager.attach(this.apbc);
stateManager.attach(this.playerInputListener);
//
this.avatar.addControl(new AvatarBodyMoveControl(playerInputListener, physicBody, cam));
this.avatar.addControl(chaseCam);
this.avatar.addControl(bcc);
//DEBUG
Debug.showNodeAxes(app.getAssetManager(), avatar, 4);
getBulletAppState().getPhysicsSpace().enableDebug(app.getAssetManager());
}
@Override
public void update(float tpf)
{
//assert (sceneCameraContext != null);
//correctDirectionVectors(cam.getDirection(), cam.getLeft());
}
}
—AvatarBodyMoveControl.java
package org.jmonkey3.chasecam;
import com.jme3.bullet.control.BetterCharacterControl;
import com.jme3.bullet.objects.PhysicsCharacter;
import com.jme3.math.Vector3f;
import com.jme3.renderer.Camera;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.control.AbstractControl;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class AvatarBodyMoveControl extends AbstractControl
{
private final Camera cam;
private final PhysicsCharacter physicBody;
private final PlayerInputActionListener pial;
/**
@param pial
@param physicBody
@param cam
*/
public AvatarBodyMoveControl(PlayerInputActionListener pial, PhysicsCharacter physicBody, Camera cam)
{
this.pial = pial;
this.physicBody = physicBody;
this.cam = cam;
}
private final Vector3f walkDirection = new Vector3f();
@Override
protected void controlUpdate(float tpf)
{
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
correctDirectionVectors();
}
@Override
protected void controlRender(RenderManager rm, ViewPort vp)
{
//throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
/**
@param camDir
@param camLeft
*/
public void correctDirectionVectors()
{
// assert (camDir != null);
// assert (camLeft != null);
// assert (walkDirection != null);
//Affect forward, backward move speed 0.6f lower - 1.0f faster
Vector3f camDirVector = cam.getDirection().clone().multLocal(AvatarConstants.FORWARD_MOVE_SPEED);
//Affect left, right move speed 0.6f lower - 1.0f faster
Vector3f camLeftVector = cam.getLeft().clone().multLocal(AvatarConstants.SIDEWARD_MOVE_SPEED);
walkDirection.set(0, 0, 0);//critical
if (pial.isLeftward())
{
walkDirection.addLocal(camLeftVector);
}
if (pial.isRightward())
{
walkDirection.addLocal(camLeftVector.negate());
}
if (pial.isForward())
{
walkDirection.addLocal(camDirVector);
}
if (pial.isBackward())
{
//@TODO Bug if cam direction (0, -n, 0) - character fly upwards ;)
walkDirection.addLocal(camDirVector.negate());
}
physicBody.setWalkDirection(walkDirection);//Critical
//Avoid vibration
spatial.setLocalTranslation(physicBody.getPhysicsLocation());
//Translate Node accordingly
spatial.getControl(BetterCharacterControl.class).warp(physicBody.getPhysicsLocation());
//Rotate Node accordingly to camera
spatial.getControl(
BetterCharacterControl.class).setViewDirection(
cam.getDirection().negate());
}
}
—AvatarConstants.java
package org.jmonkey3.chasecam;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class AvatarConstants
{
public static final float COLLISION_SHAPE_CENTERAL_POINT = 0.0f;
public static final float COLLISION_SHAPE_RADIUS = 4.0f;
//
public static final float PHYSIC_BODY_MASS = 1.0f;
public static float FORWARD_MOVE_SPEED = 0.8f;
public static float SIDEWARD_MOVE_SPEED = 0.6f;
}
—AvatarPhysicBodyContext.java
package org.jmonkey3.chasecam;
import com.jme3.app.Application;
import com.jme3.app.state.AppStateManager;
import com.jme3.bullet.collision.shapes.SphereCollisionShape;
import com.jme3.bullet.objects.PhysicsCharacter;
import com.jme3.math.Vector3f;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class AvatarPhysicBodyContext extends AbstractPhysicBodyContext
{
private final PhysicsCharacter physicBody;
public AvatarPhysicBodyContext()
{
this.physicBody = new PhysicsCharacter(new SphereCollisionShape(AvatarConstants.COLLISION_SHAPE_RADIUS), .01f);
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
//
assert (getBulletAppState() != null);
System.out.println(this.getClass().getName() + ".getBulletAppState().hashCode() = " + getBulletAppState().hashCode());
//
this.physicBody.setJumpSpeed(32);
this.physicBody.setFallSpeed(32);
this.physicBody.setGravity(32);
this.physicBody.setPhysicsLocation(new Vector3f(0, 10, 0));
//
getBulletAppState().getPhysicsSpace().add(this.physicBody);
}
@Override
public void update(float tpf)
{
}
@Override
public void cleanup()
{
super.cleanup();
}
/**
@return the physicBody
*/
public PhysicsCharacter getPhysicBody()
{
return this.physicBody;
}
}
—AvatarSpatialBodyContext.java
package org.jmonkey3.chasecam;
import com.jme3.app.Application;
import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
import com.jme3.scene.Spatial;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class AvatarSpatialBodyContext extends AbstractSpatialBodyContext
{
//
private final Node rootNode;
//
private final Node avatar;
private final Spatial avatarMesh;
private final Vector3f correction;
/**
@param am
@param rootNode
*/
public AvatarSpatialBodyContext(AssetManager am, Node rootNode)
{
this.rootNode = rootNode;
//
this.avatar = new Node();
this.avatarMesh = am.loadModel("Models/Ninja/Ninja.mesh.xml");
this.correction = new Vector3f(
0,
AvatarConstants.COLLISION_SHAPE_CENTERAL_POINT - AvatarConstants.COLLISION_SHAPE_RADIUS,
0);
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
this.avatarMesh.setLocalScale(new Vector3f(0.05f, 0.05f, 0.05f));//Trouble with scales?
this.avatarMesh.setLocalTranslation(this.correction);
this.avatar.attachChild(this.avatarMesh);
this.rootNode.attachChild(this.avatar);
//super.initialize(stateManager, app); //To change body of generated methods, choose Tools | Templates.
}
/**
@return the avatar
*/
public Node getAvatar()
{
return avatar;
}
/**
* @return the avatarMesh
*/
public Spatial getAvatarMesh()
{
return avatarMesh;
}
}
—CameraContext.java
package org.jmonkey3.chasecam;
import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.input.ChaseCamera;
import com.jme3.input.FlyByCamera;
import com.jme3.input.InputManager;
import com.jme3.renderer.Camera;
import com.jme3.system.AppSettings;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class CameraContext extends AbstractAppState
{
private final AppSettings settings;
private final InputManager inputManager;
/*
http://hub.jmonkeyengine.org/javadoc/com/jme3/renderer/Camera.html
public class Camera
extends java.lang.Object
implements Savable, java.lang.Cloneable
Width and height are set to the current Application's settings.getWidth() and settings.getHeight() values.
Frustum Perspective:
Frame of view angle of 45° along the Y axis
Aspect ratio of width divided by height
Near view plane of 1 wu
Far view plane of 1000 wu
Start location at (0f, 0f, 10f).
Start direction is looking at the origin.
*/
private final Camera cam;
/*
http://hub.jmonkeyengine.org/javadoc/com/jme3/input/ChaseCamera.html
public class ChaseCamera
extends java.lang.Object
implements ActionListener, AnalogListener, Control
A camera that follows a spatial and can turn around it by dragging the mouse
Constructs the chase camera, and registers inputs if you use this
constructor you have to attach the cam later to a spatial doing
spatial.addControl(chaseCamera);
*/
private final ChaseCamera chaseCam;
private final FlyByCamera flyByCam;
/**
@param settings
@param inputManager
@param cam
@param flyByCam
*/
public CameraContext(AppSettings settings, InputManager inputManager, Camera cam, FlyByCamera flyByCam)
{
assert (settings != null);
this.settings = settings;
assert (inputManager != null);
this.inputManager = inputManager;
assert (cam != null);
this.cam = cam;
assert (flyByCam != null);
this.flyByCam = flyByCam;
this.chaseCam = new ChaseCamera(this.cam, this.inputManager);
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
super.initialize(stateManager, app);
//TODO: initialize your AppState, e.g. attach spatials to rootNode
//this is called on the OpenGL thread after the AppState has been attached
this.cam.setFrustumPerspective(116.0f, (settings.getWidth() / settings.getHeight()), 1.0f, 2000.0f);
//this.flyByCam.setMoveSpeed(100);
this.flyByCam.setEnabled(false);
}
/**
@return the cam
*/
public Camera getCam()
{
return cam;
}
/**
@return the chaseCam
*/
public ChaseCamera getChaseCam()
{
return chaseCam;
}
}
—PlayerInputActionListener.java
package org.jmonkey3.chasecam;
import com.jme3.app.Application;
import com.jme3.app.state.AbstractAppState;
import com.jme3.app.state.AppStateManager;
import com.jme3.bullet.objects.PhysicsCharacter;
import com.jme3.input.KeyInput;
import com.jme3.input.controls.ActionListener;
import com.jme3.input.controls.KeyTrigger;
import com.jme3.scene.Spatial;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class PlayerInputActionListener extends AbstractAppState implements ActionListener
{
private final PhysicsCharacter physicBody;
//
private boolean leftward = false;
private boolean rightward = false;
private boolean forward = false;
private boolean backward = false;
private boolean jump = false;
private final AvatarAnimationEventListener aael;
/**
@param pc
@param avatar
*/
public PlayerInputActionListener(PhysicsCharacter pc, Spatial avatar)
{
this.physicBody = pc;
this.aael = new AvatarAnimationEventListener(this, this.physicBody, avatar);
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
stateManager.attach(this.aael);
//
app.getInputManager().addMapping("LEFTWARD", new KeyTrigger(KeyInput.KEY_A));
app.getInputManager().addMapping("RIGHTWARD", new KeyTrigger(KeyInput.KEY_D));
app.getInputManager().addMapping("FORWARD", new KeyTrigger(KeyInput.KEY_W));
app.getInputManager().addMapping("BACKWARD", new KeyTrigger(KeyInput.KEY_S));
app.getInputManager().addMapping("JUMP", new KeyTrigger(KeyInput.KEY_SPACE));
app.getInputManager().addListener(this, "LEFTWARD");
app.getInputManager().addListener(this, "RIGHTWARD");
app.getInputManager().addListener(this, "FORWARD");
app.getInputManager().addListener(this, "BACKWARD");
app.getInputManager().addListener(this, "JUMP");
//
}
/**
@param binding
@param keyPressed
@param tpf
*/
public void onAction(String binding, boolean keyPressed, float tpf)
{
if (binding.equals("LEFTWARD"))
{
this.leftward = this.aael.getAnimHelper().leftward(keyPressed);
} else if (binding.equals("RIGHTWARD"))
{
this.rightward = this.aael.getAnimHelper().rightward(keyPressed);
} else if (binding.equals("FORWARD"))
{
this.forward = this.aael.getAnimHelper().forward(keyPressed);
} else if (binding.equals("BACKWARD"))
{
this.backward = this.aael.getAnimHelper().backward(keyPressed);
} else if (binding.equals("JUMP"))
{
this.jump = this.aael.getAnimHelper().jump(keyPressed);
}
}
/**
@return the leftward
*/
public boolean isLeftward()
{
return this.leftward;
}
/**
@return the rightward
*/
public boolean isRightward()
{
return this.rightward;
}
/**
@return the forward
*/
public boolean isForward()
{
return this.forward;
}
/**
@return the backward
*/
public boolean isBackward()
{
return this.backward;
}
/**
@return the jump
*/
public boolean isJump()
{
return this.jump;
}
}
—SceneBodyManager.java
package org.jmonkey3.chasecam;
import com.jme3.app.Application;
import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager;
import com.jme3.scene.Node;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class SceneBodyManager extends AbstractPhysicBodyContext
{
private final ScenePhysicBodyContext spbc;
private final SceneSpatialBodyContext ssbc;
/**
@param stateManager
@param am
@param rootNode
*/
public SceneBodyManager(AppStateManager stateManager, AssetManager am, Node rootNode)
{
this.ssbc = new SceneSpatialBodyContext(am, rootNode);
this.spbc = new ScenePhysicBodyContext(ssbc.getScene());
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
//PhysicsSpace Initialization
attachBulletAppstate(stateManager);
//
stateManager.attach(this.ssbc);
stateManager.attach(this.spbc);
}
}
—ScenePhysicBodyContext.java
package org.jmonkey3.chasecam;
import com.jme3.app.Application;
import com.jme3.app.state.AppStateManager;
import com.jme3.bullet.control.RigidBodyControl;
import com.jme3.scene.Node;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class ScenePhysicBodyContext extends AbstractPhysicBodyContext
{
private final RigidBodyControl rigidBodyControl;
private final Node scene;
/**
@param scene
*/
public ScenePhysicBodyContext(Node scene)
{
this.scene = scene;
this.rigidBodyControl = new RigidBodyControl(.0f);
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
//
//Add scene to PhysicsSpace
System.out.println(this.getClass().getName() + ".getBulletAppState().hashCode() = " + getBulletAppState().hashCode());
scene.addControl(rigidBodyControl);
getBulletAppState().getPhysicsSpace().addAll(scene);
}
}
—SceneSpatialBodyContext.java
package org.jmonkey3.chasecam;
import com.jme3.app.Application;
import com.jme3.app.state.AppStateManager;
import com.jme3.asset.AssetManager;
import com.jme3.asset.plugins.ZipLocator;
import com.jme3.light.AmbientLight;
import com.jme3.light.DirectionalLight;
import com.jme3.math.Vector3f;
import com.jme3.scene.Node;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class SceneSpatialBodyContext extends AbstractSpatialBodyContext
{
private final Node rootNode;
//
private final Node scene;
private AmbientLight ambient;
private DirectionalLight sun;
/**
@param am
@param rootNode
*/
public SceneSpatialBodyContext(AssetManager am, Node rootNode)
{
this.rootNode = rootNode;
//
am.registerLocator("town.zip", ZipLocator.class);
this.scene = (Node) am.loadModel("main.scene");
this.ambient = new AmbientLight();
this.sun = new DirectionalLight();
}
@Override
public void initialize(AppStateManager stateManager, Application app)
{
//Main Scene loading
this.scene.setLocalScale(0.1f);
this.scene.scale(32.0f);
//
this.sun.setDirection(new Vector3f(1.4f, -1.4f, -1.4f));
this.scene.setLocalTranslation(Vector3f.ZERO);
//
rootNode.attachChild(this.scene);
rootNode.addLight(this.ambient);
rootNode.addLight(this.sun);
}
/**
@return the scene
*/
public Node getScene()
{
return scene;
}
}
—TheGame.java
package org.jmonkey3.chasecam;
import com.jme3.app.SimpleApplication;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class TheGame extends SimpleApplication
{
private ApplicationContext applicationContext;
public TheGame()
{
}
//
public static void main(String[] args)
{
TheGame game = new TheGame();
game.setShowSettings(false);
game.start();
}
@Override
public void simpleInitApp()
{
this.applicationContext = new ApplicationContext(stateManager, assetManager, settings, inputManager, rootNode, cam, flyCam);
//
stateManager.attach(applicationContext);
}
}
—Debug.java
package org.jmonkey.utils;
import com.jme3.animation.AnimControl;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Node;
import com.jme3.scene.debug.Arrow;
import com.jme3.scene.debug.Grid;
import com.jme3.scene.debug.SkeletonDebugger;
import com.jme3.scene.shape.Line;
import static org.jmonkey.utils.SpatialUtils.makeGeometry;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class Debug
{
public static void showNodeAxes(AssetManager am, Node n, float axisLen)
{
Vector3f v = new Vector3f(axisLen, 0, 0);
Arrow a = new Arrow(v);
Material mat = new Material(am, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Red);
Geometry geom = new Geometry(n.getName() + "XAxis", a);
geom.setMaterial(mat);
n.attachChild(geom);
//
v = new Vector3f(0, axisLen, 0);
a = new Arrow(v);
mat = new Material(am, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Green);
geom = new Geometry(n.getName() + "YAxis", a);
geom.setMaterial(mat);
n.attachChild(geom);
//
v = new Vector3f(0, 0, axisLen);
a = new Arrow(v);
mat = new Material(am, "Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", ColorRGBA.Blue);
geom = new Geometry(n.getName() + "ZAxis", a);
geom.setMaterial(mat);
n.attachChild(geom);
}
//
public static void showVector3fArrow(AssetManager am, Node n, Vector3f v, ColorRGBA color, String name)
{
Arrow a = new Arrow(v);
Material mat = MaterialUtils.makeMaterial(am, "Common/MatDefs/Misc/Unshaded.j3md", color);
Geometry geom = makeGeometry(a, mat, name);
n.attachChild(geom);
}
public static void showVector3fLine(AssetManager am, Node n, Vector3f v, ColorRGBA color, String name)
{
Line l = new Line(v.subtract(v), v);
Material mat = MaterialUtils.makeMaterial(am, "Common/MatDefs/Misc/Unshaded.j3md", color);
Geometry geom = makeGeometry(l, mat, name);
n.attachChild(geom);
}
//Skeleton Debugger
public static void attachSkeleton(AssetManager am, Node player, AnimControl control)
{
SkeletonDebugger skeletonDebug = new SkeletonDebugger("skeleton", control.getSkeleton());
Material mat2 = new Material(am, "Common/MatDefs/Misc/Unshaded.j3md");
mat2.setColor("Color", ColorRGBA.Yellow);
mat2.getAdditionalRenderState().setDepthTest(false);
skeletonDebug.setMaterial(mat2);
player.attachChild(skeletonDebug);
}
///
public static void attachWireFrameDebugGrid(AssetManager assetManager, Node n, Vector3f pos, Integer size, ColorRGBA color)
{
Geometry g = new Geometry("wireFrameDebugGrid", new Grid(size, size, 1.0f));//1WU
Material mat = new Material(assetManager, "Common/MatDefs/Misc/Unshaded.j3md");
mat.getAdditionalRenderState().setWireframe(true);
mat.setColor("Color", color);
g.setMaterial(mat);
g.center().move(pos);
n.attachChild(g);
}
}
—MaterialUtils.java
package org.jmonkey.utils;
import com.jme3.asset.AssetManager;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
/*
Chase camera (aka 3rd person camera) example
Based on official TestQ3.java
@author Alex Cham aka Jcrypto
*/
public class MaterialUtils
{
public MaterialUtils()
{
}
//"Common/MatDefs/Misc/Unshaded.j3md"
public static Material makeMaterial(AssetManager am, String name, ColorRGBA color)
{
Material mat = new Material(am, name);
mat.setColor("Color", color);
return mat;
}
}
—SpatialUtils.java
package org.jmonkey.utils;
import com.jme3.material.Material;
import com.jme3.math.Vector3f;
import com.jme3.scene.Geometry;
import com.jme3.scene.Mesh;
import com.jme3.scene.Node;
/**
@author java
*/
public class SpatialUtils
{
//
public static Node makeNode(String name)
{
Node n = new Node(name);
return n;
}
//
public static Geometry makeGeometry(Mesh mesh, Material mat, String name)
{
Geometry geom = new Geometry(name, mesh);
geom.setMaterial(mat);
return geom;
}
//
public static Geometry makeGeometry(Vector3f loc, Vector3f scl, Mesh mesh, Material mat, String name)
{
Geometry geom = new Geometry(name, mesh);
geom.setMaterial(mat);
geom.setLocalTranslation(loc);
geom.setLocalScale(scl);
return geom;
}
}