Spatials can be under control of different influences.

Here 3 state control classes are written. This is Control1.java with controlUpdate() rotating a spatial.

// Control1.java
package mygame;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.control.AbstractControl;
class Control1 extends AbstractControl{
@Override
protected void controlUpdate(float tpf) {
spatial.rotate(tpf,tpf,tpf);
}
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
}
}
This is Control2.java with override for contorlUpdate(). It oscillates x motion.

// Control2.java
package mygame;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.control.AbstractControl;
class Control2 extends AbstractControl{
private float current0, current;
private int sign;
public void Control2() {
current0 = spatial.getLocalTranslation().x;
}
@Override
protected void controlUpdate(float tpf) {
current = spatial.getLocalTranslation().x;
if ((current-current0)<-1f) {
sign = 1;
}
if ((current-current0)>1f) {
sign = -1;
}
spatial.move(sign*tpf,0,0);
}
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
}
}
This is Control3.java with override for controlUpdate(). It oscillates y motion.

// Control3.java
package mygame;
import com.jme3.renderer.RenderManager;
import com.jme3.renderer.ViewPort;
import com.jme3.scene.control.AbstractControl;
class Control3 extends AbstractControl {
private float current0, current;
private int sign;
public void Control3() {
current0 = spatial.getLocalTranslation().y;
}
@Override
protected void controlUpdate(float tpf) {
current = spatial.getLocalTranslation().y;
if ((current-current0)<-1f) {
sign = 1;
}
if ((current-current0)>1f) {
sign = -1;
}
spatial.move(0,sign*tpf,0);
}
@Override
protected void controlRender(RenderManager rm, ViewPort vp) {
}
}
We create spatial Geometries and then attach them to different controls.

// *** 1. Start (adding controls to boxes)
geom1 = makeGeometry( new Vector3f(.2f,.2f,.2f),
new Vector3f(0,0,0));
geom1.addControl(control1a); // Control1
geom2 = makeGeometry( new Vector3f(.2f,.2f,.2f),
new Vector3f(2.5f,2.5f,0));
geom2.addControl(control2a); // Control2
geom3 = makeGeometry( new Vector3f(.2f,.2f,.2f),
new Vector3f(-2.5f,-2.5f,0));
geom3.addControl(control3a); // Control 3
geom4 = makeGeometry( new Vector3f(.5f,.5f,.5f),
new Vector3f(2,-2,-1));
geom4.addControl(control1b);
geom4.addControl(control3b);
geom4.addControl(control2b); // All 3 Controls
// *** 1. End
The spatial Geometries are created by this function.

// *** 2. Start (Create box geometry given size + location)
Box b = new Box(size.x, size.y, size.z);
Geometry geom = new Geometry("Box", b);
Material mat = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", col[count++]);
geom.setMaterial(mat);
geom.setLocalTranslation(loc);
return geom;
// *** 2. End
// JMonkey42.java
package mygame;
import com.jme3.app.SimpleApplication;
import com.jme3.material.Material;
import com.jme3.math.ColorRGBA;
import com.jme3.math.Vector3f;
import com.jme3.renderer.RenderManager;
import com.jme3.scene.Geometry;
import com.jme3.scene.shape.Box;
import com.jme3.system.AppSettings;
public class JMonkey42 extends SimpleApplication {
public static void main(String[] args) {
AppSettings settings = new AppSettings(true);
settings.setFrameRate(60);
settings.setTitle(
"Boxes under different controls and multiple controls!");
JMonkey42 app = new JMonkey42();
app.setSettings(settings);
app.start();
}
Control1 control1a, control1b;
Control2 control2a, control2b;
Control3 control3a, control3b;
Geometry geom1, geom2, geom3, geom4;
final static ColorRGBA[] col = { ColorRGBA.Blue, ColorRGBA.Cyan,
ColorRGBA.Green,ColorRGBA.Red}; // constant
static int count = 0; // class variable
@Override
public void simpleInitApp() {
viewPort.setBackgroundColor(ColorRGBA.White);
setDisplayFps(false);
setDisplayStatView(false);
flyCam.setEnabled(false);
control1a = new Control1();
control1b = new Control1();
control2a = new Control2();
control2b = new Control2();
control3a = new Control3();
control3b = new Control3();
// *** 1. Start (adding controls to boxes)
geom1 = makeGeometry( new Vector3f(.2f,.2f,.2f),
new Vector3f(0,0,0));
geom1.addControl(control1a); // Control1
geom2 = makeGeometry( new Vector3f(.2f,.2f,.2f),
new Vector3f(2.5f,2.5f,0));
geom2.addControl(control2a); // Control2
geom3 = makeGeometry( new Vector3f(.2f,.2f,.2f),
new Vector3f(-2.5f,-2.5f,0));
geom3.addControl(control3a); // Control 3
geom4 = makeGeometry( new Vector3f(.5f,.5f,.5f),
new Vector3f(2,-2,-1));
geom4.addControl(control1b);
geom4.addControl(control3b);
geom4.addControl(control2b); // All 3 Controls
// *** 1. End
rootNode.attachChild(geom1);
rootNode.attachChild(geom2);
rootNode.attachChild(geom3);
rootNode.attachChild(geom4);
}
private Geometry makeGeometry(Vector3f size, Vector3f loc) {
// *** 2. Start (Create box geometry given size + location)
Box b = new Box(size.x, size.y, size.z);
Geometry geom = new Geometry("Box", b);
Material mat = new Material(assetManager,
"Common/MatDefs/Misc/Unshaded.j3md");
mat.setColor("Color", col[count++]);
geom.setMaterial(mat);
geom.setLocalTranslation(loc);
return geom;
// *** 2. End
}
@Override
public void simpleUpdate(float tpf) {
}
@Override
public void simpleRender(RenderManager rm) {
}
}
Output:
No comments:
Post a Comment