mirror of
https://github.com/Relintai/godot-steering-ai-framework.git
synced 2024-11-14 04:57:19 +01:00
Implement demo for separation and cohesion
This commit is contained in:
parent
a01f5d5b2e
commit
b0442982d0
11
project/demos/group_behaviors/GroupBehaviorsDemo.tscn
Normal file
11
project/demos/group_behaviors/GroupBehaviorsDemo.tscn
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://demos/group_behaviors/Member.tscn" type="PackedScene" id=1]
|
||||||
|
[ext_resource path="res://demos/group_behaviors/Spawner.gd" type="Script" id=2]
|
||||||
|
|
||||||
|
[node name="GroupBehaviorsDemo" type="Node2D"]
|
||||||
|
|
||||||
|
[node name="Spawner" type="Node2D" parent="."]
|
||||||
|
position = Vector2( 397, 207 )
|
||||||
|
script = ExtResource( 2 )
|
||||||
|
member = ExtResource( 1 )
|
51
project/demos/group_behaviors/Member.gd
Normal file
51
project/demos/group_behaviors/Member.gd
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
extends KinematicBody2D
|
||||||
|
|
||||||
|
|
||||||
|
var agent: = GSTSteeringAgent.new()
|
||||||
|
var separation: GSTSeparation
|
||||||
|
var cohesion: GSTCohesion
|
||||||
|
var proximity: GSTRadiusProximity
|
||||||
|
var blend: = GSTBlend.new(agent)
|
||||||
|
var acceleration: = GSTTargetAcceleration.new()
|
||||||
|
|
||||||
|
var _radius: float
|
||||||
|
var _color: = Color.red
|
||||||
|
var _velocity: = Vector2()
|
||||||
|
|
||||||
|
onready var shape: = $CollisionShape2D
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
_radius = shape.shape.radius
|
||||||
|
_color = Color(rand_range(0.5, 1), rand_range(0.25, 1), rand_range(0, 1))
|
||||||
|
agent.max_linear_acceleration = 7
|
||||||
|
agent.max_linear_speed = 70
|
||||||
|
|
||||||
|
proximity = GSTRadiusProximity.new(agent, [], 140)
|
||||||
|
separation = GSTSeparation.new(agent, proximity)
|
||||||
|
separation.decay_coefficient = 2000
|
||||||
|
cohesion = GSTCohesion.new(agent, proximity)
|
||||||
|
blend.add(separation, 1.5)
|
||||||
|
blend.add(cohesion, 0.3)
|
||||||
|
|
||||||
|
|
||||||
|
func _draw() -> void:
|
||||||
|
draw_circle(Vector2.ZERO, _radius, _color)
|
||||||
|
|
||||||
|
|
||||||
|
func _process(delta: float) -> void:
|
||||||
|
update_agent()
|
||||||
|
if blend:
|
||||||
|
acceleration = blend.calculate_steering(acceleration)
|
||||||
|
_velocity = (_velocity + Vector2(acceleration.linear.x, acceleration.linear.y)).clamped(agent.max_linear_speed)
|
||||||
|
move_and_slide(_velocity)
|
||||||
|
|
||||||
|
|
||||||
|
func set_neighbors(neighbor: Array) -> void:
|
||||||
|
proximity.agents = neighbor
|
||||||
|
|
||||||
|
|
||||||
|
func update_agent() -> void:
|
||||||
|
var current_position: = global_position
|
||||||
|
agent.position.x = current_position.x
|
||||||
|
agent.position.y = current_position.y
|
12
project/demos/group_behaviors/Member.tscn
Normal file
12
project/demos/group_behaviors/Member.tscn
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[gd_scene load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://demos/group_behaviors/Member.gd" type="Script" id=1]
|
||||||
|
|
||||||
|
[sub_resource type="CircleShape2D" id=1]
|
||||||
|
radius = 15.0
|
||||||
|
|
||||||
|
[node name="Member" type="KinematicBody2D"]
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="."]
|
||||||
|
shape = SubResource( 1 )
|
18
project/demos/group_behaviors/Spawner.gd
Normal file
18
project/demos/group_behaviors/Spawner.gd
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
|
||||||
|
export var member: PackedScene
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
var followers: = []
|
||||||
|
for i in range(19):
|
||||||
|
var follower: = member.instance()
|
||||||
|
add_child(follower)
|
||||||
|
follower.position += Vector2(rand_range(-60, 60), rand_range(-60, 60))
|
||||||
|
followers.append(follower)
|
||||||
|
var agents: = []
|
||||||
|
for i in followers:
|
||||||
|
agents.append(i.agent)
|
||||||
|
for i in followers:
|
||||||
|
i.proximity.agents = agents
|
@ -9,8 +9,8 @@ class_name GSTBlend
|
|||||||
# `GSTSteeringBehavior` and a `weight` key with a value of type float.
|
# `GSTSteeringBehavior` and a `weight` key with a value of type float.
|
||||||
|
|
||||||
|
|
||||||
onready var _behaviors: = []
|
var _behaviors: = []
|
||||||
onready var _accel: = GSTTargetAcceleration.new()
|
var _accel: = GSTTargetAcceleration.new()
|
||||||
|
|
||||||
|
|
||||||
func _init(agent: GSTSteeringAgent).(agent) -> void:
|
func _init(agent: GSTSteeringAgent).(agent) -> void:
|
||||||
|
@ -4,7 +4,7 @@ class_name GSTPriority
|
|||||||
# acceleration.
|
# acceleration.
|
||||||
|
|
||||||
|
|
||||||
onready var _behaviors: = []
|
var _behaviors: = []
|
||||||
|
|
||||||
var last_selected_index: int
|
var last_selected_index: int
|
||||||
var threshold_for_zero: float
|
var threshold_for_zero: float
|
||||||
@ -38,7 +38,7 @@ func _calculate_steering(accel: GSTTargetAcceleration) -> GSTTargetAcceleration:
|
|||||||
var behavior: GSTSteeringBehavior = _behaviors[i]
|
var behavior: GSTSteeringBehavior = _behaviors[i]
|
||||||
behavior.calculate_steering(accel)
|
behavior.calculate_steering(accel)
|
||||||
|
|
||||||
if accel.get_squared_magnitude() > threshold_squared:
|
if accel.get_magnitude_squared() > threshold_squared:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
accel.set_zero()
|
accel.set_zero()
|
||||||
|
Loading…
Reference in New Issue
Block a user