mirror of
https://github.com/Relintai/godot-steering-ai-framework.git
synced 2024-11-14 04:57:19 +01:00
Update folder structure for FoollowPath Demo
This commit is contained in:
commit
f3f40848a1
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -2,10 +2,7 @@
|
|||||||
|
|
||||||
[ext_resource path="res://assets/theme/fonts/montserrat/Montserrat-Medium.ttf" type="DynamicFontData" id=1]
|
[ext_resource path="res://assets/theme/fonts/montserrat/Montserrat-Medium.ttf" type="DynamicFontData" id=1]
|
||||||
|
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
|
|
||||||
size = 20
|
size = 20
|
||||||
use_filter = true
|
use_filter = true
|
||||||
font_data = ExtResource( 1 )
|
font_data = ExtResource( 1 )
|
||||||
|
|
||||||
|
@ -2,10 +2,7 @@
|
|||||||
|
|
||||||
[ext_resource path="res://assets/theme/fonts/montserrat/Montserrat-Bold.ttf" type="DynamicFontData" id=1]
|
[ext_resource path="res://assets/theme/fonts/montserrat/Montserrat-Bold.ttf" type="DynamicFontData" id=1]
|
||||||
|
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
|
|
||||||
size = 20
|
size = 20
|
||||||
use_filter = true
|
use_filter = true
|
||||||
font_data = ExtResource( 1 )
|
font_data = ExtResource( 1 )
|
||||||
|
|
||||||
|
@ -2,10 +2,7 @@
|
|||||||
|
|
||||||
[ext_resource path="res://assets/theme/fonts/source_code_pro/SourceCodePro-Medium.otf" type="DynamicFontData" id=1]
|
[ext_resource path="res://assets/theme/fonts/source_code_pro/SourceCodePro-Medium.otf" type="DynamicFontData" id=1]
|
||||||
|
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
|
|
||||||
size = 20
|
size = 20
|
||||||
use_filter = true
|
use_filter = true
|
||||||
font_data = ExtResource( 1 )
|
font_data = ExtResource( 1 )
|
||||||
|
|
||||||
|
Binary file not shown.
@ -1,7 +1,5 @@
|
|||||||
[gd_resource type="StyleBoxLine" format=2]
|
[gd_resource type="StyleBoxLine" format=2]
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
|
|
||||||
color = Color( 1, 1, 1, 0.196078 )
|
color = Color( 1, 1, 1, 0.196078 )
|
||||||
thickness = 2
|
thickness = 2
|
||||||
|
|
||||||
|
Binary file not shown.
Binary file not shown.
71
project/demos/Arrive/ArriveDemo.gd
Normal file
71
project/demos/Arrive/ArriveDemo.gd
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
|
||||||
|
onready var target := $Target
|
||||||
|
onready var arriver := $Arriver
|
||||||
|
|
||||||
|
export(float, 0, 2000, 40) var max_linear_speed := 800.0 setget set_max_linear_speed
|
||||||
|
export(float, 0, 200, 1) var max_linear_acceleration := 80.0 setget set_max_linear_acceleration
|
||||||
|
export(float, 0, 100, 0.1) var arrival_tolerance := 25.0 setget set_arrival_tolerance
|
||||||
|
export(float, 0, 500, 10) var deceleration_radius := 125.0 setget set_deceleration_radius
|
||||||
|
|
||||||
|
const COLORS := {
|
||||||
|
deceleration_radius = Color(0.9, 1, 0, 0.1),
|
||||||
|
arrival_tolerance = Color(0.5, 0.7, 0.9, 0.2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
target.position = arriver.global_position
|
||||||
|
arriver.setup(
|
||||||
|
max_linear_speed,
|
||||||
|
max_linear_acceleration,
|
||||||
|
arrival_tolerance,
|
||||||
|
deceleration_radius
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func _unhandled_input(event: InputEvent) -> void:
|
||||||
|
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.is_pressed():
|
||||||
|
arriver.target.position = Vector3(event.position.x, event.position.y, 0)
|
||||||
|
target.position = event.position
|
||||||
|
update()
|
||||||
|
|
||||||
|
|
||||||
|
func _draw():
|
||||||
|
draw_circle(target.position, deceleration_radius, COLORS.deceleration_radius)
|
||||||
|
draw_circle(target.position, arrival_tolerance, COLORS.arrival_tolerance)
|
||||||
|
|
||||||
|
|
||||||
|
func set_arrival_tolerance(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
arrival_tolerance = value
|
||||||
|
arriver.arrive.arrival_tolerance = value
|
||||||
|
update()
|
||||||
|
|
||||||
|
|
||||||
|
func set_deceleration_radius(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
deceleration_radius = value
|
||||||
|
arriver.arrive.deceleration_radius = value
|
||||||
|
update()
|
||||||
|
|
||||||
|
|
||||||
|
func set_max_linear_speed(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
max_linear_speed = value
|
||||||
|
arriver.agent.max_linear_speed = value
|
||||||
|
|
||||||
|
|
||||||
|
func set_max_linear_acceleration(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
max_linear_acceleration = value
|
||||||
|
arriver.agent.max_linear_acceleration = value
|
49
project/demos/Arrive/ArriveDemo.tscn
Normal file
49
project/demos/Arrive/ArriveDemo.tscn
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
[gd_scene load_steps=6 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://demos/Arrive/Arriver.gd" type="Script" id=1]
|
||||||
|
[ext_resource path="res://assets/theme/gdquest.theme" type="Theme" id=2]
|
||||||
|
[ext_resource path="res://demos/Arrive/ArriveDemo.gd" type="Script" id=3]
|
||||||
|
[ext_resource path="res://assets/sprites/small_circle.png" type="Texture" id=4]
|
||||||
|
|
||||||
|
[sub_resource type="CircleShape2D" id=1]
|
||||||
|
radius = 16.0
|
||||||
|
|
||||||
|
[node name="ArriveDemo" type="Node2D"]
|
||||||
|
script = ExtResource( 3 )
|
||||||
|
|
||||||
|
[node name="Arriver" type="KinematicBody2D" parent="."]
|
||||||
|
show_behind_parent = true
|
||||||
|
position = Vector2( 512, 300 )
|
||||||
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="Arriver"]
|
||||||
|
shape = SubResource( 1 )
|
||||||
|
|
||||||
|
[node name="Sprite" type="Sprite" parent="Arriver"]
|
||||||
|
modulate = Color( 0.952941, 0.172549, 0.0431373, 1 )
|
||||||
|
texture = ExtResource( 4 )
|
||||||
|
|
||||||
|
[node name="Target" type="Node2D" parent="."]
|
||||||
|
position = Vector2( 0, 1 )
|
||||||
|
|
||||||
|
[node name="GUI" type="PanelContainer" parent="."]
|
||||||
|
anchor_right = 1.0
|
||||||
|
margin_right = 1024.0
|
||||||
|
margin_bottom = 87.0
|
||||||
|
rect_min_size = Vector2( 1024, 0 )
|
||||||
|
theme = ExtResource( 2 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="MarginContainer" type="MarginContainer" parent="GUI"]
|
||||||
|
margin_right = 1024.0
|
||||||
|
margin_bottom = 87.0
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="GUI/MarginContainer"]
|
||||||
|
margin_left = 16.0
|
||||||
|
margin_top = 16.0
|
||||||
|
margin_right = 1008.0
|
||||||
|
margin_bottom = 71.0
|
||||||
|
text = "Arrive Demo
|
||||||
|
Mouse click to make the red \"Player\" move to the yellow target"
|
37
project/demos/Arrive/Arriver.gd
Normal file
37
project/demos/Arrive/Arriver.gd
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
extends KinematicBody2D
|
||||||
|
|
||||||
|
|
||||||
|
var agent := GSTSteeringAgent.new()
|
||||||
|
var target := GSTAgentLocation.new()
|
||||||
|
var arrive := GSTArrive.new(agent, target)
|
||||||
|
var _accel := GSTTargetAcceleration.new()
|
||||||
|
|
||||||
|
var _velocity := Vector2()
|
||||||
|
var _drag := 0.1
|
||||||
|
|
||||||
|
|
||||||
|
func _physics_process(delta: float) -> void:
|
||||||
|
_update_agent()
|
||||||
|
_accel = arrive.calculate_steering(_accel)
|
||||||
|
_velocity += Vector2(_accel.linear.x, _accel.linear.y)
|
||||||
|
_velocity = _velocity.linear_interpolate(Vector2.ZERO, _drag).clamped(agent.max_linear_speed)
|
||||||
|
_velocity = move_and_slide(_velocity)
|
||||||
|
|
||||||
|
|
||||||
|
func setup(
|
||||||
|
max_linear_speed: float,
|
||||||
|
max_linear_acceleration: float,
|
||||||
|
arrival_tolerance: float,
|
||||||
|
deceleration_radius: float
|
||||||
|
) -> void:
|
||||||
|
agent.max_linear_speed = max_linear_speed
|
||||||
|
agent.max_linear_acceleration = max_linear_acceleration
|
||||||
|
agent.position = Vector3(global_position.x, global_position.y, 0)
|
||||||
|
arrive.deceleration_radius = deceleration_radius
|
||||||
|
arrive.arrival_tolerance = arrival_tolerance
|
||||||
|
target.position = agent.position
|
||||||
|
|
||||||
|
|
||||||
|
func _update_agent() -> void:
|
||||||
|
agent.position = Vector3(global_position.x, global_position.y, 0)
|
||||||
|
agent.linear_velocity = Vector3(_velocity.x, _velocity.y, 0)
|
63
project/demos/Face/FaceDemo.gd
Normal file
63
project/demos/Face/FaceDemo.gd
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
|
||||||
|
onready var player := $Player
|
||||||
|
onready var gui := $GUI
|
||||||
|
onready var turret := $Turret
|
||||||
|
|
||||||
|
export(int, 0, 359) var max_angular_speed := 90 setget set_max_angular_speed
|
||||||
|
export(int, 0, 359) var max_angular_accel := 5 setget set_max_angular_accel
|
||||||
|
export(int, 0, 180) var align_tolerance := 5 setget set_align_tolerance
|
||||||
|
export(int, 0, 359) var deceleration_radius := 45 setget set_deceleration_radius
|
||||||
|
export(float, 0, 1000) var player_speed := 600.0 setget set_player_speed
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
player.speed = player_speed
|
||||||
|
turret.setup(
|
||||||
|
player.agent,
|
||||||
|
deg2rad(align_tolerance),
|
||||||
|
deg2rad(deceleration_radius),
|
||||||
|
deg2rad(max_angular_accel),
|
||||||
|
deg2rad(max_angular_speed)
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
func set_align_tolerance(value: int) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
align_tolerance = value
|
||||||
|
turret.face.alignment_tolerance = deg2rad(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_deceleration_radius(value: int) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
deceleration_radius = value
|
||||||
|
turret.face.deceleration_radius = deg2rad(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_max_angular_accel(value: int) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
max_angular_accel = value
|
||||||
|
turret.agent.max_angular_acceleration = deg2rad(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_max_angular_speed(value: int) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
max_angular_speed = value
|
||||||
|
turret.agent.max_angular_speed = deg2rad(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_player_speed(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
player_speed = value
|
||||||
|
player.speed = player_speed
|
@ -1,10 +1,11 @@
|
|||||||
[gd_scene load_steps=8 format=2]
|
[gd_scene load_steps=9 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://demos/face/Turret.gd" type="Script" id=1]
|
[ext_resource path="res://demos/Face/Turret.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://demos/face/FaceDemo.gd" type="Script" id=2]
|
[ext_resource path="res://demos/Face/FaceDemo.gd" type="Script" id=2]
|
||||||
[ext_resource path="res://demos/face/Player.gd" type="Script" id=3]
|
[ext_resource path="res://demos/Face/Player.gd" type="Script" id=3]
|
||||||
[ext_resource path="res://assets/sprites/large_circle.png" type="Texture" id=4]
|
[ext_resource path="res://assets/sprites/large_circle.png" type="Texture" id=4]
|
||||||
[ext_resource path="res://assets/sprites/small_circle.png" type="Texture" id=5]
|
[ext_resource path="res://assets/sprites/small_circle.png" type="Texture" id=5]
|
||||||
|
[ext_resource path="res://assets/theme/gdquest.theme" type="Theme" id=6]
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id=1]
|
[sub_resource type="CircleShape2D" id=1]
|
||||||
radius = 16.0
|
radius = 16.0
|
||||||
@ -30,7 +31,7 @@ modulate = Color( 0.945098, 0.215686, 0.0705882, 1 )
|
|||||||
texture = ExtResource( 5 )
|
texture = ExtResource( 5 )
|
||||||
|
|
||||||
[node name="Turret" type="KinematicBody2D" parent="."]
|
[node name="Turret" type="KinematicBody2D" parent="."]
|
||||||
position = Vector2( 512, 150 )
|
position = Vector2( 512, 286.288 )
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Turret"]
|
[node name="CollisionShape2D" type="CollisionShape2D" parent="Turret"]
|
||||||
@ -39,3 +40,23 @@ shape = SubResource( 2 )
|
|||||||
[node name="Sprite" type="Sprite" parent="Turret"]
|
[node name="Sprite" type="Sprite" parent="Turret"]
|
||||||
modulate = Color( 0.137255, 0.866667, 0.647059, 1 )
|
modulate = Color( 0.137255, 0.866667, 0.647059, 1 )
|
||||||
texture = ExtResource( 4 )
|
texture = ExtResource( 4 )
|
||||||
|
|
||||||
|
[node name="GUI" type="PanelContainer" parent="."]
|
||||||
|
margin_right = 1024.0
|
||||||
|
margin_bottom = 14.0
|
||||||
|
theme = ExtResource( 6 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="MarginContainer" type="MarginContainer" parent="GUI"]
|
||||||
|
margin_right = 1024.0
|
||||||
|
margin_bottom = 87.0
|
||||||
|
|
||||||
|
[node name="Label" type="Label" parent="GUI/MarginContainer"]
|
||||||
|
margin_left = 16.0
|
||||||
|
margin_top = 16.0
|
||||||
|
margin_right = 1008.0
|
||||||
|
margin_bottom = 71.0
|
||||||
|
text = "Face Demo
|
||||||
|
Move the player around with WASD and notice the turret orient itself"
|
22
project/demos/Face/Player.gd
Normal file
22
project/demos/Face/Player.gd
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
extends KinematicBody2D
|
||||||
|
|
||||||
|
|
||||||
|
var speed: float
|
||||||
|
|
||||||
|
onready var agent := GSTAgentLocation.new()
|
||||||
|
|
||||||
|
|
||||||
|
func _physics_process(delta: float) -> void:
|
||||||
|
var movement := _get_movement()
|
||||||
|
move_and_slide(movement * speed)
|
||||||
|
_update_agent()
|
||||||
|
|
||||||
|
|
||||||
|
func _get_movement() -> Vector2:
|
||||||
|
return Vector2(
|
||||||
|
Input.get_action_strength("sf_right") - Input.get_action_strength("sf_left"),
|
||||||
|
Input.get_action_strength("sf_down") - Input.get_action_strength("sf_up"))
|
||||||
|
|
||||||
|
|
||||||
|
func _update_agent() -> void:
|
||||||
|
agent.position = Vector3(global_position.x, global_position.y, 0)
|
46
project/demos/Face/Turret.gd
Normal file
46
project/demos/Face/Turret.gd
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
extends KinematicBody2D
|
||||||
|
|
||||||
|
|
||||||
|
var face: GSTFace
|
||||||
|
var agent := GSTSteeringAgent.new()
|
||||||
|
|
||||||
|
var _accel := GSTTargetAcceleration.new()
|
||||||
|
var _angular_drag := 0.01
|
||||||
|
var _cannon: Rect2
|
||||||
|
|
||||||
|
onready var collision_shape := $CollisionShape2D
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
var radius = collision_shape.shape.radius
|
||||||
|
_cannon = Rect2(Vector2(-5, 0), Vector2(10, -radius*2))
|
||||||
|
|
||||||
|
|
||||||
|
func _physics_process(delta: float) -> void:
|
||||||
|
_accel = face.calculate_steering(_accel)
|
||||||
|
agent.angular_velocity += _accel.angular
|
||||||
|
agent.angular_velocity = lerp(agent.angular_velocity, 0, _angular_drag)
|
||||||
|
agent.orientation += agent.angular_velocity * delta
|
||||||
|
rotation = agent.orientation
|
||||||
|
|
||||||
|
|
||||||
|
func _draw() -> void:
|
||||||
|
draw_rect(_cannon, Color.cadetblue)
|
||||||
|
|
||||||
|
|
||||||
|
func setup(
|
||||||
|
player_agent: GSTAgentLocation,
|
||||||
|
align_tolerance: float,
|
||||||
|
deceleration_radius: float,
|
||||||
|
max_angular_accel: float,
|
||||||
|
max_angular_speed: float
|
||||||
|
) -> void:
|
||||||
|
face = GSTFace.new(agent, player_agent)
|
||||||
|
|
||||||
|
face.alignment_tolerance = align_tolerance
|
||||||
|
face.deceleration_radius = deceleration_radius
|
||||||
|
|
||||||
|
agent.max_angular_acceleration = max_angular_accel
|
||||||
|
agent.max_angular_speed = max_angular_speed
|
||||||
|
agent.position = Vector3(global_position.x, global_position.y, 0)
|
||||||
|
|
@ -1,9 +1,9 @@
|
|||||||
[gd_scene load_steps=6 format=2]
|
[gd_scene load_steps=6 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://demos/follow_path/Drawer.gd" type="Script" id=1]
|
[ext_resource path="res://demos/FollowPath/Drawer.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]
|
||||||
[ext_resource path="res://demos/follow_path/PathFollower.gd" type="Script" id=3]
|
[ext_resource path="res://demos/FollowPath/PathFollower.gd" type="Script" id=3]
|
||||||
[ext_resource path="res://demos/follow_path/FollowPathDemo.gd" type="Script" id=4]
|
[ext_resource path="res://demos/FollowPath/FollowPathDemo.gd" type="Script" id=4]
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id=1]
|
[sub_resource type="CircleShape2D" id=1]
|
||||||
radius = 16.0
|
radius = 16.0
|
68
project/demos/GroupBehaviors/GroupBehaviorsDemo.gd
Normal file
68
project/demos/GroupBehaviors/GroupBehaviorsDemo.gd
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
|
||||||
|
onready var spawner := $Spawner
|
||||||
|
|
||||||
|
export var max_linear_speed := 100.0 setget set_max_linear_speed
|
||||||
|
export var max_linear_accel := 25.0 setget set_max_linear_accel
|
||||||
|
export var proximity_radius := 140.0 setget set_proximity_radius
|
||||||
|
export var show_proximity_radius := true setget set_show_proximity_radius
|
||||||
|
export var separation_decay_coefficient := 2000.0 setget set_separation_decay_coef
|
||||||
|
export var cohesion_strength := 0.3 setget set_cohesion_strength
|
||||||
|
export var separation_strength := 1.5 setget set_separation_strength
|
||||||
|
|
||||||
|
|
||||||
|
func set_max_linear_speed(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
max_linear_speed = value
|
||||||
|
spawner.set_max_linear_speed(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_max_linear_accel(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
max_linear_accel = value
|
||||||
|
spawner.set_max_linear_accel(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_proximity_radius(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
proximity_radius = value
|
||||||
|
spawner.set_proximity_radius(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_show_proximity_radius(value: bool) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
show_proximity_radius = value
|
||||||
|
spawner.set_show_proximity_radius(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_separation_decay_coef(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
separation_decay_coefficient = value
|
||||||
|
spawner.set_separation_decay_coef(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_cohesion_strength(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
cohesion_strength = value
|
||||||
|
spawner.set_cohesion_strength(value)
|
||||||
|
|
||||||
|
|
||||||
|
func set_separation_strength(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
separation_strength = value
|
||||||
|
spawner.set_separation_strength(value)
|
13
project/demos/GroupBehaviors/GroupBehaviorsDemo.tscn
Normal file
13
project/demos/GroupBehaviors/GroupBehaviorsDemo.tscn
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://demos/GroupBehaviors/Member.tscn" type="PackedScene" id=1]
|
||||||
|
[ext_resource path="res://demos/GroupBehaviors/Spawner.gd" type="Script" id=2]
|
||||||
|
[ext_resource path="res://demos/GroupBehaviors/GroupBehaviorsDemo.gd" type="Script" id=3]
|
||||||
|
|
||||||
|
[node name="GroupBehaviorsDemo" type="Node2D"]
|
||||||
|
script = ExtResource( 3 )
|
||||||
|
|
||||||
|
[node name="Spawner" type="Node2D" parent="."]
|
||||||
|
position = Vector2( 512, 300 )
|
||||||
|
script = ExtResource( 2 )
|
||||||
|
member = ExtResource( 1 )
|
@ -1,8 +1,9 @@
|
|||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://demos/group_behaviors/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
|
||||||
|
|
@ -2,7 +2,7 @@ extends Node2D
|
|||||||
# Wraps the ships' positions around the world border, and controls their rendering clones.
|
# Wraps the ships' positions around the world border, and controls their rendering clones.
|
||||||
|
|
||||||
|
|
||||||
onready var ShipType: = preload("res://demos/pursue_vs_seek/Ship.gd")
|
onready var ShipType := preload("res://demos/PursueSeek/Ship.gd")
|
||||||
onready var ships := [$Player, $Pursuer, $Seeker]
|
onready var ships := [$Player, $Pursuer, $Seeker]
|
||||||
|
|
||||||
var _clones := {}
|
var _clones := {}
|
@ -1,4 +1,4 @@
|
|||||||
extends "res://demos/pursue_vs_seek/Ship.gd"
|
extends "res://demos/PursueSeek/Ship.gd"
|
||||||
# Controls the player ship's movements based on player input.
|
# Controls the player ship's movements based on player input.
|
||||||
|
|
||||||
|
|
35
project/demos/PursueSeek/PursueVSSeekDemo.gd
Normal file
35
project/demos/PursueSeek/PursueVSSeekDemo.gd
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
extends Node2D
|
||||||
|
|
||||||
|
|
||||||
|
onready var pursuer := $BoundaryManager/Pursuer
|
||||||
|
onready var seeker := $BoundaryManager/Seeker
|
||||||
|
|
||||||
|
export(float, 0, 2000, 40) var max_linear_speed := 200.0 setget set_max_linear_speed
|
||||||
|
export(float, 0, 200, 1) var max_linear_accel := 10.0 setget set_max_linear_accel
|
||||||
|
export(float, 0, 5, 0.1) var predict_time := 2.0 setget set_predict_time
|
||||||
|
|
||||||
|
|
||||||
|
func set_max_linear_speed(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
max_linear_speed = value
|
||||||
|
pursuer.agent.max_linear_speed = value
|
||||||
|
seeker.agent.max_linear_speed = value
|
||||||
|
|
||||||
|
|
||||||
|
func set_max_linear_accel(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
max_linear_accel = value
|
||||||
|
pursuer.agent.max_linear_acceleration = value
|
||||||
|
seeker.agent.max_linear_acceleration = value
|
||||||
|
|
||||||
|
|
||||||
|
func set_predict_time(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
predict_time = value
|
||||||
|
pursuer._behavior.max_predict_time = value
|
@ -1,9 +1,9 @@
|
|||||||
[gd_scene load_steps=6 format=2]
|
[gd_scene load_steps=6 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://demos/pursue_vs_seek/Pursuer.gd" type="Script" id=1]
|
[ext_resource path="res://demos/PursueSeek/Pursuer.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://demos/pursue_vs_seek/Player.gd" type="Script" id=2]
|
[ext_resource path="res://demos/PursueSeek/Player.gd" type="Script" id=2]
|
||||||
[ext_resource path="res://demos/pursue_vs_seek/BoundaryManager.gd" type="Script" id=3]
|
[ext_resource path="res://demos/PursueSeek/BoundaryManager.gd" type="Script" id=3]
|
||||||
[ext_resource path="res://demos/pursue_vs_seek/PursueVSSeekDemo.gd" type="Script" id=4]
|
[ext_resource path="res://demos/PursueSeek/PursueVSSeekDemo.gd" type="Script" id=4]
|
||||||
[ext_resource path="res://assets/sprites/triangle.png" type="Texture" id=6]
|
[ext_resource path="res://assets/sprites/triangle.png" type="Texture" id=6]
|
||||||
|
|
||||||
[node name="PursueVSSeekDemo" type="Node2D"]
|
[node name="PursueVSSeekDemo" type="Node2D"]
|
@ -1,4 +1,4 @@
|
|||||||
extends "res://demos/pursue_vs_seek/Ship.gd"
|
extends "res://demos/PursueSeek/Ship.gd"
|
||||||
# Represents a ship that chases after the player.
|
# Represents a ship that chases after the player.
|
||||||
|
|
||||||
|
|
@ -8,13 +8,13 @@ export(Mode) var behavior_mode: = Mode.SEEK setget set_behavior_mode
|
|||||||
export(float, 0, 2000, 40) var max_linear_speed := 200.0 setget set_max_linear_speed
|
export(float, 0, 2000, 40) var max_linear_speed := 200.0 setget set_max_linear_speed
|
||||||
export(float, 0, 500, 0.5) var max_linear_accel := 10.0 setget set_max_linear_accel
|
export(float, 0, 500, 0.5) var max_linear_accel := 10.0 setget set_max_linear_accel
|
||||||
|
|
||||||
|
var camera_boundaries: Rect2
|
||||||
|
|
||||||
onready var player: KinematicBody2D = $Player
|
onready var player: KinematicBody2D = $Player
|
||||||
onready var spawner: Node2D = $Spawner
|
onready var spawner: Node2D = $Spawner
|
||||||
|
|
||||||
var camera_boundaries: Rect2
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
func _init() -> void:
|
|
||||||
camera_boundaries = Rect2(
|
camera_boundaries = Rect2(
|
||||||
Vector2.ZERO,
|
Vector2.ZERO,
|
||||||
Vector2(
|
Vector2(
|
||||||
@ -23,8 +23,6 @@ func _init() -> void:
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
var rng := RandomNumberGenerator.new()
|
var rng := RandomNumberGenerator.new()
|
||||||
rng.randomize()
|
rng.randomize()
|
||||||
|
|
||||||
@ -42,9 +40,10 @@ func _ready() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func set_behavior_mode(mode: int) -> void:
|
func set_behavior_mode(mode: int) -> void:
|
||||||
behavior_mode = mode
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
if spawner:
|
behavior_mode = mode
|
||||||
match mode:
|
match mode:
|
||||||
Mode.SEEK:
|
Mode.SEEK:
|
||||||
for child in spawner.get_children():
|
for child in spawner.get_children():
|
||||||
@ -55,16 +54,18 @@ func set_behavior_mode(mode: int) -> void:
|
|||||||
|
|
||||||
|
|
||||||
func set_max_linear_speed(value: float) -> void:
|
func set_max_linear_speed(value: float) -> void:
|
||||||
max_linear_speed = value
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
if spawner:
|
max_linear_speed = value
|
||||||
for child in spawner.get_children():
|
for child in spawner.get_children():
|
||||||
child.agent.max_linear_speed = value
|
child.agent.max_linear_speed = value
|
||||||
|
|
||||||
|
|
||||||
func set_max_linear_accel(value: float) -> void:
|
func set_max_linear_accel(value: float) -> void:
|
||||||
max_linear_accel = value
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
if spawner:
|
max_linear_accel = value
|
||||||
for child in spawner.get_children():
|
for child in spawner.get_children():
|
||||||
child.agent.max_linear_acceleration = value
|
child.agent.max_linear_acceleration = value
|
@ -1,10 +1,10 @@
|
|||||||
[gd_scene load_steps=10 format=2]
|
[gd_scene load_steps=10 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://demos/seek_and_flee/Boundary.gd" type="Script" id=1]
|
[ext_resource path="res://demos/SeekFlee/Boundary.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://demos/seek_and_flee/Player.gd" type="Script" id=2]
|
[ext_resource path="res://demos/SeekFlee/Player.gd" type="Script" id=2]
|
||||||
[ext_resource path="res://demos/seek_and_flee/SeekFleeDemo.gd" type="Script" id=3]
|
[ext_resource path="res://demos/SeekFlee/SeekFleeDemo.gd" type="Script" id=3]
|
||||||
[ext_resource path="res://demos/seek_and_flee/Spawner.gd" type="Script" id=4]
|
[ext_resource path="res://demos/SeekFlee/Spawner.gd" type="Script" id=4]
|
||||||
[ext_resource path="res://demos/seek_and_flee/Seeker.tscn" type="PackedScene" id=6]
|
[ext_resource path="res://demos/SeekFlee/Seeker.tscn" type="PackedScene" id=6]
|
||||||
[ext_resource path="res://assets/sprites/large_circle.png" type="Texture" id=7]
|
[ext_resource path="res://assets/sprites/large_circle.png" type="Texture" id=7]
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id=1]
|
[sub_resource type="CircleShape2D" id=1]
|
@ -1,8 +1,9 @@
|
|||||||
[gd_scene load_steps=4 format=2]
|
[gd_scene load_steps=4 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://demos/seek_and_flee/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
|
||||||
|
|
@ -1,39 +0,0 @@
|
|||||||
extends Node2D
|
|
||||||
|
|
||||||
|
|
||||||
onready var target: = $Target
|
|
||||||
onready var arriver: = $Arriver
|
|
||||||
onready var gui: = $GUI
|
|
||||||
|
|
||||||
export(float, 0, 2000, 40) var max_linear_speed: = 200.0 setget set_max_linear_speed
|
|
||||||
export(float, 0, 200, 1) var max_linear_accel: = 25.0 setget set_max_linear_accel
|
|
||||||
export(float, 0, 100, 0.1) var arrival_tolerance: = 20.0 setget set_arrival_tolerance
|
|
||||||
export(float, 0, 500, 10) var deceleration_radius: = 200.0 setget set_deceleration_radius
|
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
target.position = arriver.global_position
|
|
||||||
|
|
||||||
|
|
||||||
func set_arrival_tolerance(value: float) -> void:
|
|
||||||
arrival_tolerance = value
|
|
||||||
if arriver:
|
|
||||||
arriver.arrive.arrival_tolerance = value
|
|
||||||
|
|
||||||
|
|
||||||
func set_deceleration_radius(value: float) -> void:
|
|
||||||
deceleration_radius = value
|
|
||||||
if arriver:
|
|
||||||
arriver.arrive.deceleration_radius = value
|
|
||||||
|
|
||||||
|
|
||||||
func set_max_linear_speed(value: float) -> void:
|
|
||||||
max_linear_speed = value
|
|
||||||
if arriver:
|
|
||||||
arriver.agent.max_linear_speed = value
|
|
||||||
|
|
||||||
|
|
||||||
func set_max_linear_accel(value: float) -> void:
|
|
||||||
max_linear_accel = value
|
|
||||||
if arriver:
|
|
||||||
arriver.agent.max_linear_acceleration = value
|
|
@ -1,35 +0,0 @@
|
|||||||
[gd_scene load_steps=6 format=2]
|
|
||||||
|
|
||||||
[ext_resource path="res://demos/arrive/Arriver.gd" type="Script" id=1]
|
|
||||||
[ext_resource path="res://demos/arrive/ArriveDemo.gd" type="Script" id=2]
|
|
||||||
[ext_resource path="res://assets/sprites/large_circle.png" type="Texture" id=3]
|
|
||||||
[ext_resource path="res://assets/sprites/small_circle.png" type="Texture" id=4]
|
|
||||||
|
|
||||||
[sub_resource type="CircleShape2D" id=1]
|
|
||||||
radius = 16.0
|
|
||||||
|
|
||||||
[node name="ArriveDemo" type="Node2D"]
|
|
||||||
script = ExtResource( 2 )
|
|
||||||
max_linear_speed = 400.0
|
|
||||||
max_linear_accel = 50.0
|
|
||||||
arrival_tolerance = 10.0
|
|
||||||
deceleration_radius = 80.0
|
|
||||||
|
|
||||||
[node name="Arriver" type="KinematicBody2D" parent="."]
|
|
||||||
position = Vector2( 512, 300 )
|
|
||||||
script = ExtResource( 1 )
|
|
||||||
|
|
||||||
[node name="CollisionShape2D" type="CollisionShape2D" parent="Arriver"]
|
|
||||||
shape = SubResource( 1 )
|
|
||||||
|
|
||||||
[node name="Sprite" type="Sprite" parent="Arriver"]
|
|
||||||
modulate = Color( 0.952941, 0.172549, 0.0431373, 1 )
|
|
||||||
texture = ExtResource( 4 )
|
|
||||||
|
|
||||||
[node name="Target" type="Sprite" parent="."]
|
|
||||||
modulate = Color( 0.827451, 1, 0, 0.501961 )
|
|
||||||
texture = ExtResource( 3 )
|
|
||||||
|
|
||||||
[node name="Sprite" type="Sprite" parent="Target"]
|
|
||||||
scale = Vector2( 0.5, 0.5 )
|
|
||||||
texture = ExtResource( 4 )
|
|
@ -1,40 +0,0 @@
|
|||||||
extends KinematicBody2D
|
|
||||||
|
|
||||||
|
|
||||||
onready var agent: = GSTSteeringAgent.new()
|
|
||||||
onready var target: = GSTAgentLocation.new()
|
|
||||||
onready var arrive: = GSTArrive.new(agent, target)
|
|
||||||
var _accel: = GSTTargetAcceleration.new()
|
|
||||||
|
|
||||||
var _velocity: = Vector2()
|
|
||||||
var _drag: = 0.1
|
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
agent.max_linear_speed = owner.max_linear_speed
|
|
||||||
agent.max_linear_acceleration = owner.max_linear_accel
|
|
||||||
agent.position = Vector3(global_position.x, global_position.y, 0)
|
|
||||||
arrive.deceleration_radius = owner.deceleration_radius
|
|
||||||
arrive.arrival_tolerance = owner.arrival_tolerance
|
|
||||||
target.position = agent.position
|
|
||||||
|
|
||||||
|
|
||||||
func _unhandled_input(event: InputEvent) -> void:
|
|
||||||
if event is InputEventMouseButton:
|
|
||||||
var mb: InputEventMouseButton = event
|
|
||||||
if mb.button_index == BUTTON_LEFT and mb.pressed:
|
|
||||||
target.position = Vector3(mb.position.x, mb.position.y, 0)
|
|
||||||
owner.target.position = mb.position
|
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
|
||||||
_update_agent()
|
|
||||||
_accel = arrive.calculate_steering(_accel)
|
|
||||||
_velocity += Vector2(_accel.linear.x, _accel.linear.y)
|
|
||||||
_velocity = _velocity.linear_interpolate(Vector2.ZERO, _drag).clamped(agent.max_linear_speed)
|
|
||||||
_velocity = move_and_slide(_velocity)
|
|
||||||
|
|
||||||
|
|
||||||
func _update_agent() -> void:
|
|
||||||
agent.position = Vector3(global_position.x, global_position.y, 0)
|
|
||||||
agent.linear_velocity = Vector3(_velocity.x, _velocity.y, 0)
|
|
@ -1,44 +0,0 @@
|
|||||||
extends Node2D
|
|
||||||
|
|
||||||
|
|
||||||
onready var player: = $Player
|
|
||||||
onready var gui: = $GUI
|
|
||||||
onready var turret: = $Turret
|
|
||||||
|
|
||||||
export(int, 0, 359, 1) var max_angular_speed: = 90 setget set_max_angular_speed
|
|
||||||
export(int, 0, 359, 1) var max_angular_accel: = 5 setget set_max_angular_accel
|
|
||||||
export(int, 0, 180, 1) var align_tolerance: = 5 setget set_align_tolerance
|
|
||||||
export(int, 0, 359, 1) var deceleration_radius: = 45 setget set_deceleration_radius
|
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
turret.setup(
|
|
||||||
deg2rad(align_tolerance),
|
|
||||||
deg2rad(deceleration_radius),
|
|
||||||
deg2rad(max_angular_accel),
|
|
||||||
deg2rad(max_angular_speed)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
func set_align_tolerance(value: int) -> void:
|
|
||||||
align_tolerance = value
|
|
||||||
if turret:
|
|
||||||
turret._face.alignment_tolerance = deg2rad(value)
|
|
||||||
|
|
||||||
|
|
||||||
func set_deceleration_radius(value: int) -> void:
|
|
||||||
deceleration_radius = value
|
|
||||||
if turret:
|
|
||||||
turret._face.deceleration_radius = deg2rad(value)
|
|
||||||
|
|
||||||
|
|
||||||
func set_max_angular_accel(value: int) -> void:
|
|
||||||
max_angular_accel = value
|
|
||||||
if turret:
|
|
||||||
turret._agent.max_angular_acceleration = deg2rad(value)
|
|
||||||
|
|
||||||
|
|
||||||
func set_max_angular_speed(value: int) -> void:
|
|
||||||
max_angular_speed = value
|
|
||||||
if turret:
|
|
||||||
turret._agent.max_angular_speed = deg2rad(value)
|
|
@ -1,21 +0,0 @@
|
|||||||
extends KinematicBody2D
|
|
||||||
|
|
||||||
|
|
||||||
onready var agent: = GSTAgentLocation.new()
|
|
||||||
|
|
||||||
export var speed: = 125.0
|
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
|
||||||
var movement: = _get_movement()
|
|
||||||
move_and_slide(movement * speed)
|
|
||||||
_update_agent()
|
|
||||||
|
|
||||||
|
|
||||||
func _get_movement() -> Vector2:
|
|
||||||
return Vector2( Input.get_action_strength("sf_right") - Input.get_action_strength("sf_left"),
|
|
||||||
Input.get_action_strength("sf_down") - Input.get_action_strength("sf_up"))
|
|
||||||
|
|
||||||
|
|
||||||
func _update_agent() -> void:
|
|
||||||
agent.position = Vector3(global_position.x, global_position.y, 0)
|
|
@ -1,59 +0,0 @@
|
|||||||
extends KinematicBody2D
|
|
||||||
|
|
||||||
|
|
||||||
onready var collision_shape: = $CollisionShape2D
|
|
||||||
|
|
||||||
var _cannon: Rect2
|
|
||||||
|
|
||||||
var _agent: = GSTSteeringAgent.new()
|
|
||||||
var _accel: = GSTTargetAcceleration.new()
|
|
||||||
|
|
||||||
var _angular_velocity: = 0.0
|
|
||||||
var _angular_drag: = 0.01
|
|
||||||
var _face: GSTFace
|
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
var radius = collision_shape.shape.radius
|
|
||||||
_cannon = Rect2(Vector2(-5, 0), Vector2(10, -radius*2))
|
|
||||||
|
|
||||||
|
|
||||||
func _draw() -> void:
|
|
||||||
draw_rect(_cannon, Color.blue)
|
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
|
||||||
if not _face:
|
|
||||||
return
|
|
||||||
|
|
||||||
_accel = _face.calculate_steering(_accel)
|
|
||||||
_angular_velocity += _accel.angular
|
|
||||||
|
|
||||||
_angular_velocity = lerp(_angular_velocity, 0, _angular_drag)
|
|
||||||
|
|
||||||
rotation += _angular_velocity * delta
|
|
||||||
|
|
||||||
_update_agent()
|
|
||||||
|
|
||||||
|
|
||||||
func setup(
|
|
||||||
align_tolerance: float,
|
|
||||||
deceleration_radius: float,
|
|
||||||
max_angular_accel: float,
|
|
||||||
max_angular_speed: float
|
|
||||||
) -> void:
|
|
||||||
_face = GSTFace.new(_agent, owner.player.agent)
|
|
||||||
|
|
||||||
_face.alignment_tolerance = align_tolerance
|
|
||||||
_face.deceleration_radius = deceleration_radius
|
|
||||||
|
|
||||||
_agent.max_angular_acceleration = max_angular_accel
|
|
||||||
_agent.max_angular_speed = max_angular_speed
|
|
||||||
_agent.position = Vector3(global_position.x, global_position.y, 0)
|
|
||||||
|
|
||||||
_update_agent()
|
|
||||||
|
|
||||||
|
|
||||||
func _update_agent() -> void:
|
|
||||||
_agent.angular_velocity = _angular_velocity
|
|
||||||
_agent.orientation = rotation
|
|
@ -1,58 +0,0 @@
|
|||||||
extends Node2D
|
|
||||||
|
|
||||||
|
|
||||||
onready var spawner: = $Spawner
|
|
||||||
|
|
||||||
export var max_linear_speed: = 100.0 setget set_max_linear_speed
|
|
||||||
export var max_linear_accel: = 25.0 setget set_max_linear_accel
|
|
||||||
export var proximity_radius: = 140.0 setget set_proximity_radius
|
|
||||||
export var show_proximity_radius: = true setget set_show_proximity_radius
|
|
||||||
export var separation_decay_coefficient: = 2000.0 setget set_separation_decay_coef
|
|
||||||
export var cohesion_strength: = 0.3 setget set_cohesion_strength
|
|
||||||
export var separation_strength: = 1.5 setget set_separation_strength
|
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
func set_max_linear_speed(value: float) -> void:
|
|
||||||
max_linear_speed = value
|
|
||||||
if spawner:
|
|
||||||
spawner.set_max_linear_speed(value)
|
|
||||||
|
|
||||||
|
|
||||||
func set_max_linear_accel(value: float) -> void:
|
|
||||||
max_linear_accel = value
|
|
||||||
if spawner:
|
|
||||||
spawner.set_max_linear_accel(value)
|
|
||||||
|
|
||||||
|
|
||||||
func set_proximity_radius(value: float) -> void:
|
|
||||||
proximity_radius = value
|
|
||||||
if spawner:
|
|
||||||
spawner.set_proximity_radius(value)
|
|
||||||
|
|
||||||
|
|
||||||
func set_show_proximity_radius(value: bool) -> void:
|
|
||||||
show_proximity_radius = value
|
|
||||||
if spawner:
|
|
||||||
spawner.set_show_proximity_radius(value)
|
|
||||||
|
|
||||||
|
|
||||||
func set_separation_decay_coef(value: float) -> void:
|
|
||||||
separation_decay_coefficient = value
|
|
||||||
if spawner:
|
|
||||||
spawner.set_separation_decay_coef(value)
|
|
||||||
|
|
||||||
|
|
||||||
func set_cohesion_strength(value: float) -> void:
|
|
||||||
cohesion_strength = value
|
|
||||||
if spawner:
|
|
||||||
spawner.set_cohesion_strength(value)
|
|
||||||
|
|
||||||
|
|
||||||
func set_separation_strength(value: float) -> void:
|
|
||||||
separation_strength = value
|
|
||||||
if spawner:
|
|
||||||
spawner.set_separation_strength(value)
|
|
@ -1,13 +0,0 @@
|
|||||||
[gd_scene load_steps=4 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]
|
|
||||||
[ext_resource path="res://demos/group_behaviors/GroupBehaviorsDemo.gd" type="Script" id=3]
|
|
||||||
|
|
||||||
[node name="GroupBehaviorsDemo" type="Node2D"]
|
|
||||||
script = ExtResource( 3 )
|
|
||||||
|
|
||||||
[node name="Spawner" type="Node2D" parent="."]
|
|
||||||
position = Vector2( 512, 300 )
|
|
||||||
script = ExtResource( 2 )
|
|
||||||
member = ExtResource( 1 )
|
|
@ -1,31 +0,0 @@
|
|||||||
extends Node2D
|
|
||||||
|
|
||||||
|
|
||||||
onready var pursuer: = $BoundaryManager/Pursuer
|
|
||||||
onready var seeker: = $BoundaryManager/Seeker
|
|
||||||
|
|
||||||
export(float, 0, 2000, 40) var max_linear_speed: = 200.0 setget set_max_linear_speed
|
|
||||||
export(float, 0, 200, 1) var max_linear_accel: = 10.0 setget set_max_linear_accel
|
|
||||||
export(float, 0, 5, 0.1) var predict_time: = 2.0 setget set_predict_time
|
|
||||||
|
|
||||||
|
|
||||||
func set_max_linear_speed(value: float) -> void:
|
|
||||||
max_linear_speed = value
|
|
||||||
if pursuer:
|
|
||||||
pursuer.agent.max_linear_speed = value
|
|
||||||
if seeker:
|
|
||||||
seeker.agent.max_linear_speed = value
|
|
||||||
|
|
||||||
|
|
||||||
func set_max_linear_accel(value: float) -> void:
|
|
||||||
max_linear_accel = value
|
|
||||||
if pursuer:
|
|
||||||
pursuer.agent.max_linear_acceleration = value
|
|
||||||
if seeker:
|
|
||||||
seeker.agent.max_linear_acceleration = value
|
|
||||||
|
|
||||||
|
|
||||||
func set_predict_time(value: float) -> void:
|
|
||||||
predict_time = value
|
|
||||||
if pursuer:
|
|
||||||
pursuer._behavior.max_predict_time = value
|
|
@ -17,42 +17,42 @@ _global_script_classes=[ {
|
|||||||
"base": "GSTSteeringBehavior",
|
"base": "GSTSteeringBehavior",
|
||||||
"class": "GSTArrive",
|
"class": "GSTArrive",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTArrive.gd"
|
"path": "res://src/Behaviors/GSTArrive.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTGroupBehavior",
|
"base": "GSTGroupBehavior",
|
||||||
"class": "GSTAvoidCollisions",
|
"class": "GSTAvoidCollisions",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTAvoidCollisions.gd"
|
"path": "res://src/Behaviors/GSTAvoidCollisions.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTSteeringBehavior",
|
"base": "GSTSteeringBehavior",
|
||||||
"class": "GSTBlend",
|
"class": "GSTBlend",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTBlend.gd"
|
"path": "res://src/Behaviors/GSTBlend.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTGroupBehavior",
|
"base": "GSTGroupBehavior",
|
||||||
"class": "GSTCohesion",
|
"class": "GSTCohesion",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTCohesion.gd"
|
"path": "res://src/Behaviors/GSTCohesion.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTPursue",
|
"base": "GSTPursue",
|
||||||
"class": "GSTEvade",
|
"class": "GSTEvade",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTEvade.gd"
|
"path": "res://src/Behaviors/GSTEvade.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTMatchOrientation",
|
"base": "GSTMatchOrientation",
|
||||||
"class": "GSTFace",
|
"class": "GSTFace",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTFace.gd"
|
"path": "res://src/Behaviors/GSTFace.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTSeek",
|
"base": "GSTSeek",
|
||||||
"class": "GSTFlee",
|
"class": "GSTFlee",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTFlee.gd"
|
"path": "res://src/Behaviors/GSTFlee.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTArrive",
|
"base": "GSTArrive",
|
||||||
"class": "GSTFollowPath",
|
"class": "GSTFollowPath",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTFollowPath.gd"
|
"path": "res://src/Behaviors/GSTFollowPath.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTSteeringBehavior",
|
"base": "GSTSteeringBehavior",
|
||||||
"class": "GSTGroupBehavior",
|
"class": "GSTGroupBehavior",
|
||||||
@ -62,17 +62,17 @@ _global_script_classes=[ {
|
|||||||
"base": "GSTProximity",
|
"base": "GSTProximity",
|
||||||
"class": "GSTInfiniteProximity",
|
"class": "GSTInfiniteProximity",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/proximities/GSTInfiniteProximity.gd"
|
"path": "res://src/Proximities/GSTInfiniteProximity.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTMatchOrientation",
|
"base": "GSTMatchOrientation",
|
||||||
"class": "GSTLookWhereYouGo",
|
"class": "GSTLookWhereYouGo",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTLookWhereYouGo.gd"
|
"path": "res://src/Behaviors/GSTLookWhereYouGo.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTSteeringBehavior",
|
"base": "GSTSteeringBehavior",
|
||||||
"class": "GSTMatchOrientation",
|
"class": "GSTMatchOrientation",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTMatchOrientation.gd"
|
"path": "res://src/Behaviors/GSTMatchOrientation.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "Reference",
|
"base": "Reference",
|
||||||
"class": "GSTPath",
|
"class": "GSTPath",
|
||||||
@ -82,32 +82,32 @@ _global_script_classes=[ {
|
|||||||
"base": "GSTSteeringBehavior",
|
"base": "GSTSteeringBehavior",
|
||||||
"class": "GSTPriority",
|
"class": "GSTPriority",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTPriority.gd"
|
"path": "res://src/Behaviors/GSTPriority.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "Reference",
|
"base": "Reference",
|
||||||
"class": "GSTProximity",
|
"class": "GSTProximity",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/proximities/GSTProximity.gd"
|
"path": "res://src/Proximities/GSTProximity.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTSteeringBehavior",
|
"base": "GSTSteeringBehavior",
|
||||||
"class": "GSTPursue",
|
"class": "GSTPursue",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTPursue.gd"
|
"path": "res://src/Behaviors/GSTPursue.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTProximity",
|
"base": "GSTProximity",
|
||||||
"class": "GSTRadiusProximity",
|
"class": "GSTRadiusProximity",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/proximities/GSTRadiusProximity.gd"
|
"path": "res://src/Proximities/GSTRadiusProximity.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTSteeringBehavior",
|
"base": "GSTSteeringBehavior",
|
||||||
"class": "GSTSeek",
|
"class": "GSTSeek",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTSeek.gd"
|
"path": "res://src/Behaviors/GSTSeek.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTGroupBehavior",
|
"base": "GSTGroupBehavior",
|
||||||
"class": "GSTSeparation",
|
"class": "GSTSeparation",
|
||||||
"language": "GDScript",
|
"language": "GDScript",
|
||||||
"path": "res://src/behaviors/GSTSeparation.gd"
|
"path": "res://src/Behaviors/GSTSeparation.gd"
|
||||||
}, {
|
}, {
|
||||||
"base": "GSTAgentLocation",
|
"base": "GSTAgentLocation",
|
||||||
"class": "GSTSteeringAgent",
|
"class": "GSTSteeringAgent",
|
||||||
|
@ -15,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, is_open: = false) -> void:
|
func _init(waypoints: Array, open := false) -> void:
|
||||||
open = is_open
|
self.open = 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]
|
||||||
@ -39,7 +39,7 @@ func create_path(waypoints: Array) -> void:
|
|||||||
elif open:
|
elif open:
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
current = waypoints.front()
|
current = waypoints[0]
|
||||||
var segment := GSTSegment.new(previous, current)
|
var segment := GSTSegment.new(previous, current)
|
||||||
length += segment.length
|
length += segment.length
|
||||||
segment.cumulative_length = length
|
segment.cumulative_length = length
|
||||||
|
Loading…
Reference in New Issue
Block a user