mirror of
https://github.com/Relintai/godot-steering-ai-framework.git
synced 2024-11-18 09:07:18 +01:00
More api cleanups.
This commit is contained in:
parent
07f03b04f8
commit
7b9561875a
@ -60,5 +60,5 @@ func setup(
|
||||
|
||||
target_node = _target
|
||||
self.target.position = target_node.transform.origin
|
||||
blend.add(arrive, 1)
|
||||
blend.add(face, 1)
|
||||
blend.add_behavior(arrive, 1)
|
||||
blend.add_behavior(face, 1)
|
||||
|
@ -80,8 +80,8 @@ func setup(
|
||||
|
||||
self.draw_proximity = _draw_proximity
|
||||
|
||||
priority.add(avoid)
|
||||
priority.add(seek)
|
||||
priority.add_behavior(avoid)
|
||||
priority.add_behavior(seek)
|
||||
|
||||
|
||||
func set_proximity_agents(agents: Array) -> void:
|
||||
|
@ -50,8 +50,8 @@ func setup(
|
||||
cohesion.agent = agent
|
||||
cohesion.proximity = proximity
|
||||
|
||||
blend.add(separation, separation_strength)
|
||||
blend.add(cohesion, cohesion_strength)
|
||||
blend.add_behavior(separation, separation_strength)
|
||||
blend.add_behavior(cohesion, cohesion_strength)
|
||||
|
||||
|
||||
func _draw() -> void:
|
||||
|
@ -84,9 +84,9 @@ func set_separation_decay_coef(value: float) -> void:
|
||||
|
||||
func set_cohesion_strength(value: float) -> void:
|
||||
for child in get_children():
|
||||
child.blend.get_behavior_at(1).weight = value
|
||||
child.blend.get_behavior(1).weight = value
|
||||
|
||||
|
||||
func set_separation_strength(value: float) -> void:
|
||||
for child in get_children():
|
||||
child.blend.get_behavior_at(0).weight = value
|
||||
child.blend.get_behavior(0).weight = value
|
||||
|
@ -69,8 +69,8 @@ func setup(predict_time: float, linear_speed_max: float, linear_accel_max: float
|
||||
|
||||
_blend = GSAIBlend.new()
|
||||
_blend.agent = agent
|
||||
_blend.add(behavior, 1)
|
||||
_blend.add(orient_behavior, 1)
|
||||
_blend.add_behavior(behavior, 1)
|
||||
_blend.add_behavior(orient_behavior, 1)
|
||||
|
||||
agent.angular_acceleration_max = deg2rad(1080)
|
||||
agent.angular_speed_max = deg2rad(360)
|
||||
|
@ -118,19 +118,19 @@ func _ready() -> void:
|
||||
# Behaviors that are not enabled produce 0 acceleration.
|
||||
# Adding our fleeing behaviors to a blend. The order does not matter.
|
||||
flee_blend.is_enabled = false
|
||||
flee_blend.add(look, 1)
|
||||
flee_blend.add(flee, 1)
|
||||
flee_blend.add_behavior(look, 1)
|
||||
flee_blend.add_behavior(flee, 1)
|
||||
|
||||
# Adding our pursuit behaviors to a blend. The order does not matter.
|
||||
pursue_blend.add(face, 1)
|
||||
pursue_blend.add(pursue, 1)
|
||||
pursue_blend.add_behavior(face, 1)
|
||||
pursue_blend.add_behavior(pursue, 1)
|
||||
|
||||
# Adding our final behaviors to the main priority behavior. The order does matter here.
|
||||
# We want to avoid collision with the player first, flee from the player second when enabled,
|
||||
# and pursue the player last when enabled.
|
||||
priority.add(avoid)
|
||||
priority.add(flee_blend)
|
||||
priority.add(pursue_blend)
|
||||
priority.add_behavior(avoid)
|
||||
priority.add_behavior(flee_blend)
|
||||
priority.add_behavior(pursue_blend)
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
|
@ -14,6 +14,8 @@ var deceleration_radius : float = 0.0
|
||||
# Represents the time it takes to change acceleration.
|
||||
var time_to_reach : float = 0.1
|
||||
|
||||
func arrive(acceleration : GSAITargetAcceleration, target_position : Vector3) -> void:
|
||||
call("_arrive", acceleration, target_position)
|
||||
|
||||
func _arrive(acceleration : GSAITargetAcceleration, target_position : Vector3) -> void:
|
||||
var to_target : Vector3 = target_position - agent.position
|
||||
@ -34,6 +36,5 @@ func _arrive(acceleration : GSAITargetAcceleration, target_position : Vector3) -
|
||||
acceleration.linear = GSAIUtils.clampedv3(desired_velocity, agent.linear_acceleration_max)
|
||||
acceleration.angular = 0
|
||||
|
||||
|
||||
func _calculate_steering(acceleration: GSAITargetAcceleration) -> void:
|
||||
_arrive(acceleration, target.position)
|
||||
arrive(acceleration, target.position)
|
||||
|
@ -11,7 +11,6 @@ var _first_distance : float = 0.0
|
||||
var _first_relative_position : Vector3
|
||||
var _first_relative_velocity : Vector3
|
||||
|
||||
|
||||
func _calculate_steering(acceleration: GSAITargetAcceleration) -> void:
|
||||
_shortest_time = INF
|
||||
_first_neighbor = null
|
||||
|
@ -11,11 +11,10 @@ class_name GSAIBlend
|
||||
extends GSAISteeringBehavior
|
||||
|
||||
var _behaviors : Array = Array()
|
||||
#note only add a getter
|
||||
var _accel : GSAITargetAcceleration = GSAITargetAcceleration.new()
|
||||
|
||||
# Appends a behavior to the internal array along with its `weight`.
|
||||
func add(behavior : GSAISteeringBehavior, weight : float) -> void:
|
||||
func add_behavior(behavior : GSAISteeringBehavior, weight : float) -> void:
|
||||
behavior.agent = agent
|
||||
|
||||
var dict : Dictionary = Dictionary()
|
||||
@ -25,10 +24,9 @@ func add(behavior : GSAISteeringBehavior, weight : float) -> void:
|
||||
|
||||
_behaviors.append(dict)
|
||||
|
||||
|
||||
# Returns the behavior at the specified `index`, or an empty `Dictionary` if
|
||||
# none was found.
|
||||
func get_behavior_at(index : int) -> Dictionary:
|
||||
func get_behavior(index : int) -> Dictionary:
|
||||
if _behaviors.size() > index:
|
||||
return _behaviors[index]
|
||||
|
||||
@ -36,6 +34,21 @@ func get_behavior_at(index : int) -> Dictionary:
|
||||
|
||||
return Dictionary()
|
||||
|
||||
func remove_behavior(index : int) -> void:
|
||||
if _behaviors.size() > index:
|
||||
_behaviors.remove(index)
|
||||
|
||||
return
|
||||
|
||||
printerr("Tried to get index " + str(index) + " in array of size " + str(_behaviors.size()))
|
||||
|
||||
return
|
||||
|
||||
func get_behaviour_count() -> int:
|
||||
return _behaviors.size()
|
||||
|
||||
func get_accel() -> GSAITargetAcceleration:
|
||||
return _accel
|
||||
|
||||
func _calculate_steering(blended_accel: GSAITargetAcceleration) -> void:
|
||||
blended_accel.set_zero()
|
||||
|
@ -4,6 +4,8 @@
|
||||
class_name GSAIFace
|
||||
extends GSAIMatchOrientation
|
||||
|
||||
func face(acceleration: GSAITargetAcceleration, target_position: Vector3) -> void:
|
||||
call("_face", acceleration, target_position)
|
||||
|
||||
func _face(acceleration: GSAITargetAcceleration, target_position: Vector3) -> void:
|
||||
var to_target : Vector3 = target_position - agent.position
|
||||
@ -19,8 +21,7 @@ func _face(acceleration: GSAITargetAcceleration, target_position: Vector3) -> vo
|
||||
else:
|
||||
orientation = GSAIUtils.vector2_to_angle(GSAIUtils.to_vector2(to_target))
|
||||
|
||||
_match_orientation(acceleration, orientation)
|
||||
|
||||
match_orientation(acceleration, orientation)
|
||||
|
||||
func _calculate_steering(acceleration: GSAITargetAcceleration) -> void:
|
||||
_face(acceleration, target.position)
|
||||
face(acceleration, target.position)
|
||||
|
@ -35,11 +35,11 @@ func _calculate_steering(acceleration: GSAITargetAcceleration) -> void:
|
||||
if is_arrive_enabled and path.is_open:
|
||||
if path_offset >= 0:
|
||||
if target_distance > path.length - deceleration_radius:
|
||||
_arrive(acceleration, target_position)
|
||||
arrive(acceleration, target_position)
|
||||
return
|
||||
else:
|
||||
if target_distance < deceleration_radius:
|
||||
_arrive(acceleration, target_position)
|
||||
arrive(acceleration, target_position)
|
||||
return
|
||||
|
||||
acceleration.linear = (target_position - agent.position).normalized()
|
||||
|
@ -16,4 +16,4 @@ func _calculate_steering(accel: GSAITargetAcceleration) -> void:
|
||||
else:
|
||||
orientation = GSAIUtils.vector2_to_angle(GSAIUtils.to_vector2(agent.linear_velocity))
|
||||
|
||||
_match_orientation(accel, orientation)
|
||||
match_orientation(accel, orientation)
|
||||
|
@ -18,6 +18,8 @@ var time_to_reach : float = 0.1
|
||||
# determining angles. X and Z should be used in 3D.
|
||||
var use_z : bool = false
|
||||
|
||||
func match_orientation(acceleration: GSAITargetAcceleration, desired_orientation: float) -> void:
|
||||
call("_match_orientation", acceleration, desired_orientation)
|
||||
|
||||
func _match_orientation(acceleration: GSAITargetAcceleration, desired_orientation: float) -> void:
|
||||
var rotation : float = wrapf(desired_orientation - agent.orientation, -PI, PI)
|
||||
@ -44,4 +46,4 @@ func _match_orientation(acceleration: GSAITargetAcceleration, desired_orientatio
|
||||
|
||||
|
||||
func _calculate_steering(acceleration: GSAITargetAcceleration) -> void:
|
||||
_match_orientation(acceleration, target.orientation)
|
||||
match_orientation(acceleration, target.orientation)
|
||||
|
@ -14,13 +14,12 @@ var zero_threshold : float = 0.0
|
||||
|
||||
|
||||
# Appends a steering behavior as a child of this container.
|
||||
func add(behavior: GSAISteeringBehavior) -> void:
|
||||
func add_behavior(behavior: GSAISteeringBehavior) -> void:
|
||||
_behaviors.append(behavior)
|
||||
|
||||
|
||||
# Returns the behavior at the position in the pool referred to by `index`, or
|
||||
# `null` if no behavior was found.
|
||||
func get_behavior_at(index : int) -> GSAISteeringBehavior:
|
||||
func get_behavior(index : int) -> GSAISteeringBehavior:
|
||||
if _behaviors.size() > index:
|
||||
return _behaviors[index]
|
||||
|
||||
@ -28,6 +27,19 @@ func get_behavior_at(index : int) -> GSAISteeringBehavior:
|
||||
|
||||
return null
|
||||
|
||||
func remove_behavior(index : int) -> void:
|
||||
if _behaviors.size() > index:
|
||||
_behaviors.remove(index)
|
||||
|
||||
return
|
||||
|
||||
printerr("Tried to get index " + str(index) + " in array of size " + str(_behaviors.size()))
|
||||
|
||||
return
|
||||
|
||||
func get_behaviour_count() -> int:
|
||||
return _behaviors.size()
|
||||
|
||||
|
||||
func _calculate_steering(accel : GSAITargetAcceleration) -> void:
|
||||
var threshold_squared : float = zero_threshold * zero_threshold
|
||||
|
@ -23,10 +23,12 @@ func _calculate_steering(acceleration : GSAITargetAcceleration) -> void:
|
||||
predict_time = sqrt(predict_time_squared)
|
||||
|
||||
acceleration.linear = ((target_position + (target.linear_velocity * predict_time)) - agent.position).normalized()
|
||||
acceleration.linear *= _get_modified_acceleration()
|
||||
acceleration.linear *= get_modified_acceleration()
|
||||
|
||||
acceleration.angular = 0
|
||||
|
||||
func get_modified_acceleration() -> float:
|
||||
return call("_get_modified_acceleration")
|
||||
|
||||
func _get_modified_acceleration() -> float:
|
||||
return agent.linear_acceleration_max
|
||||
|
@ -15,8 +15,8 @@ var acceleration : GSAITargetAcceleration
|
||||
|
||||
|
||||
func _calculate_steering(_acceleration : GSAITargetAcceleration) -> void:
|
||||
acceleration.set_zero()
|
||||
self.acceleration = _acceleration
|
||||
acceleration.set_zero()
|
||||
# warning-ignore:return_value_discarded
|
||||
proximity.find_neighbors(_callback)
|
||||
|
||||
|
@ -8,6 +8,8 @@ var proximity : GSAIProximity
|
||||
|
||||
var _callback : FuncRef = funcref(self, "_report_neighbor")
|
||||
|
||||
func get_callback() -> FuncRef:
|
||||
return _callback
|
||||
|
||||
# Internal callback for the behavior to define whether or not a member is
|
||||
# relevant
|
||||
|
@ -58,7 +58,7 @@ func calculate_distance(agent_current_position : Vector3) -> float:
|
||||
|
||||
for i in range(_segments.size()):
|
||||
var segment: GSAISegment = _segments[i]
|
||||
var distance_squared : float = _calculate_point_segment_distance_squared(segment.begin, segment.end, agent_current_position)
|
||||
var distance_squared : float = calculate_point_segment_distance_squared(segment.begin, segment.end, agent_current_position)
|
||||
|
||||
if distance_squared < smallest_distance_squared:
|
||||
_nearest_point_on_path = _nearest_point_on_segment
|
||||
@ -105,7 +105,7 @@ func get_end_point() -> Vector3:
|
||||
return _segments.back().end
|
||||
|
||||
|
||||
func _calculate_point_segment_distance_squared(start: Vector3, end: Vector3, position: Vector3) -> float:
|
||||
func calculate_point_segment_distance_squared(start: Vector3, end: Vector3, position: Vector3) -> float:
|
||||
_nearest_point_on_segment = start
|
||||
var start_end : Vector3 = end - start
|
||||
var start_end_length_squared : float = start_end.length_squared()
|
||||
|
Loading…
Reference in New Issue
Block a user