godot-steering-ai-framework/project/src/Behaviors/GSTBlend.gd

45 lines
1.4 KiB
GDScript3
Raw Normal View History

2019-12-21 03:32:21 +01:00
class_name GSTBlend
2020-01-16 23:14:50 +01:00
extends GSTSteeringBehavior
# Blends multiple steering behaviors into one, and returns acceleration combining all of them.
2019-12-21 03:32:21 +01:00
# # Each behavior is associated with a weight - a modifier by which the result will be multiplied by,
# then added to a total acceleration.
# # Each behavior is stored internally as a `Dictionary` with a `behavior` key with a value of type
# `GSTSteeringBehavior` and a `weight` key with a value of type float.
2019-12-21 03:32:21 +01:00
var _behaviors := []
var _accel := GSTTargetAcceleration.new()
2019-12-21 03:32:21 +01:00
func _init(agent: GSTSteeringAgent).(agent) -> void:
pass
func add(behavior: GSTSteeringBehavior, weight: float) -> void:
behavior.agent = agent
_behaviors.append({behavior = behavior, weight = weight})
2019-12-21 03:32:21 +01:00
func get_behavior_at(index: int) -> Dictionary:
2019-12-21 03:32:21 +01:00
if _behaviors.size() > index:
return _behaviors[index]
printerr("Tried to get index " + str(index) + " in array of size " + str(_behaviors.size()))
return {}
2019-12-21 03:32:21 +01:00
func _calculate_steering(blended_accel: GSTTargetAcceleration) -> GSTTargetAcceleration:
blended_accel.set_zero()
for i in range(_behaviors.size()):
var bw: Dictionary = _behaviors[i]
2019-12-21 03:32:21 +01:00
bw.behavior.calculate_steering(_accel)
blended_accel.add_scaled_accel(_accel, bw.weight)
blended_accel.linear = GSTUtils.clampedv3(blended_accel.linear, agent.max_linear_acceleration)
blended_accel.angular = min(blended_accel.angular, agent.max_angular_acceleration)
2019-12-21 03:32:21 +01:00
return blended_accel