The steer behaviours AI is integrated with MonkeyBrains so before start coding be sure that you have checked the monkey brains documentation
Be sure to create a reference to MonkeyBrains from your project.
Finally, do not forget to import the com.jme3.ai.agents.behaviors.npc.steering
package.
Avaliable behaviours:
All the behaviours extend from the AbstractSteeringBehavior
class.
Create instances from the steer behaviour classes, They are located in the com.jme3.ai.agents.behaviors.npc.steering
package.
If we want to add more than one steer behavior, we need to create a container:
SimpleMainBehavior
it will cause problems in the rotation of the agents.
Container | Purpose |
---|---|
CompoundSteeringBehavior | Contains and merges several AbstractSteeringBehavior instances |
BalancedCompoundSteeringBehavior | Each force generated inside this container is reduced in relation with a proportion factor: "Partial Force" / "Total container force" |
Once we know which container fits better for our agent, We create a new instance and add all the behaviors that we need:
SimpleMainBehaviour mainBehavior = new SimpleMainBehavior(myAgent); CompoundSteeringBehavior steer = new CompoundSteeringBehavior(myAgent); //BalancedCompoundSteeringBehavior steer = new BalancedCompoundSteeringBehavior(myAgent); steer.addSteerBehavior(steerBehavior1); steer.addSteerBehavior(steerBehavior2); mainBehaviour.addBehavior(steer); myAgent.setMainBehavior(mainBehavior);
SimpleMainBehaviour mainBehavior = new SimpleMainBehavior(myAgent); CompoundSteeringBehavior steer = new CompoundSteeringBehavior(myAgent); BalancedCompoundSteeringBehavior nestedSteer = new BalancedCompoundSteeringBehavior(myAgent); nestedSteer.addSteerBehavior(steerBehavior1); steer.addSteerBehavior(nestedSteer); steer.addSteerBehavior(steerBehavior2); mainBehavior.addBehavior(steer); myAgent.setMainBehavior(mainBehavior);
You can assign priority layers: The steering controller first checks the higher layer to see if all the behaviors returns a value higher than minLengthToInvalidSteer
, if so it uses that layer. Otherwise, it moves on to the second layer, and so on.
To assign priority layers add behaviors with the following function:
addSteerBehavior (AbstractSteeringBehavior behavior, int priority, float minLengthToInvalidSteer)
If a behavior extends from the AbstractStrengthSteeringBehavior
class, you can manage how the produced forces will work.
Use setupStrengthControl(float scalar)
to increase/decrease the steer force produced by a behavior or setupStrengthControl(Plane plane)
If you want to work with 2D behaviors.
Example:
Plane horizontalPlane = new Plane(new Vector3f(0,1,0), 0); steerBehavior1.setupStrengthControl(0.5f); //Force reduced a 50% steerBehavior2.setupStrengthControl(horizontalPlane); //Force contained in the XZ plane steerContainer.setupStrengthControl(horizontalPlane, 2f); //Contained in the XZ plane and increased a 100%
To benefit from all the features, you have to create a new class that extends from AbstractStrengthSteeringBehavior
.
The responsible for the agent's acceleration is the vector returned in the calculateRawSteering()
method:
@Override protected Vector3f calculateRawSteering() { Vector3f steerForce = Vector3f.ZERO; //calculations return steerForce; }
In addition, you can change a brake factor which will reduce the resultant velocity for the agent:
@Override protected Vector3f calculateRawSteering(){ this.setBrakingFactor(0.5f); //The agent's velocity will be reduced a 50% return Vector3f.ZERO; }
To ensure that the behavior will work as you had planned it to work It's recommended to create your own IllegalArgumentException class. To do this, create your own container class extending from com.jme3.ai.agents.behaviors.npc.steering.SteeringExceptions
; Each exception inside the container class extends from SteeringBehaviorException
. Furthermore, It will help users to recognize better which is the origin of any problem.
Example:
public class CustomSteeringExceptions extends SteeringExceptions { public static class CustomRuntimeException extends SteeringBehaviorException { public CustomRuntimeException(String msg) { super(msg); } } // ... other exceptions ... }
public SteerBehaviorConstructor(Agent agent, int value, Spatial spatial) { super(agent, spatial); if(value > 5) throw new CustomSteeringExceptions.customRuntimeException ("Value must be lower than 5"); this.value = value; }
Copyright (c) 2014, Jesús Martín Berlanga. All rights reserved.
Licensed under a Creative Commons Attribution 3.0 Unported License.