mirror of
https://github.com/Relintai/godot-steering-ai-framework.git
synced 2025-01-30 18:39:18 +01:00
Fix the style of booleans and virtual functions in the API
Made booleans start with a prefix, e.g. is_open Added a leading underscore to two virtual functions Added VIRTUAL comment above several virtual functions Renamed accel -> acceleration in a function
This commit is contained in:
parent
bd41d5987c
commit
0586878fcf
@ -123,7 +123,7 @@ func _ready() -> void:
|
|||||||
|
|
||||||
# Behaviors that are not enabled produce 0 acceleration.
|
# Behaviors that are not enabled produce 0 acceleration.
|
||||||
# Adding our fleeing behaviors to a blend. The order does not matter.
|
# Adding our fleeing behaviors to a blend. The order does not matter.
|
||||||
flee_blend.enabled = false
|
flee_blend.is_enabled = false
|
||||||
flee_blend.add(look, 1)
|
flee_blend.add(look, 1)
|
||||||
flee_blend.add(flee, 1)
|
flee_blend.add(flee, 1)
|
||||||
|
|
||||||
@ -144,8 +144,8 @@ func _physics_process(delta: float) -> void:
|
|||||||
update_agent()
|
update_agent()
|
||||||
|
|
||||||
if current_health <= flee_health_threshold:
|
if current_health <= flee_health_threshold:
|
||||||
pursue_blend.enabled = false
|
pursue_blend.is_enabled = false
|
||||||
flee_blend.enabled = true
|
flee_blend.is_enabled = true
|
||||||
|
|
||||||
# Calculate the desired acceleration.
|
# Calculate the desired acceleration.
|
||||||
priority.calculate_steering(acceleration)
|
priority.calculate_steering(acceleration)
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
[ext_resource path="res://demos/GroupBehaviors/Member.gd" type="Script" id=1]
|
[ext_resource path="res://demos/GroupBehaviors/Member.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/sprites/small_circle.png" type="Texture" id=2]
|
[ext_resource path="res://assets/sprites/small_circle.png" type="Texture" id=2]
|
||||||
|
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id=1]
|
[sub_resource type="CircleShape2D" id=1]
|
||||||
radius = 16.0
|
radius = 16.0
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ func _ready() -> void:
|
|||||||
|
|
||||||
# Behaviors that are not enabled produce 0 acceleration.
|
# Behaviors that are not enabled produce 0 acceleration.
|
||||||
# Adding our fleeing behaviors to a blend. The order does not matter.
|
# Adding our fleeing behaviors to a blend. The order does not matter.
|
||||||
flee_blend.enabled = false
|
flee_blend.is_enabled = false
|
||||||
flee_blend.add(look, 1)
|
flee_blend.add(look, 1)
|
||||||
flee_blend.add(flee, 1)
|
flee_blend.add(flee, 1)
|
||||||
|
|
||||||
@ -111,8 +111,8 @@ func _physics_process(delta: float) -> void:
|
|||||||
update_agent()
|
update_agent()
|
||||||
|
|
||||||
if current_health <= flee_health_threshold:
|
if current_health <= flee_health_threshold:
|
||||||
pursue_blend.enabled = false
|
pursue_blend.is_enabled = false
|
||||||
flee_blend.enabled = true
|
flee_blend.is_enabled = true
|
||||||
|
|
||||||
# Calculate the desired acceleration.
|
# Calculate the desired acceleration.
|
||||||
priority.calculate_steering(acceleration)
|
priority.calculate_steering(acceleration)
|
||||||
|
@ -3,7 +3,6 @@
|
|||||||
[ext_resource path="res://demos/SeekFlee/Seeker.gd" type="Script" id=1]
|
[ext_resource path="res://demos/SeekFlee/Seeker.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://assets/sprites/small_circle.png" type="Texture" id=2]
|
[ext_resource path="res://assets/sprites/small_circle.png" type="Texture" id=2]
|
||||||
|
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id=1]
|
[sub_resource type="CircleShape2D" id=1]
|
||||||
radius = 16.0
|
radius = 16.0
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ func _calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAccele
|
|||||||
first_minimum_separation = 0
|
first_minimum_separation = 0
|
||||||
first_distance = 0
|
first_distance = 0
|
||||||
|
|
||||||
var neighbor_count := proximity.find_neighbors(_callback)
|
var neighbor_count := proximity._find_neighbors(_callback)
|
||||||
|
|
||||||
if neighbor_count == 0 or not first_neighbor:
|
if neighbor_count == 0 or not first_neighbor:
|
||||||
acceleration.set_zero()
|
acceleration.set_zero()
|
||||||
@ -42,7 +42,7 @@ func _calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAccele
|
|||||||
|
|
||||||
# Callback for the proximity to call when finding neighbors. Keeps track of every `neighbor`
|
# Callback for the proximity to call when finding neighbors. Keeps track of every `neighbor`
|
||||||
# that was found but only keeps the one the owning agent will most likely collide with.
|
# that was found but only keeps the one the owning agent will most likely collide with.
|
||||||
func report_neighbor(neighbor: GSTSteeringAgent) -> bool:
|
func _report_neighbor(neighbor: GSTSteeringAgent) -> bool:
|
||||||
var relative_position := neighbor.position - agent.position
|
var relative_position := neighbor.position - agent.position
|
||||||
var relative_velocity := neighbor.linear_velocity - agent.linear_velocity
|
var relative_velocity := neighbor.linear_velocity - agent.linear_velocity
|
||||||
var relative_speed_squared := relative_velocity.length_squared()
|
var relative_speed_squared := relative_velocity.length_squared()
|
||||||
|
@ -14,7 +14,7 @@ func _init(agent: GSTSteeringAgent, proximity: GSTProximity).(agent, proximity)
|
|||||||
func _calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAcceleration:
|
func _calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAcceleration:
|
||||||
acceleration.set_zero()
|
acceleration.set_zero()
|
||||||
center_of_mass = Vector3.ZERO
|
center_of_mass = Vector3.ZERO
|
||||||
var neighbor_count = proximity.find_neighbors(_callback)
|
var neighbor_count = proximity._find_neighbors(_callback)
|
||||||
if neighbor_count > 0:
|
if neighbor_count > 0:
|
||||||
center_of_mass *= 1.0 / neighbor_count
|
center_of_mass *= 1.0 / neighbor_count
|
||||||
acceleration.linear = (center_of_mass - agent.position).normalized() * agent.linear_acceleration_max
|
acceleration.linear = (center_of_mass - agent.position).normalized() * agent.linear_acceleration_max
|
||||||
@ -23,6 +23,6 @@ func _calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAccele
|
|||||||
|
|
||||||
# Callback for the proximity to call when finding neighbors. Adds `neighbor`'s position
|
# Callback for the proximity to call when finding neighbors. Adds `neighbor`'s position
|
||||||
# to the center of mass of the group.
|
# to the center of mass of the group.
|
||||||
func report_neighbor(neighbor: GSTSteeringAgent) -> bool:
|
func _report_neighbor(neighbor: GSTSteeringAgent) -> bool:
|
||||||
center_of_mass += neighbor.position
|
center_of_mass += neighbor.position
|
||||||
return true
|
return true
|
||||||
|
@ -9,7 +9,7 @@ var path: GSTPath
|
|||||||
var path_offset := 0.0
|
var path_offset := 0.0
|
||||||
|
|
||||||
# Whether to use `GSTArrive` behavior on an open path.
|
# Whether to use `GSTArrive` behavior on an open path.
|
||||||
var arrive_enabled := true
|
var is_arrive_enabled := true
|
||||||
# The amount of time in the future to predict the owning agent's position along
|
# The amount of time in the future to predict the owning agent's position along
|
||||||
# the path. Setting it to 0.0 will force non-predictive path following.
|
# the path. Setting it to 0.0 will force non-predictive path following.
|
||||||
var prediction_time := 0.0
|
var prediction_time := 0.0
|
||||||
@ -35,7 +35,7 @@ func _calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAccele
|
|||||||
|
|
||||||
var target_position := path.calculate_target_position(target_distance)
|
var target_position := path.calculate_target_position(target_distance)
|
||||||
|
|
||||||
if arrive_enabled and path.open:
|
if is_arrive_enabled and path.is_open:
|
||||||
if path_offset >= 0:
|
if path_offset >= 0:
|
||||||
if target_distance > path.length - deceleration_radius:
|
if target_distance > path.length - deceleration_radius:
|
||||||
return _arrive(acceleration, target_position)
|
return _arrive(acceleration, target_position)
|
||||||
|
@ -21,13 +21,13 @@ func _init(agent: GSTSteeringAgent, proximity: GSTProximity).(agent, proximity)
|
|||||||
func _calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAcceleration:
|
func _calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAcceleration:
|
||||||
acceleration.set_zero()
|
acceleration.set_zero()
|
||||||
self.acceleration = acceleration
|
self.acceleration = acceleration
|
||||||
proximity.find_neighbors(_callback)
|
proximity._find_neighbors(_callback)
|
||||||
return acceleration
|
return acceleration
|
||||||
|
|
||||||
|
|
||||||
# Callback for the proximity to call when finding neighbors. Determines the amount of
|
# Callback for the proximity to call when finding neighbors. Determines the amount of
|
||||||
# acceleration that `neighbor` imposes based on its distance from the owner agent.
|
# acceleration that `neighbor` imposes based on its distance from the owner agent.
|
||||||
func report_neighbor(neighbor: GSTSteeringAgent) -> bool:
|
func _report_neighbor(neighbor: GSTSteeringAgent) -> bool:
|
||||||
var to_agent := agent.position - neighbor.position
|
var to_agent := agent.position - neighbor.position
|
||||||
|
|
||||||
var distance_squared := to_agent.length_squared()
|
var distance_squared := to_agent.length_squared()
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
# Base type for group-based steering behaviors.
|
# Base type for group-based steering behaviors.
|
||||||
extends GSTSteeringBehavior
|
|
||||||
class_name GSTGroupBehavior
|
class_name GSTGroupBehavior
|
||||||
|
extends GSTSteeringBehavior
|
||||||
|
|
||||||
|
|
||||||
# Container to find neighbors of the agent and calculate group behavior.
|
# Container to find neighbors of the agent and calculate group behavior.
|
||||||
var proximity: GSTProximity
|
var proximity: GSTProximity
|
||||||
|
|
||||||
var _callback := funcref(self, "report_neighbor")
|
var _callback := funcref(self, "_report_neighbor")
|
||||||
|
|
||||||
|
|
||||||
func _init(agent: GSTSteeringAgent, proximity: GSTProximity).(agent) -> void:
|
func _init(agent: GSTSteeringAgent, proximity: GSTProximity).(agent) -> void:
|
||||||
@ -15,5 +15,5 @@ func _init(agent: GSTSteeringAgent, proximity: GSTProximity).(agent) -> void:
|
|||||||
|
|
||||||
# Internal callback for the behavior to define whether or not a member is
|
# Internal callback for the behavior to define whether or not a member is
|
||||||
# relevant
|
# relevant
|
||||||
func report_neighbor(neighbor: GSTSteeringAgent) -> bool:
|
func _report_neighbor(neighbor: GSTSteeringAgent) -> bool:
|
||||||
return false
|
return false
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
# Represents a path made up of Vector3 waypoints, split into segments path
|
# Represents a path made up of Vector3 waypoints, split into segments path
|
||||||
# follow behaviors can use.
|
# follow behaviors can use.
|
||||||
extends Reference class_name GSTPath
|
class_name GSTPath
|
||||||
|
extends Reference
|
||||||
|
|
||||||
|
|
||||||
# If `false`, the path loops.
|
# If `false`, the path loops.
|
||||||
var open: bool
|
var is_open: bool
|
||||||
# Total length of the path.
|
# Total length of the path.
|
||||||
var length: float
|
var length: float
|
||||||
|
|
||||||
@ -14,8 +15,8 @@ var _nearest_point_on_segment: Vector3
|
|||||||
var _nearest_point_on_path: Vector3
|
var _nearest_point_on_path: Vector3
|
||||||
|
|
||||||
|
|
||||||
func _init(waypoints: Array, open := false) -> void:
|
func _init(waypoints: Array, is_open := false) -> void:
|
||||||
self.open = open
|
self.is_open = is_open
|
||||||
create_path(waypoints)
|
create_path(waypoints)
|
||||||
_nearest_point_on_segment = waypoints[0]
|
_nearest_point_on_segment = waypoints[0]
|
||||||
_nearest_point_on_path = waypoints[0]
|
_nearest_point_on_path = waypoints[0]
|
||||||
@ -36,7 +37,7 @@ func create_path(waypoints: Array) -> void:
|
|||||||
previous = current
|
previous = current
|
||||||
if i < waypoints.size():
|
if i < waypoints.size():
|
||||||
current = waypoints[i]
|
current = waypoints[i]
|
||||||
elif open:
|
elif is_open:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
current = waypoints[0]
|
current = waypoints[0]
|
||||||
@ -74,7 +75,7 @@ func calculate_distance(agent_current_position: Vector3) -> float:
|
|||||||
|
|
||||||
# Calculates a target position from the path's starting point based on the `target_distance`.
|
# Calculates a target position from the path's starting point based on the `target_distance`.
|
||||||
func calculate_target_position(target_distance: float) -> Vector3:
|
func calculate_target_position(target_distance: float) -> Vector3:
|
||||||
if open:
|
if is_open:
|
||||||
target_distance = clamp(target_distance, 0, length)
|
target_distance = clamp(target_distance, 0, length)
|
||||||
else:
|
else:
|
||||||
if target_distance < 0:
|
if target_distance < 0:
|
||||||
|
@ -25,4 +25,4 @@ var angular_velocity := 0.0
|
|||||||
var bounding_radius := 0.0
|
var bounding_radius := 0.0
|
||||||
# Used internally by group behaviors and proximities to mark the agent as already
|
# Used internally by group behaviors and proximities to mark the agent as already
|
||||||
# considered.
|
# considered.
|
||||||
var tagged := false
|
var is_tagged := false
|
||||||
|
@ -9,7 +9,7 @@ class_name GSTSteeringBehavior
|
|||||||
|
|
||||||
|
|
||||||
# If `false`, all calculations return zero amounts of acceleration.
|
# If `false`, all calculations return zero amounts of acceleration.
|
||||||
var enabled := true
|
var is_enabled := true
|
||||||
# The AI agent on which the steering behavior bases its calculations.
|
# The AI agent on which the steering behavior bases its calculations.
|
||||||
var agent: GSTSteeringAgent
|
var agent: GSTSteeringAgent
|
||||||
|
|
||||||
@ -21,7 +21,7 @@ func _init(agent: GSTSteeringAgent) -> void:
|
|||||||
# Returns the `acceleration` modified with the behavior's desired amount of
|
# Returns the `acceleration` modified with the behavior's desired amount of
|
||||||
# acceleration.
|
# acceleration.
|
||||||
func calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAcceleration:
|
func calculate_steering(acceleration: GSTTargetAcceleration) -> GSTTargetAcceleration:
|
||||||
if enabled:
|
if is_enabled:
|
||||||
return _calculate_steering(acceleration)
|
return _calculate_steering(acceleration)
|
||||||
else:
|
else:
|
||||||
acceleration.set_zero()
|
acceleration.set_zero()
|
||||||
|
@ -10,9 +10,9 @@ func _init(agent: GSTSteeringAgent, agents: Array).(agent, agents) -> void:
|
|||||||
|
|
||||||
# Returns a number of neighbors based on a `callback` function.
|
# Returns a number of neighbors based on a `callback` function.
|
||||||
#
|
#
|
||||||
# `find_neighbors` calls `callback` for each agent in the `agents` array and
|
# `_find_neighbors` calls `callback` for each agent in the `agents` array and
|
||||||
# adds one to the count if its `callback` returns true.
|
# adds one to the count if its `callback` returns true.
|
||||||
func find_neighbors(callback: FuncRef) -> int:
|
func _find_neighbors(callback: FuncRef) -> int:
|
||||||
var neighbor_count := 0
|
var neighbor_count := 0
|
||||||
var agent_count := agents.size()
|
var agent_count := agents.size()
|
||||||
for i in range(agent_count):
|
for i in range(agent_count):
|
||||||
|
@ -16,7 +16,7 @@ func _init(agent: GSTSteeringAgent, agents: Array) -> void:
|
|||||||
|
|
||||||
# Returns a number of neighbors based on a `callback` function.
|
# Returns a number of neighbors based on a `callback` function.
|
||||||
#
|
#
|
||||||
# `find_neighbors` calls `callback` for each agent in the `agents` array and
|
# `_find_neighbors` calls `callback` for each agent in the `agents` array and
|
||||||
# adds one to the count if its `callback` returns true.
|
# adds one to the count if its `callback` returns true.
|
||||||
func find_neighbors(callback: FuncRef) -> int:
|
func _find_neighbors(callback: FuncRef) -> int:
|
||||||
return 0
|
return 0
|
||||||
|
@ -18,9 +18,9 @@ func _init(agent: GSTSteeringAgent, agents: Array, radius: float).(agent, agents
|
|||||||
|
|
||||||
# Returns a number of neighbors based on a `callback` function.
|
# Returns a number of neighbors based on a `callback` function.
|
||||||
#
|
#
|
||||||
# `find_neighbors` calls `callback` for each agent in the `agents` array that lie within
|
# `_find_neighbors` calls `callback` for each agent in the `agents` array that lie within
|
||||||
# the radius around the owning agent and adds one to the count if its `callback` returns true.
|
# the radius around the owning agent and adds one to the count if its `callback` returns true.
|
||||||
func find_neighbors(callback: FuncRef) -> int:
|
func _find_neighbors(callback: FuncRef) -> int:
|
||||||
var agent_count := agents.size()
|
var agent_count := agents.size()
|
||||||
var neighbor_count := 0
|
var neighbor_count := 0
|
||||||
|
|
||||||
@ -40,16 +40,16 @@ func find_neighbors(callback: FuncRef) -> int:
|
|||||||
|
|
||||||
if distance_squared < range_to * range_to:
|
if distance_squared < range_to * range_to:
|
||||||
if callback.call_func(current_agent):
|
if callback.call_func(current_agent):
|
||||||
current_agent.tagged = true
|
current_agent.is_tagged = true
|
||||||
neighbor_count += 1
|
neighbor_count += 1
|
||||||
continue
|
continue
|
||||||
|
|
||||||
current_agent.tagged = false
|
current_agent.is_tagged = false
|
||||||
else:
|
else:
|
||||||
for i in range(agent_count):
|
for i in range(agent_count):
|
||||||
var current_agent = agents[i] as GSTSteeringAgent
|
var current_agent = agents[i] as GSTSteeringAgent
|
||||||
|
|
||||||
if current_agent != agent and current_agent.tagged:
|
if current_agent != agent and current_agent.is_tagged:
|
||||||
if callback.call_func(current_agent):
|
if callback.call_func(current_agent):
|
||||||
neighbor_count += 1
|
neighbor_count += 1
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user