mirror of
https://github.com/Relintai/godot-steering-ai-framework.git
synced 2024-12-24 05:37:15 +01:00
Merge branch 'master' into features/final-toys
This commit is contained in:
commit
86cd22cfde
@ -1,9 +1,6 @@
|
|||||||
extends Node2D
|
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, 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, 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, 100, 0.1) var arrival_tolerance := 25.0 setget set_arrival_tolerance
|
||||||
@ -14,9 +11,10 @@ const COLORS := {
|
|||||||
arrival_tolerance = Color(0.5, 0.7, 0.9, 0.2)
|
arrival_tolerance = Color(0.5, 0.7, 0.9, 0.2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onready var arriver := $Arriver
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
target.position = arriver.global_position
|
|
||||||
arriver.setup(
|
arriver.setup(
|
||||||
max_linear_speed,
|
max_linear_speed,
|
||||||
max_linear_acceleration,
|
max_linear_acceleration,
|
||||||
@ -28,13 +26,13 @@ func _ready() -> void:
|
|||||||
func _unhandled_input(event: InputEvent) -> void:
|
func _unhandled_input(event: InputEvent) -> void:
|
||||||
if event is InputEventMouseButton and event.button_index == BUTTON_LEFT and event.is_pressed():
|
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)
|
arriver.target.position = Vector3(event.position.x, event.position.y, 0)
|
||||||
target.position = event.position
|
|
||||||
update()
|
update()
|
||||||
|
|
||||||
|
|
||||||
func _draw():
|
func _draw():
|
||||||
draw_circle(target.position, deceleration_radius, COLORS.deceleration_radius)
|
var target_position := Vector2(arriver.target.position.x, arriver.target.position.y)
|
||||||
draw_circle(target.position, arrival_tolerance, COLORS.arrival_tolerance)
|
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:
|
func set_arrival_tolerance(value: float) -> void:
|
||||||
|
@ -23,9 +23,6 @@ shape = SubResource( 1 )
|
|||||||
modulate = Color( 0.952941, 0.172549, 0.0431373, 1 )
|
modulate = Color( 0.952941, 0.172549, 0.0431373, 1 )
|
||||||
texture = ExtResource( 4 )
|
texture = ExtResource( 4 )
|
||||||
|
|
||||||
[node name="Target" type="Node2D" parent="."]
|
|
||||||
position = Vector2( 0, 1 )
|
|
||||||
|
|
||||||
[node name="GUI" type="PanelContainer" parent="."]
|
[node name="GUI" type="PanelContainer" parent="."]
|
||||||
anchor_right = 1.0
|
anchor_right = 1.0
|
||||||
margin_right = 1024.0
|
margin_right = 1024.0
|
||||||
@ -40,10 +37,15 @@ __meta__ = {
|
|||||||
margin_right = 1024.0
|
margin_right = 1024.0
|
||||||
margin_bottom = 87.0
|
margin_bottom = 87.0
|
||||||
|
|
||||||
[node name="Label" type="Label" parent="GUI/MarginContainer"]
|
[node name="RichTextLabel" type="RichTextLabel" parent="GUI/MarginContainer"]
|
||||||
margin_left = 16.0
|
margin_left = 16.0
|
||||||
margin_top = 16.0
|
margin_top = 16.0
|
||||||
margin_right = 1008.0
|
margin_right = 1008.0
|
||||||
margin_bottom = 71.0
|
margin_bottom = 71.0
|
||||||
|
rect_min_size = Vector2( 0, 55 )
|
||||||
|
bbcode_enabled = true
|
||||||
|
bbcode_text = "Arrive Demo
|
||||||
|
Mouse click to make the [color=red]red \"Player\"[/color] move to the [color=yellow]yellow target[/color]"
|
||||||
text = "Arrive Demo
|
text = "Arrive Demo
|
||||||
Mouse click to make the red \"Player\" move to the yellow target"
|
Mouse click to make the red \"Player\" move to the yellow target"
|
||||||
|
scroll_active = false
|
||||||
|
@ -9,14 +9,10 @@ onready var agent := GSTAgentLocation.new()
|
|||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
var movement := _get_movement()
|
var movement := _get_movement()
|
||||||
move_and_slide(movement * speed)
|
move_and_slide(movement * speed)
|
||||||
_update_agent()
|
agent.position = Vector3(global_position.x, global_position.y, 0)
|
||||||
|
|
||||||
|
|
||||||
func _get_movement() -> Vector2:
|
func _get_movement() -> Vector2:
|
||||||
return Vector2(
|
return Vector2(
|
||||||
Input.get_action_strength("sf_right") - Input.get_action_strength("sf_left"),
|
Input.get_action_strength("sf_right") - Input.get_action_strength("sf_left"),
|
||||||
Input.get_action_strength("sf_down") - Input.get_action_strength("sf_up"))
|
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)
|
|
||||||
|
@ -6,10 +6,22 @@ onready var spawner := $Spawner
|
|||||||
export var max_linear_speed := 100.0 setget set_max_linear_speed
|
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 max_linear_accel := 25.0 setget set_max_linear_accel
|
||||||
export var proximity_radius := 140.0 setget set_proximity_radius
|
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 separation_decay_coefficient := 2000.0 setget set_separation_decay_coef
|
||||||
export var cohesion_strength := 0.3 setget set_cohesion_strength
|
export var cohesion_strength := 0.3 setget set_cohesion_strength
|
||||||
export var separation_strength := 1.5 setget set_separation_strength
|
export var separation_strength := 1.5 setget set_separation_strength
|
||||||
|
export var show_proximity_radius := true setget set_show_proximity_radius
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
spawner.setup(
|
||||||
|
max_linear_speed,
|
||||||
|
max_linear_accel,
|
||||||
|
proximity_radius,
|
||||||
|
separation_decay_coefficient,
|
||||||
|
cohesion_strength,
|
||||||
|
separation_strength,
|
||||||
|
show_proximity_radius
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
func set_max_linear_speed(value: float) -> void:
|
func set_max_linear_speed(value: float) -> void:
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
extends KinematicBody2D
|
extends KinematicBody2D
|
||||||
|
|
||||||
|
|
||||||
var agent := GSTSteeringAgent.new()
|
|
||||||
var separation: GSTSeparation
|
var separation: GSTSeparation
|
||||||
var cohesion: GSTCohesion
|
var cohesion: GSTCohesion
|
||||||
var proximity: GSTRadiusProximity
|
var proximity: GSTRadiusProximity
|
||||||
|
var agent := GSTSteeringAgent.new()
|
||||||
var blend := GSTBlend.new(agent)
|
var blend := GSTBlend.new(agent)
|
||||||
var acceleration := GSTTargetAcceleration.new()
|
var acceleration := GSTTargetAcceleration.new()
|
||||||
var draw_proximity := false
|
var draw_proximity := false
|
||||||
@ -41,18 +41,14 @@ func _draw() -> void:
|
|||||||
|
|
||||||
|
|
||||||
func _process(delta: float) -> void:
|
func _process(delta: float) -> void:
|
||||||
update_agent()
|
agent.position.x = global_position.x
|
||||||
|
agent.position.y = global_position.y
|
||||||
if blend:
|
if blend:
|
||||||
acceleration = blend.calculate_steering(acceleration)
|
acceleration = blend.calculate_steering(acceleration)
|
||||||
_velocity = (_velocity + Vector2(acceleration.linear.x, acceleration.linear.y)).clamped(agent.max_linear_speed)
|
_velocity += Vector2(acceleration.linear.x, acceleration.linear.y)
|
||||||
|
_velocity = _velocity.clamped(agent.max_linear_speed)
|
||||||
move_and_slide(_velocity)
|
move_and_slide(_velocity)
|
||||||
|
|
||||||
|
|
||||||
func set_neighbors(neighbor: Array) -> void:
|
func set_neighbors(neighbor: Array) -> void:
|
||||||
proximity.agents = neighbor
|
proximity.agents = neighbor
|
||||||
|
|
||||||
|
|
||||||
func update_agent() -> void:
|
|
||||||
var current_position := global_position
|
|
||||||
agent.position.x = current_position.x
|
|
||||||
agent.position.y = current_position.y
|
|
||||||
|
@ -4,7 +4,15 @@ extends Node2D
|
|||||||
export var member: PackedScene
|
export var member: PackedScene
|
||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func setup(
|
||||||
|
max_linear_speed: float,
|
||||||
|
max_linear_accel: float,
|
||||||
|
proximity_radius: float,
|
||||||
|
separation_decay_coefficient: float,
|
||||||
|
cohesion_strength: float,
|
||||||
|
separation_strength: float,
|
||||||
|
show_proximity_radius: bool
|
||||||
|
) -> void:
|
||||||
var followers := []
|
var followers := []
|
||||||
for i in range(19):
|
for i in range(19):
|
||||||
var follower := member.instance()
|
var follower := member.instance()
|
||||||
@ -12,14 +20,14 @@ func _ready() -> void:
|
|||||||
follower.position += Vector2(rand_range(-60, 60), rand_range(-60, 60))
|
follower.position += Vector2(rand_range(-60, 60), rand_range(-60, 60))
|
||||||
followers.append(follower)
|
followers.append(follower)
|
||||||
follower.setup(
|
follower.setup(
|
||||||
owner.max_linear_speed,
|
max_linear_speed,
|
||||||
owner.max_linear_accel,
|
max_linear_accel,
|
||||||
owner.proximity_radius,
|
proximity_radius,
|
||||||
owner.separation_decay_coefficient,
|
separation_decay_coefficient,
|
||||||
owner.cohesion_strength,
|
cohesion_strength,
|
||||||
owner.separation_strength
|
separation_strength
|
||||||
)
|
)
|
||||||
if i == 0 and owner.show_proximity_radius:
|
if i == 0 and show_proximity_radius:
|
||||||
follower.draw_proximity = true
|
follower.draw_proximity = true
|
||||||
follower.update()
|
follower.update()
|
||||||
var agents := []
|
var agents := []
|
||||||
|
@ -2,10 +2,6 @@ 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/PursueSeek/Ship.gd")
|
|
||||||
onready var ships := [$Player, $Pursuer, $Seeker]
|
|
||||||
|
|
||||||
var _clones := {}
|
|
||||||
var _world_bounds: Vector2
|
var _world_bounds: Vector2
|
||||||
|
|
||||||
|
|
||||||
@ -15,53 +11,7 @@ func _ready() -> void:
|
|||||||
ProjectSettings["display/window/size/height"]
|
ProjectSettings["display/window/size/height"]
|
||||||
)
|
)
|
||||||
|
|
||||||
for i in range(ships.size()):
|
|
||||||
var ship: Node2D = ships[i]
|
|
||||||
var world_pos := ship.position
|
|
||||||
|
|
||||||
for i in range(3):
|
|
||||||
var ship_clone := ShipType.new()
|
|
||||||
|
|
||||||
ship_clone.position.x = world_pos.x if i == 1 else (world_pos.x - _world_bounds.x)
|
|
||||||
ship_clone.position.y = world_pos.y if i == 0 else (world_pos.y - _world_bounds.y)
|
|
||||||
ship_clone.rotation = ship.rotation
|
|
||||||
ship_clone.tag = i
|
|
||||||
ship_clone.name = ship.name + "Clone"
|
|
||||||
|
|
||||||
add_child(ship_clone)
|
|
||||||
ship_clone.generate_sprite(ship.get_node("Sprite"))
|
|
||||||
_clones[ship_clone] = ship
|
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
for clone in _clones.keys():
|
for ship in get_children():
|
||||||
var original: Node2D = _clones[clone]
|
ship.position = ship.position.posmodv(_world_bounds)
|
||||||
var world_pos: Vector2 = original.position
|
|
||||||
|
|
||||||
if world_pos.y < 0:
|
|
||||||
original.position.y = _world_bounds.y + world_pos.y
|
|
||||||
elif world_pos.y > _world_bounds.y:
|
|
||||||
original.position.y = (world_pos.y - _world_bounds.y)
|
|
||||||
|
|
||||||
if world_pos.x < 0:
|
|
||||||
original.position.x = _world_bounds.x + world_pos.x
|
|
||||||
elif world_pos.x > _world_bounds.x:
|
|
||||||
original.position.x = (world_pos.x - _world_bounds.x)
|
|
||||||
|
|
||||||
var tag: int = clone.tag
|
|
||||||
if tag != 2:
|
|
||||||
if world_pos.x < _world_bounds.x/2:
|
|
||||||
clone.position.x = world_pos.x + _world_bounds.x
|
|
||||||
else:
|
|
||||||
clone.position.x = world_pos.x - _world_bounds.x
|
|
||||||
else:
|
|
||||||
clone.position.x = world_pos.x
|
|
||||||
|
|
||||||
if tag != 0:
|
|
||||||
if world_pos.y < _world_bounds.y/2:
|
|
||||||
clone.position.y = world_pos.y + _world_bounds.y
|
|
||||||
else:
|
|
||||||
clone.position.y = world_pos.y - _world_bounds.y
|
|
||||||
else:
|
|
||||||
clone.position.y = world_pos.y
|
|
||||||
clone.rotation = original.rotation
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
extends "res://demos/PursueSeek/Ship.gd"
|
extends KinematicBody2D
|
||||||
# Controls the player ship's movements based on player input.
|
# Controls the player ship's movements based on player input.
|
||||||
|
|
||||||
|
|
||||||
@ -25,7 +25,7 @@ func _physics_process(delta: float) -> void:
|
|||||||
angular_drag,
|
angular_drag,
|
||||||
delta
|
delta
|
||||||
)
|
)
|
||||||
rotation += (_angular_velocity * delta)
|
rotation += _angular_velocity * delta
|
||||||
|
|
||||||
_linear_velocity = _calculate_linear_velocity(
|
_linear_velocity = _calculate_linear_velocity(
|
||||||
movement.y,
|
movement.y,
|
||||||
@ -38,18 +38,17 @@ func _physics_process(delta: float) -> void:
|
|||||||
)
|
)
|
||||||
|
|
||||||
_linear_velocity = move_and_slide(_linear_velocity)
|
_linear_velocity = move_and_slide(_linear_velocity)
|
||||||
|
_update_agent()
|
||||||
_update_agent(_linear_velocity, rotation)
|
|
||||||
|
|
||||||
|
|
||||||
func _calculate_angular_velocity(
|
func _calculate_angular_velocity(
|
||||||
horizontal_movement: float,
|
horizontal_movement: float,
|
||||||
current_velocity: float,
|
current_velocity: float,
|
||||||
thruster_strength: float,
|
thruster_strength: float,
|
||||||
max_velocity: float,
|
max_velocity: float,
|
||||||
ship_drag: float,
|
ship_drag: float,
|
||||||
delta: float) -> float:
|
delta: float
|
||||||
|
) -> float:
|
||||||
var velocity := clamp(
|
var velocity := clamp(
|
||||||
current_velocity + thruster_strength * horizontal_movement * delta,
|
current_velocity + thruster_strength * horizontal_movement * delta,
|
||||||
-max_velocity,
|
-max_velocity,
|
||||||
@ -62,14 +61,14 @@ func _calculate_angular_velocity(
|
|||||||
|
|
||||||
|
|
||||||
func _calculate_linear_velocity(
|
func _calculate_linear_velocity(
|
||||||
vertical_movement: float,
|
vertical_movement: float,
|
||||||
current_velocity: Vector2,
|
current_velocity: Vector2,
|
||||||
facing_direction: Vector2,
|
facing_direction: Vector2,
|
||||||
ship_drag_coefficient: float,
|
ship_drag_coefficient: float,
|
||||||
strength: float,
|
strength: float,
|
||||||
max_speed: float,
|
max_speed: float,
|
||||||
delta: float) -> Vector2:
|
delta: float
|
||||||
|
) -> Vector2:
|
||||||
var actual_strength := 0.0
|
var actual_strength := 0.0
|
||||||
if vertical_movement > 0:
|
if vertical_movement > 0:
|
||||||
actual_strength = strength
|
actual_strength = strength
|
||||||
@ -87,10 +86,10 @@ func _get_movement() -> Vector2:
|
|||||||
Input.get_action_strength("sf_up") - Input.get_action_strength("sf_down"))
|
Input.get_action_strength("sf_up") - Input.get_action_strength("sf_down"))
|
||||||
|
|
||||||
|
|
||||||
func _update_agent(velocity: Vector2, orientation: float) -> void:
|
func _update_agent() -> void:
|
||||||
agent.position.x = global_position.x
|
agent.position.x = global_position.x
|
||||||
agent.position.y = global_position.y
|
agent.position.y = global_position.y
|
||||||
agent.linear_velocity.x = velocity.x
|
agent.linear_velocity.x = _linear_velocity.x
|
||||||
agent.linear_velocity.y = velocity.y
|
agent.linear_velocity.y = _linear_velocity.y
|
||||||
agent.angular_velocity = _angular_velocity
|
agent.angular_velocity = _angular_velocity
|
||||||
agent.orientation = orientation
|
agent.orientation = rotation
|
||||||
|
@ -1,13 +1,18 @@
|
|||||||
extends Node2D
|
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, 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, 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
|
export(float, 0, 5, 0.1) var predict_time := 2.0 setget set_predict_time
|
||||||
|
|
||||||
|
onready var pursuer := $BoundaryManager/Pursuer
|
||||||
|
onready var seeker := $BoundaryManager/Seeker
|
||||||
|
|
||||||
|
|
||||||
|
func _ready() -> void:
|
||||||
|
pursuer.setup(predict_time, max_linear_speed, max_linear_accel)
|
||||||
|
seeker.setup(predict_time, max_linear_speed, max_linear_accel)
|
||||||
|
|
||||||
|
|
||||||
func set_max_linear_speed(value: float) -> void:
|
func set_max_linear_speed(value: float) -> void:
|
||||||
if not is_inside_tree():
|
if not is_inside_tree():
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
[gd_scene load_steps=6 format=2]
|
[gd_scene load_steps=7 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://demos/PursueSeek/Pursuer.gd" type="Script" id=1]
|
[ext_resource path="res://demos/PursueSeek/Pursuer.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://demos/PursueSeek/Player.gd" type="Script" id=2]
|
[ext_resource path="res://demos/PursueSeek/Player.gd" type="Script" id=2]
|
||||||
[ext_resource path="res://demos/PursueSeek/BoundaryManager.gd" type="Script" id=3]
|
[ext_resource path="res://demos/PursueSeek/BoundaryManager.gd" type="Script" id=3]
|
||||||
[ext_resource path="res://demos/PursueSeek/PursueVSSeekDemo.gd" type="Script" id=4]
|
[ext_resource path="res://demos/PursueSeek/PursueVSSeekDemo.gd" type="Script" id=4]
|
||||||
|
[ext_resource path="res://assets/theme/gdquest.theme" type="Theme" id=5]
|
||||||
[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"]
|
||||||
@ -22,6 +23,9 @@ position = Vector2( 49.2031, 556.936 )
|
|||||||
rotation = 1.5708
|
rotation = 1.5708
|
||||||
collision_mask = 2
|
collision_mask = 2
|
||||||
script = ExtResource( 2 )
|
script = ExtResource( 2 )
|
||||||
|
thruster_strength = 600.0
|
||||||
|
side_thruster_strength = 20.0
|
||||||
|
max_velocity = 900.0
|
||||||
|
|
||||||
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="BoundaryManager/Player"]
|
[node name="CollisionPolygon2D" type="CollisionPolygon2D" parent="BoundaryManager/Player"]
|
||||||
polygon = PoolVector2Array( 0, -32, -24, 32, 24, 32 )
|
polygon = PoolVector2Array( 0, -32, -24, 32, 24, 32 )
|
||||||
@ -31,7 +35,7 @@ modulate = Color( 0.968627, 0.188235, 0.0352941, 1 )
|
|||||||
texture = ExtResource( 6 )
|
texture = ExtResource( 6 )
|
||||||
|
|
||||||
[node name="Pursuer" type="KinematicBody2D" parent="BoundaryManager"]
|
[node name="Pursuer" type="KinematicBody2D" parent="BoundaryManager"]
|
||||||
position = Vector2( 868.495, 87.9043 )
|
position = Vector2( 868.495, 200 )
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
@ -43,7 +47,7 @@ modulate = Color( 0.756863, 0.952941, 0.054902, 1 )
|
|||||||
texture = ExtResource( 6 )
|
texture = ExtResource( 6 )
|
||||||
|
|
||||||
[node name="Seeker" type="KinematicBody2D" parent="BoundaryManager"]
|
[node name="Seeker" type="KinematicBody2D" parent="BoundaryManager"]
|
||||||
position = Vector2( 821.24, 87.9043 )
|
position = Vector2( 821.24, 200 )
|
||||||
collision_layer = 2
|
collision_layer = 2
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
use_seek = true
|
use_seek = true
|
||||||
@ -54,3 +58,30 @@ polygon = PoolVector2Array( 0, -32, -24, 32, 24, 32 )
|
|||||||
[node name="Sprite" type="Sprite" parent="BoundaryManager/Seeker"]
|
[node name="Sprite" type="Sprite" parent="BoundaryManager/Seeker"]
|
||||||
modulate = Color( 0.278431, 0.815686, 0.14902, 1 )
|
modulate = Color( 0.278431, 0.815686, 0.14902, 1 )
|
||||||
texture = ExtResource( 6 )
|
texture = ExtResource( 6 )
|
||||||
|
|
||||||
|
[node name="GUI" type="PanelContainer" parent="."]
|
||||||
|
margin_right = 1024.0
|
||||||
|
margin_bottom = 14.0
|
||||||
|
theme = ExtResource( 5 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="MarginContainer" type="MarginContainer" parent="GUI"]
|
||||||
|
margin_right = 1024.0
|
||||||
|
margin_bottom = 116.0
|
||||||
|
|
||||||
|
[node name="RichTextLabel" type="RichTextLabel" parent="GUI/MarginContainer"]
|
||||||
|
margin_left = 16.0
|
||||||
|
margin_top = 16.0
|
||||||
|
margin_right = 1008.0
|
||||||
|
margin_bottom = 100.0
|
||||||
|
rect_min_size = Vector2( 0, 84 )
|
||||||
|
bbcode_enabled = true
|
||||||
|
bbcode_text = "Pursue vs. Seek Demo
|
||||||
|
Move the player around with WASD and notice the [color=yellow]yellow Pursuer[/color] and the [color=green]green Seeker[/color] follow
|
||||||
|
the [color=red]red \"Ship\"[/color] around"
|
||||||
|
text = "Pursue vs. Seek Demo
|
||||||
|
Move the player around with WASD and notice the yellow Pursuer and the green Seeker follow
|
||||||
|
the red \"Ship\" around"
|
||||||
|
scroll_active = false
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
extends "res://demos/PursueSeek/Ship.gd"
|
extends KinematicBody2D
|
||||||
# Represents a ship that chases after the player.
|
# Represents a ship that chases after the player.
|
||||||
|
|
||||||
|
|
||||||
@ -18,24 +18,7 @@ var _angular_drag := 1.0
|
|||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
_setup()
|
set_physics_process(false)
|
||||||
|
|
||||||
|
|
||||||
func _setup() -> void:
|
|
||||||
if use_seek:
|
|
||||||
_behavior = GSTSeek.new(agent, player_agent)
|
|
||||||
else:
|
|
||||||
_behavior = GSTPursue.new(agent, player_agent, owner.predict_time)
|
|
||||||
|
|
||||||
_orient_behavior = GSTLookWhereYouGo.new(agent)
|
|
||||||
_orient_behavior.alignment_tolerance = 0.001
|
|
||||||
_orient_behavior.deceleration_radius = PI/2
|
|
||||||
|
|
||||||
agent.max_angular_acceleration = 2
|
|
||||||
agent.max_angular_speed = 5
|
|
||||||
agent.max_linear_acceleration = owner.max_linear_accel
|
|
||||||
agent.max_linear_speed = owner.max_linear_speed
|
|
||||||
_update_agent()
|
|
||||||
|
|
||||||
|
|
||||||
func _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
@ -47,7 +30,7 @@ func _physics_process(delta: float) -> void:
|
|||||||
elif _angular_velocity > 0:
|
elif _angular_velocity > 0:
|
||||||
_angular_velocity -= _angular_drag * delta
|
_angular_velocity -= _angular_drag * delta
|
||||||
|
|
||||||
rotation = rotation + _angular_velocity * delta
|
rotation += _angular_velocity * delta
|
||||||
|
|
||||||
accel = _behavior.calculate_steering(accel)
|
accel = _behavior.calculate_steering(accel)
|
||||||
_linear_velocity += Vector2(accel.linear.x, accel.linear.y)
|
_linear_velocity += Vector2(accel.linear.x, accel.linear.y)
|
||||||
@ -58,6 +41,25 @@ func _physics_process(delta: float) -> void:
|
|||||||
_update_agent()
|
_update_agent()
|
||||||
|
|
||||||
|
|
||||||
|
func setup(predict_time: float, max_linear_speed: float, max_linear_accel: float) -> void:
|
||||||
|
if use_seek:
|
||||||
|
_behavior = GSTSeek.new(agent, player_agent)
|
||||||
|
else:
|
||||||
|
_behavior = GSTPursue.new(agent, player_agent, predict_time)
|
||||||
|
|
||||||
|
_orient_behavior = GSTLookWhereYouGo.new(agent)
|
||||||
|
_orient_behavior.alignment_tolerance = 0.001
|
||||||
|
_orient_behavior.deceleration_radius = PI/2
|
||||||
|
|
||||||
|
agent.max_angular_acceleration = 2
|
||||||
|
agent.max_angular_speed = 5
|
||||||
|
agent.max_linear_acceleration = max_linear_accel
|
||||||
|
agent.max_linear_speed = max_linear_speed
|
||||||
|
|
||||||
|
_update_agent()
|
||||||
|
set_physics_process(true)
|
||||||
|
|
||||||
|
|
||||||
func _update_agent() -> void:
|
func _update_agent() -> void:
|
||||||
agent.position.x = global_position.x
|
agent.position.x = global_position.x
|
||||||
agent.position.y = global_position.y
|
agent.position.y = global_position.y
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
extends KinematicBody2D
|
|
||||||
# Represents a basic ship
|
|
||||||
|
|
||||||
|
|
||||||
var tag: int = 0
|
|
||||||
|
|
||||||
|
|
||||||
func generate_sprite(sprite: Sprite) -> void:
|
|
||||||
var new_sprite = Sprite.new()
|
|
||||||
new_sprite.texture = sprite.texture
|
|
||||||
new_sprite.modulate = sprite.modulate
|
|
||||||
new_sprite.name = "Sprite"
|
|
||||||
add_child(new_sprite)
|
|
@ -6,7 +6,7 @@ var rect: Rect2
|
|||||||
|
|
||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
var extents := ($CollisionShape2D.shape as RectangleShape2D).extents
|
var extents: Vector2 = $CollisionShape2D.shape.extents
|
||||||
rect = Rect2(-extents, extents*2)
|
rect = Rect2(-extents, extents*2)
|
||||||
|
|
||||||
|
|
||||||
|
@ -2,14 +2,8 @@ extends KinematicBody2D
|
|||||||
# Class to control the player in basic left/right up/down movement.
|
# Class to control the player in basic left/right up/down movement.
|
||||||
|
|
||||||
|
|
||||||
onready var agent := GSTAgentLocation.new()
|
var speed: float
|
||||||
|
var agent := GSTAgentLocation.new()
|
||||||
export var speed := 200.0
|
|
||||||
|
|
||||||
|
|
||||||
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 _physics_process(delta: float) -> void:
|
func _physics_process(delta: float) -> void:
|
||||||
@ -19,3 +13,8 @@ func _physics_process(delta: float) -> void:
|
|||||||
|
|
||||||
move_and_slide(movement * speed)
|
move_and_slide(movement * speed)
|
||||||
agent.position = Vector3(global_position.x, global_position.y, 0)
|
agent.position = Vector3(global_position.x, global_position.y, 0)
|
||||||
|
|
||||||
|
|
||||||
|
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"))
|
||||||
|
@ -7,6 +7,7 @@ enum Mode { FLEE, SEEK }
|
|||||||
export(Mode) var behavior_mode := Mode.SEEK setget set_behavior_mode
|
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
|
||||||
|
export(float) var player_speed := 600.0 setget set_player_speed
|
||||||
|
|
||||||
var camera_boundaries: Rect2
|
var camera_boundaries: Rect2
|
||||||
|
|
||||||
@ -26,6 +27,8 @@ func _ready() -> void:
|
|||||||
var rng := RandomNumberGenerator.new()
|
var rng := RandomNumberGenerator.new()
|
||||||
rng.randomize()
|
rng.randomize()
|
||||||
|
|
||||||
|
player.speed = player_speed
|
||||||
|
|
||||||
for i in range(spawner.entity_count):
|
for i in range(spawner.entity_count):
|
||||||
var new_pos := Vector2(
|
var new_pos := Vector2(
|
||||||
rng.randf_range(-camera_boundaries.size.x/2, camera_boundaries.size.x/2),
|
rng.randf_range(-camera_boundaries.size.x/2, camera_boundaries.size.x/2),
|
||||||
@ -69,3 +72,11 @@ func set_max_linear_accel(value: float) -> void:
|
|||||||
max_linear_accel = value
|
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
|
||||||
|
|
||||||
|
|
||||||
|
func set_player_speed(value: float) -> void:
|
||||||
|
if not is_inside_tree():
|
||||||
|
return
|
||||||
|
|
||||||
|
player_speed = value
|
||||||
|
player.speed = player_speed
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
[gd_scene load_steps=10 format=2]
|
[gd_scene load_steps=11 format=2]
|
||||||
|
|
||||||
[ext_resource path="res://demos/SeekFlee/Boundary.gd" type="Script" id=1]
|
[ext_resource path="res://demos/SeekFlee/Boundary.gd" type="Script" id=1]
|
||||||
[ext_resource path="res://demos/SeekFlee/Player.gd" type="Script" id=2]
|
[ext_resource path="res://demos/SeekFlee/Player.gd" type="Script" id=2]
|
||||||
[ext_resource path="res://demos/SeekFlee/SeekFleeDemo.gd" type="Script" id=3]
|
[ext_resource path="res://demos/SeekFlee/SeekFleeDemo.gd" type="Script" id=3]
|
||||||
[ext_resource path="res://demos/SeekFlee/Spawner.gd" type="Script" id=4]
|
[ext_resource path="res://demos/SeekFlee/Spawner.gd" type="Script" id=4]
|
||||||
|
[ext_resource path="res://assets/theme/gdquest.theme" type="Theme" id=5]
|
||||||
[ext_resource path="res://demos/SeekFlee/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]
|
||||||
|
|
||||||
@ -75,3 +76,31 @@ shape = SubResource( 3 )
|
|||||||
[node name="Spawner" type="Node2D" parent="."]
|
[node name="Spawner" type="Node2D" parent="."]
|
||||||
script = ExtResource( 4 )
|
script = ExtResource( 4 )
|
||||||
Entity = ExtResource( 6 )
|
Entity = ExtResource( 6 )
|
||||||
|
|
||||||
|
[node name="CanvasLayer" type="CanvasLayer" parent="."]
|
||||||
|
|
||||||
|
[node name="GUI" type="PanelContainer" parent="CanvasLayer"]
|
||||||
|
margin_right = 1024.0
|
||||||
|
margin_bottom = 116.0
|
||||||
|
theme = ExtResource( 5 )
|
||||||
|
__meta__ = {
|
||||||
|
"_edit_use_anchors_": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[node name="MarginContainer" type="MarginContainer" parent="CanvasLayer/GUI"]
|
||||||
|
margin_right = 1024.0
|
||||||
|
margin_bottom = 116.0
|
||||||
|
|
||||||
|
[node name="RichTextLabel" type="RichTextLabel" parent="CanvasLayer/GUI/MarginContainer"]
|
||||||
|
margin_left = 16.0
|
||||||
|
margin_top = 16.0
|
||||||
|
margin_right = 1008.0
|
||||||
|
margin_bottom = 100.0
|
||||||
|
rect_min_size = Vector2( 0, 84 )
|
||||||
|
bbcode_enabled = true
|
||||||
|
bbcode_text = "Seek & Flee Demo
|
||||||
|
Move the [color=red]red \"Player\"[/color] around with WASD and notice the [color=blue]blue \"Enemies\"[/color] and the seek/flee
|
||||||
|
the \"Player\""
|
||||||
|
text = "Seek & Flee Demo
|
||||||
|
Move the red \"Player\" around with WASD and notice the blue \"Enemies\" and the seek/flee
|
||||||
|
the \"Player\""
|
||||||
|
Loading…
Reference in New Issue
Block a user