Begin integrating state chart

This commit is contained in:
Jarrod Doyle 2024-02-23 21:18:44 +00:00
parent 74d19d2003
commit 4d8a0fec10
Signed by: Jayrude
GPG Key ID: 38B57B16E7C0ADF7
2 changed files with 86 additions and 20 deletions

View File

@ -1,14 +1,18 @@
[gd_scene load_steps=5 format=3 uid="uid://ul8o2n823qod"] [gd_scene load_steps=9 format=3 uid="uid://ul8o2n823qod"]
[ext_resource type="Script" path="res://content/scripts/player.gd" id="1_i6r2s"] [ext_resource type="Script" path="res://content/scripts/player.gd" id="1_i6r2s"]
[ext_resource type="Script" path="res://content/scripts/smoother.gd" id="2_dpu6i"] [ext_resource type="Script" path="res://content/scripts/smoother.gd" id="2_dpu6i"]
[ext_resource type="Script" path="res://content/scripts/dampened_camera.gd" id="3_24qwg"] [ext_resource type="Script" path="res://content/scripts/dampened_camera.gd" id="3_24qwg"]
[ext_resource type="Script" path="res://addons/godot_state_charts/state_chart.gd" id="4_erffw"]
[ext_resource type="Script" path="res://addons/godot_state_charts/compound_state.gd" id="5_mmqqh"]
[ext_resource type="Script" path="res://addons/godot_state_charts/atomic_state.gd" id="6_8xdrw"]
[ext_resource type="Script" path="res://addons/godot_state_charts/transition.gd" id="7_525mu"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_tpgoe"] [sub_resource type="CylinderShape3D" id="CylinderShape3D_tpgoe"]
height = 1.8 height = 1.8
radius = 0.25 radius = 0.25
[node name="Player" type="StaticBody3D" node_paths=PackedStringArray("head", "body", "camera", "collision_shape")] [node name="Player" type="StaticBody3D" node_paths=PackedStringArray("head", "body", "camera", "collision_shape", "state_chart")]
script = ExtResource("1_i6r2s") script = ExtResource("1_i6r2s")
max_speed = 6 max_speed = 6
slope_limit = 40.0 slope_limit = 40.0
@ -18,6 +22,7 @@ head = NodePath("Body/Head")
body = NodePath("Body") body = NodePath("Body")
camera = NodePath("Body/Head/Smoother/Camera3D") camera = NodePath("Body/Head/Smoother/Camera3D")
collision_shape = NodePath("MoveCollider") collision_shape = NodePath("MoveCollider")
state_chart = NodePath("StateChart")
[node name="MoveCollider" type="CollisionShape3D" parent="."] [node name="MoveCollider" type="CollisionShape3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.9, 0)
@ -35,3 +40,47 @@ target = NodePath("..")
[node name="Camera3D" type="Camera3D" parent="Body/Head/Smoother" node_paths=PackedStringArray("target")] [node name="Camera3D" type="Camera3D" parent="Body/Head/Smoother" node_paths=PackedStringArray("target")]
script = ExtResource("3_24qwg") script = ExtResource("3_24qwg")
target = NodePath("..") target = NodePath("..")
[node name="StateChart" type="Node" parent="."]
script = ExtResource("4_erffw")
[node name="Root" type="Node" parent="StateChart"]
script = ExtResource("5_mmqqh")
initial_state = NodePath("Grounded")
[node name="Grounded" type="Node" parent="StateChart/Root"]
script = ExtResource("6_8xdrw")
[node name="On Jump" type="Node" parent="StateChart/Root/Grounded"]
script = ExtResource("7_525mu")
to = NodePath("../../Airborne/Jumping")
event = &"Jump"
[node name="On Airborne" type="Node" parent="StateChart/Root/Grounded"]
script = ExtResource("7_525mu")
to = NodePath("../../Airborne/Falling")
event = &"Airborne"
[node name="Airborne" type="Node" parent="StateChart/Root"]
script = ExtResource("5_mmqqh")
initial_state = NodePath("Jumping")
[node name="On Grounded" type="Node" parent="StateChart/Root/Airborne"]
script = ExtResource("7_525mu")
to = NodePath("../../Grounded")
event = &"Grounded"
[node name="Jumping" type="Node" parent="StateChart/Root/Airborne"]
script = ExtResource("6_8xdrw")
[node name="On Airborne" type="Node" parent="StateChart/Root/Airborne/Jumping"]
script = ExtResource("7_525mu")
to = NodePath("../../Falling")
event = &"Airborne"
[node name="Falling" type="Node" parent="StateChart/Root/Airborne"]
script = ExtResource("6_8xdrw")
[connection signal="state_physics_processing" from="StateChart/Root/Grounded" to="." method="_on_grounded_state_physics_processing"]
[connection signal="state_physics_processing" from="StateChart/Root/Airborne/Jumping" to="." method="_on_jumping_state_physics_processing"]
[connection signal="state_physics_processing" from="StateChart/Root/Airborne/Falling" to="." method="_on_falling_state_physics_processing"]

View File

@ -22,10 +22,8 @@ enum MovementType { VERTICAL, LATERAL }
@export var head: Node3D @export var head: Node3D
@export var body: Node3D @export var body: Node3D
@export var camera: DampenedCamera3D @export var camera: DampenedCamera3D
## A reference to the collision shape this physics body is using
## (It's just a bit easier rather than aquiring the reference via code)
@export var collision_shape: CollisionShape3D @export var collision_shape: CollisionShape3D
@export var state_chart: StateChart
@export_group("Advanced") @export_group("Advanced")
## Stop movement under this distance, but only if the movement touches at least 2 steep slopes ## Stop movement under this distance, but only if the movement touches at least 2 steep slopes
@ -137,21 +135,6 @@ func get_input() -> Vector2:
return input_dir.rotated(-body.rotation.y) return input_dir.rotated(-body.rotation.y)
func _physics_process(delta: float) -> void:
# Calculate our target velocity
var move_speed := max_speed if at_max_speed else slow_speed
var target_velocity_h := get_input() * move_speed
var target_velocity_v := 0.0
if !grounded:
target_velocity_v += _velocity.y
elif jump_pressed:
target_velocity_v += jump_speed
target_velocity_v -= gravity * delta
var target_velocity := Vector3(target_velocity_h.x, target_velocity_v, target_velocity_h.y)
move(target_velocity, delta)
# Entry point to moving # Entry point to moving
func move(intended_velocity: Vector3, delta: float) -> void: func move(intended_velocity: Vector3, delta: float) -> void:
var start_position := position var start_position := position
@ -441,3 +424,37 @@ func _horz(value: Vector3) -> Vector3:
func _vert(value: Vector3) -> Vector3: func _vert(value: Vector3) -> Vector3:
return Vector3(0, value.y, 0) return Vector3(0, value.y, 0)
func _on_grounded_state_physics_processing(delta: float) -> void:
var move_speed := max_speed if at_max_speed else slow_speed
var target_velocity_h := get_input() * move_speed
var target_velocity_v := -gravity * delta
var target_velocity := Vector3(target_velocity_h.x, target_velocity_v, target_velocity_h.y)
move(target_velocity, delta)
if jump_pressed:
state_chart.send_event("Jump")
elif !grounded:
state_chart.send_event("Airborne")
func _on_falling_state_physics_processing(delta: float) -> void:
var move_speed := max_speed if at_max_speed else slow_speed
var target_velocity_h := get_input() * move_speed
var target_velocity_v := _velocity.y - gravity * delta
var target_velocity := Vector3(target_velocity_h.x, target_velocity_v, target_velocity_h.y)
move(target_velocity, delta)
if grounded:
state_chart.send_event("Grounded")
func _on_jumping_state_physics_processing(delta: float) -> void:
var move_speed := max_speed if at_max_speed else slow_speed
var target_velocity_h := get_input() * move_speed
var target_velocity_v := jump_speed
var target_velocity := Vector3(target_velocity_h.x, target_velocity_v, target_velocity_h.y)
move(target_velocity, delta)
state_chart.send_event("Airborne")