mirror of
https://github.com/Relintai/godot-steering-ai-framework.git
synced 2025-01-01 13:49:49 +01:00
fb538b72cb
The GST namespace has been added to prevent class name conflicts, and the project has been reorganized to make extensions and purpose easier.
45 lines
1.3 KiB
GDScript
45 lines
1.3 KiB
GDScript
extends GSTSteeringBehavior
|
|
class_name GSTPursue
|
|
"""
|
|
Calculates acceleration to take an agent to intersect with where a target agent will be.
|
|
|
|
The `max_predict_time` variable represents how far ahead to calculate the intersection point.
|
|
"""
|
|
|
|
|
|
var target: GSTSteeringAgent
|
|
var max_predict_time: float
|
|
|
|
|
|
func _init(
|
|
agent: GSTSteeringAgent,
|
|
target: GSTSteeringAgent,
|
|
max_predict_time: = 1.0).(agent) -> void:
|
|
self.target = target
|
|
self.max_predict_time = max_predict_time
|
|
|
|
|
|
func _calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAcceleration:
|
|
var target_position: = target.position
|
|
var distance_squared: = (target_position - agent.position).length_squared()
|
|
|
|
var speed_squared: = agent.linear_velocity.length_squared()
|
|
var predict_time: = max_predict_time
|
|
|
|
if speed_squared > 0:
|
|
var predict_time_squared: = distance_squared / speed_squared
|
|
if predict_time_squared < max_predict_time * max_predict_time:
|
|
predict_time = sqrt(predict_time_squared)
|
|
|
|
acceleration.linear = ((
|
|
target_position + (target.linear_velocity * predict_time))-agent.position).normalized()
|
|
acceleration.linear *= _get_modified_acceleration()
|
|
|
|
acceleration.angular = 0
|
|
|
|
return acceleration
|
|
|
|
|
|
func _get_modified_acceleration() -> float:
|
|
return agent.max_linear_acceleration
|