mirror of
https://github.com/Relintai/godot-steering-ai-framework.git
synced 2025-02-08 02:55:55 +01:00
Add quickstart guide and quickstart demo Authored by Razoric and edited by Nathan and Johnny. The purpose of the guide is simply to give an overview of what the behaviors are there for, and a quick look at how to actually make use of them in the basis of this toolkit, with some explanatory comments. The actual user's manual will be built out of the API reference.
91 lines
2.8 KiB
GDScript
91 lines
2.8 KiB
GDScript
extends KinematicBody2D
|
|
|
|
|
|
export var speed_max := 650.0
|
|
export var acceleration_max := 70.0
|
|
export var rotation_speed_max := 240
|
|
export var rotation_accel_max := 40
|
|
export var bullet: PackedScene
|
|
|
|
var velocity := Vector2.ZERO
|
|
var angular_velocity := 0.0
|
|
var direction := Vector2.RIGHT
|
|
|
|
onready var agent := GSTSteeringAgent.new()
|
|
onready var proxy_target := GSTAgentLocation.new()
|
|
onready var face := GSTFace.new(agent, proxy_target)
|
|
onready var accel := GSTTargetAcceleration.new()
|
|
onready var bullets := owner.get_node("Bullets")
|
|
|
|
|
|
func _ready() -> void:
|
|
agent.linear_speed_max = speed_max
|
|
agent.linear_acceleration_max = acceleration_max
|
|
agent.angular_speed_max = deg2rad(rotation_speed_max)
|
|
agent.angular_acceleration_max = deg2rad(rotation_accel_max)
|
|
agent.bounding_radius = calculate_radius($CollisionPolygon2D.polygon)
|
|
update_agent()
|
|
|
|
var mouse_pos := get_global_mouse_position()
|
|
proxy_target.position.x = mouse_pos.x
|
|
proxy_target.position.y = mouse_pos.y
|
|
|
|
face.alignment_tolerance = deg2rad(5)
|
|
face.deceleration_radius = deg2rad(45)
|
|
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
update_agent()
|
|
|
|
var movement := get_movement()
|
|
|
|
direction = Vector2(sin(-rotation), cos(rotation))
|
|
|
|
velocity += direction * acceleration_max * movement
|
|
velocity = velocity.clamped(speed_max)
|
|
velocity = velocity.linear_interpolate(Vector2.ZERO, 0.1)
|
|
velocity = move_and_slide(velocity)
|
|
|
|
face.calculate_steering(accel)
|
|
angular_velocity += accel.angular
|
|
angular_velocity = clamp(angular_velocity, -agent.angular_speed_max, agent.angular_speed_max)
|
|
angular_velocity = lerp(angular_velocity, 0, 0.1)
|
|
rotation += angular_velocity * delta
|
|
|
|
|
|
func _unhandled_input(event: InputEvent) -> void:
|
|
if event is InputEventMouseMotion:
|
|
var mouse_pos: Vector2 = event.position
|
|
proxy_target.position.x = mouse_pos.x
|
|
proxy_target.position.y = mouse_pos.y
|
|
elif event is InputEventMouseButton:
|
|
if event.button_index == BUTTON_LEFT and event.pressed:
|
|
var next_bullet: = bullet.instance()
|
|
next_bullet.global_position = global_position - direction * (agent.bounding_radius-5)
|
|
next_bullet.player = self
|
|
next_bullet.start(-direction)
|
|
bullets.add_child(next_bullet)
|
|
|
|
|
|
func get_movement() -> float:
|
|
return Input.get_action_strength("sf_down") - Input.get_action_strength("sf_up")
|
|
|
|
|
|
func update_agent() -> void:
|
|
agent.position.x = global_position.x
|
|
agent.position.y = global_position.y
|
|
agent.orientation = rotation
|
|
agent.linear_velocity.x = velocity.x
|
|
agent.linear_velocity.y = velocity.y
|
|
agent.angular_velocity = angular_velocity
|
|
|
|
|
|
func calculate_radius(polygon: PoolVector2Array) -> float:
|
|
var furthest_point := Vector2(-INF, -INF)
|
|
for p in polygon:
|
|
if abs(p.x) > furthest_point.x:
|
|
furthest_point.x = p.x
|
|
if abs(p.y) > furthest_point.y:
|
|
furthest_point.y = p.y
|
|
return furthest_point.length()
|