import Vector from '../../math/Vector'; import Location from '../../utils/Location'; import Limiter from '../Limiter'; import Steerable from '../Steerable'; import SteeringAcceleration from '../SteeringAcceleration'; import Face from './Face'; /** * {@code Wander} behavior is designed to produce a steering acceleration that will give the impression of a random walk through * the agent's environment. You'll often find it a useful ingredient when creating an agent's behavior. *

* There is a circle in front of the owner (where front is determined by its current facing direction) on which the target is * constrained. Each time the behavior is run, we move the target around the circle a little, by a random amount. Now there are 2 * ways to implement wander behavior: *

* In either case, the orientation of the owner is retained between calls (so smoothing the changes in orientation). The angles * that the edges of the circle subtend to the owner determine how fast it will turn. If the target is on one of these extreme * points, it will turn quickly. The target will twitch and jitter around the edge of the circle, but the owner's orientation will * change smoothly. *

* This implementation uses the second approach. However, if you manually align owner's orientation to its linear velocity on each * time step, {@link Face} behavior should not be used (which is the default case). On the other hand, if the owner has * independent facing you should explicitly call {@link #setFaceEnabled(boolean) setFaceEnabled(true)} before using Wander * behavior. *

* Note that this behavior internally calls the {@link Timepiece#getTime() GdxAI.getTimepiece().getTime()} method to get the * current AI time and make the {@link #wanderRate} FPS independent. This means that *

*

* This steering behavior can be used to produce a whole range of random motion, from very smooth undulating turns to wild * Strictly Ballroom type whirls and pirouettes depending on the size of the circle, its distance from the agent, and the amount * of random displacement each frame. * * @param Type of vector, either 2D or 3D, implementing the {@link Vector} interface * * @author davebaol */ declare class Wander> extends Face { /** The forward offset of the wander circle */ protected wanderOffset: number; /** The radius of the wander circle */ protected wanderRadius: number; /** The rate, expressed in radian per second, at which the wander orientation can change */ protected wanderRate: number; /** The last time the orientation of the wander target has been updated */ protected lastTime: number; /** The current orientation of the wander target */ protected wanderOrientation: number; /** * The flag indicating whether to use {@link Face} behavior or not. This should be set to {@code true} when independent facing * is used. */ protected faceEnabled: boolean; private internalTargetPosition; private wanderCenter; private getDeltaTime; /** * Creates a {@code Wander} behavior for the specified owner. * @param owner the owner of this behavior. */ constructor(owner: Steerable, getDeltaTime: () => number); /** Returns the forward offset of the wander circle. */ getWanderOffset(): number; /** * Sets the forward offset of the wander circle. * @return this behavior for chaining. */ setWanderOffset(wanderOffset: number): Wander; /** Returns the radius of the wander circle. */ getWanderRadius(): number; /** * Sets the radius of the wander circle. * @return this behavior for chaining. */ setWanderRadius(wanderRadius: number): Wander; /** Returns the rate, expressed in radian per second, at which the wander orientation can change. */ getWanderRate(): number; /** * Sets the rate, expressed in radian per second, at which the wander orientation can change. * @return this behavior for chaining. */ setWanderRate(wanderRate: number): Wander; /** Returns the current orientation of the wander target. */ getWanderOrientation(): number; /** * Sets the current orientation of the wander target. * @return this behavior for chaining. */ setWanderOrientation(wanderOrientation: number): Wander; /** Returns the flag indicating whether to use {@link Face} behavior or not. */ isFaceEnabled(): boolean; /** * Sets the flag indicating whether to use {@link Face} behavior or not. This should be set to {@code true} when independent * facing is used. * @return this behavior for chaining. */ setFaceEnabled(faceEnabled: boolean): Wander; /** Returns the current position of the wander target. This method is useful for debug purpose. */ getInternalTargetPosition(): T; /** Returns the current center of the wander circle. This method is useful for debug purpose. */ getWanderCenter(): T; setOwner(owner: Steerable): Wander; setEnabled(enabled: boolean): Wander; /** * Sets the limiter of this steering behavior. The given limiter must at least take care of the maximum linear acceleration; * additionally, if the flag {@code faceEnabled} is true, it must take care of the maximum angular speed and acceleration. * @return this behavior for chaining. */ setLimiter(limiter: Limiter): Wander; /** * Sets the target to align to. Notice that this method is inherited from {@link ReachOrientation}, but is completely useless * for {@code Wander} because owner's orientation is determined by the internal target, which is moving on the wander circle. * @return this behavior for chaining. */ setTarget(target: Location): Wander; setAlignTolerance(alignTolerance: number): Wander; setDecelerationRadius(decelerationRadius: number): Wander; setTimeToTarget(timeToTarget: number): Wander; protected calculateRealSteering(steering: SteeringAcceleration): SteeringAcceleration; } export default Wander;