//Copyright (c) 2014, Jesús Martín Berlanga. All rights reserved.
//Distributed under the BSD licence. Read "com/jme3/ai/license.txt".
package steeringDemos.demos;
import com.jme3.ai.agents.Agent;
import com.jme3.ai.agents.behaviors.npc.steering.BalancedCompoundSteeringBehavior;
import com.jme3.ai.agents.behaviors.npc.steering.SeekBehavior;
import com.jme3.ai.agents.behaviors.npc.SimpleMainBehavior;
import com.jme3.ai.agents.behaviors.npc.steering.CompoundSteeringBehavior;
import com.jme3.ai.agents.behaviors.npc.steering.EvadeBehavior;
import com.jme3.ai.agents.behaviors.npc.steering.RelativeWanderBehavior;
import com.jme3.math.FastMath;
import com.jme3.math.Vector3f;
import steeringDemos.BasicDemo;
import steeringDemos.control.CustomSteerControl;
/**
* Evade demo - Similar to the Flee Demo but using evade
*
* @author Jesús Martín Berlanga
* @version 2.0.1
*/
public class EvadeDemo extends BasicDemo {
public static void main(String[] args) {
EvadeDemo app = new EvadeDemo();
app.start();
}
@Override
public void simpleInitApp() {
this.steerControl = new CustomSteerControl(11, 15);
this.steerControl.setCameraSettings(getCamera());
this.steerControl.setFlyCameraSettings(getFlyByCamera());
//defining rootNode for brainsAppState processing
brainsAppState.setApp(this);
brainsAppState.setGameControl(this.steerControl);
Vector3f[] spawnArea = null;
this.numberNeighbours = 20;
Agent target = this.createBoid("Target", this.targetColor, 0.1f);
brainsAppState.addAgent(target); //Add the target to the brainsAppState
brainsAppState.getGameControl().spawn(target, new Vector3f(
(FastMath.nextRandomFloat() - 0.5f) * 5,
(FastMath.nextRandomFloat() - 0.5f) * 5,
(FastMath.nextRandomFloat() - 0.5f) * 5));
this.setStats(
target,
this.targetMoveSpeed,
this.targetRotationSpeed,
this.targetMass,
this.targetMaxForce);
Agent[] neighbours = new Agent[this.numberNeighbours];
for (int i = 0; i < this.numberNeighbours; i++) {
neighbours[i] = this.createBoid("Neighbour " + i, this.neighboursColor, 0.1f);
brainsAppState.addAgent(neighbours[i]); //Add the neighbours to the brainsAppState
this.setStats(
neighbours[i],
this.neighboursMoveSpeed,
this.neighboursRotationSpeed,
this.neighboursMass,
this.neighboursMaxForce);
brainsAppState.getGameControl().spawn(neighbours[i], spawnArea);
}
for (int i = 0; i < neighbours.length; i++) {
SimpleMainBehavior neighboursMainBehavior = new SimpleMainBehavior(neighbours[i]);
CompoundSteeringBehavior compound = new CompoundSteeringBehavior(neighbours[i]);
RelativeWanderBehavior wander = new RelativeWanderBehavior(
neighbours[i],
10,
10,
10,
0.25f);
wander.setupStrengthControl(0.37f);
compound.addSteerBehavior(wander);
compound.addSteerBehavior(new SeekBehavior(neighbours[i], target));
neighboursMainBehavior.addBehavior(compound);
neighbours[i].setMainBehavior(neighboursMainBehavior);
}
SimpleMainBehavior evaderMainBehavior = new SimpleMainBehavior(target);
BalancedCompoundSteeringBehavior balancedCompoundSteeringBehavior = new BalancedCompoundSteeringBehavior(target);
for (int i = 0; i < neighbours.length; i++) {
EvadeBehavior evadeBehavior = new EvadeBehavior(target, neighbours[i]);
balancedCompoundSteeringBehavior.addSteerBehavior(evadeBehavior);
}
evaderMainBehavior.addBehavior(balancedCompoundSteeringBehavior);
target.setMainBehavior(evaderMainBehavior);
brainsAppState.start();
}
@Override
public void simpleUpdate(float tpf) {
brainsAppState.update(tpf);
}
}