diff --git a/src/Boss/SlimeBoss/SlimeBossStateMachine.gd b/src/Boss/SlimeBoss/SlimeBossStateMachine.gd index ff15a6c..d480320 100644 --- a/src/Boss/SlimeBoss/SlimeBossStateMachine.gd +++ b/src/Boss/SlimeBoss/SlimeBossStateMachine.gd @@ -7,25 +7,3 @@ func _ready(): "split_up": $SplitUp, "stagger": $Stagger } - -func _change_state(state_name): - # The base state_machine interface this node extends does most of the work - if not _active: - return - if state_name in ["stagger"]: - states_stack.push_front(states_map[state_name]) - if state_name == "jump" and current_state == $Move: - $Jump.initialize($Move.speed, $Move.velocity) - ._change_state(state_name) - -func _input(event): - """ - Here we only handle input that can interrupt states, attacking in this case - otherwise we let the state node handle it - """ - if event.is_action_pressed("attack"): - if current_state == $Attack: - return - _change_state("attack") - return - current_state.handle_input(event) diff --git a/src/Boss/SlimeBoss/States/Motion/Idle.gd b/src/Boss/SlimeBoss/States/Motion/Idle.gd index 8f87f5c..992b176 100644 --- a/src/Boss/SlimeBoss/States/Motion/Idle.gd +++ b/src/Boss/SlimeBoss/States/Motion/Idle.gd @@ -1,4 +1,4 @@ -extends "res://Boss/SlimeBoss/States/Motion/MotionState.gd" +extends "res://Overlap/StateMachine/MotionState.gd" func enter(): owner.get_node("AnimationPlayer").play("MoveDown") # TODO: Replace animation @@ -9,4 +9,5 @@ func handle_input(event): func update(delta): var input_direction = get_input_direction() if input_direction: - emit_signal("finished", "move") + # emit_signal("finished", "move") + pass diff --git a/src/Boss/SlimeBoss/States/Motion/MotionState.gd b/src/Boss/SlimeBoss/States/Motion/MotionState.gd deleted file mode 100644 index 346a26b..0000000 --- a/src/Boss/SlimeBoss/States/Motion/MotionState.gd +++ /dev/null @@ -1,7 +0,0 @@ -extends "res://Overlap/StateMachine/State.gd" - -func get_input_direction(): - var input_direction = Vector2() - input_direction.x = int(Input.is_action_pressed("move_right")) - int(Input.is_action_pressed("move_left")) - input_direction.y = int(Input.is_action_pressed("move_down")) - int(Input.is_action_pressed("move_up")) - return input_direction diff --git a/src/Overlap/StateMachine/MotionState.gd b/src/Overlap/StateMachine/MotionState.gd new file mode 100644 index 0000000..8f252c7 --- /dev/null +++ b/src/Overlap/StateMachine/MotionState.gd @@ -0,0 +1,8 @@ +extends "res://Overlap/StateMachine/State.gd" + +func get_input_direction(): + var input_direction = Vector2() + input_direction.x = int(Input.is_action_pressed("right")) - int(Input.is_action_pressed("left")) + input_direction.y = int(Input.is_action_pressed("down")) - int(Input.is_action_pressed("up")) + input_direction = input_direction.normalized() + return input_direction diff --git a/src/Overlap/StateMachine/StateMachine.gd b/src/Overlap/StateMachine/StateMachine.gd index b5e406a..bdf4c42 100644 --- a/src/Overlap/StateMachine/StateMachine.gd +++ b/src/Overlap/StateMachine/StateMachine.gd @@ -11,7 +11,7 @@ var _active = false setget set_active func _ready(): for child in get_children(): - child.connect("finished", self, "_change_state") + child.connect("finished", self, "change_state") initialize(START_STATE) func initialize(start_state): @@ -39,7 +39,7 @@ func _on_animation_finished(anim_name): return current_state._on_animation_finished(anim_name) -func _change_state(state_name): +func change_state(state_name): if not _active: return current_state.exit() diff --git a/src/Overlap/Stats/Stats.gd b/src/Overlap/Stats/Stats.gd index 6ce45cf..c651303 100644 --- a/src/Overlap/Stats/Stats.gd +++ b/src/Overlap/Stats/Stats.gd @@ -9,7 +9,6 @@ onready var speed := max_speed setget set_speed signal no_health func set_health(value): - if value > max_health: health = max_health else: diff --git a/src/Player/Player.gd b/src/Player/Player.gd index e917244..1dfcb1e 100644 --- a/src/Player/Player.gd +++ b/src/Player/Player.gd @@ -14,9 +14,7 @@ export(int, 0, 500) var ACCELERATION := 450 onready var player_stats := $Stats onready var debug_label := $DebugLabel -onready var animation_player := $AnimationPlayer -onready var animation_tree := $AnimationTree -onready var animation_state = animation_tree.get("parameters/playback") +onready var animation_state := $AnimationStates enum moveState{ MOVE, @@ -65,6 +63,7 @@ func move(): move_and_slide(velocity) func movement_move(delta): + var input_vector = Vector2.ZERO # This is a clever way to handle directional input # Input.get_action_strength(...) returns a value between 0 and 1 depending @@ -76,15 +75,12 @@ func movement_move(delta): input_vector = input_vector.normalized() if input_vector == Vector2.ZERO: - animation_state.travel("idle") + animation_state.change_state("idle") velocity = Vector2.ZERO else: rollvector = input_vector - animation_tree.set("parameters/idle/blend_position", input_vector) - animation_tree.set("parameters/hit/blend_position", input_vector) - animation_tree.set("parameters/roll/blend_position", input_vector) - animation_tree.set("parameters/run/blend_position", input_vector) - animation_state.travel("run") + animation_state.change_state("run") + velocity = velocity.move_toward(player_stats.speed * input_vector, ACCELERATION * delta) if Input.is_action_just_pressed("roll"): movementState = moveState.ROLL @@ -93,14 +89,14 @@ func movement_move(delta): func movement_hit(): velocity = Vector2.ZERO - animation_state.travel("hit") + animation_state.change_state("attack") func hit_finished(): movementState = moveState.MOVE func movement_roll(): velocity = rollvector * ROLL_SPEED - animation_state.travel("roll") + animation_state.change_state("roll") """ # Roll.gd diff --git a/src/Player/Player.tscn b/src/Player/Player.tscn index 4dc4892..2e42de6 100644 --- a/src/Player/Player.tscn +++ b/src/Player/Player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=56 format=2] +[gd_scene load_steps=61 format=2] [ext_resource path="res://Player/Player.gd" type="Script" id=1] [ext_resource path="res://Player/Player.png" type="Texture" id=2] @@ -6,6 +6,11 @@ [ext_resource path="res://Overlap/HurtHit_Box/Hitbox.tscn" type="PackedScene" id=4] [ext_resource path="res://Overlap/Stats/Stats.tscn" type="PackedScene" id=5] [ext_resource path="res://Fonts/Harmonic/Harmonic.ttf" type="DynamicFontData" id=6] +[ext_resource path="res://Player/States/Idle.gd" type="Script" id=7] +[ext_resource path="res://Player/States/Attack.gd" type="Script" id=8] +[ext_resource path="res://Player/States/Roll.gd" type="Script" id=9] +[ext_resource path="res://Player/States/Run.gd" type="Script" id=10] +[ext_resource path="res://Player/PlayerStateMachine.gd" type="Script" id=11] [sub_resource type="CapsuleShape2D" id=1] radius = 2.15976 @@ -597,6 +602,7 @@ states/run/node = SubResource( 37 ) states/run/position = Vector2( 511, 271 ) transitions = [ "idle", "hit", SubResource( 38 ), "hit", "idle", SubResource( 39 ), "idle", "run", SubResource( 40 ), "run", "idle", SubResource( 41 ), "idle", "roll", SubResource( 42 ), "roll", "idle", SubResource( 43 ) ] start_node = "idle" +graph_offset = Vector2( 12, 66 ) [sub_resource type="AnimationNodeStateMachinePlayback" id=45] @@ -708,7 +714,21 @@ __meta__ = { [node name="Stats" parent="." instance=ExtResource( 5 )] max_health = 5 -[node name="States" type="Node" parent="."] +[node name="AnimationStates" type="Node" parent="."] +script = ExtResource( 11 ) +START_STATE = NodePath("Idle") + +[node name="Run" type="Node" parent="AnimationStates"] +script = ExtResource( 10 ) + +[node name="Idle" type="Node" parent="AnimationStates"] +script = ExtResource( 7 ) + +[node name="Attack" type="Node" parent="AnimationStates"] +script = ExtResource( 8 ) + +[node name="Roll" type="Node" parent="AnimationStates"] +script = ExtResource( 9 ) [connection signal="area_entered" from="Hitbox" to="." method="_on_Hitbox_area_entered"] [connection signal="area_entered" from="Hurtbox" to="." method="_on_Hurtbox_area_entered"] [connection signal="area_exited" from="Hurtbox" to="." method="_on_Hurtbox_area_exited"] diff --git a/src/Player/PlayerStateMachine.gd b/src/Player/PlayerStateMachine.gd new file mode 100644 index 0000000..8652d44 --- /dev/null +++ b/src/Player/PlayerStateMachine.gd @@ -0,0 +1,10 @@ +extends "res://Overlap/StateMachine/StateMachine.gd" + + +func _ready(): + states_map = { + "idle": $Idle, + "run": $Run, + "attack": $Attack, + "roll": $Roll + } diff --git a/src/Player/States/Attack.gd b/src/Player/States/Attack.gd new file mode 100644 index 0000000..ab55ff4 --- /dev/null +++ b/src/Player/States/Attack.gd @@ -0,0 +1,7 @@ +extends "res://Player/States/PlayerAnimationState.gd" + +func enter(): + animation_playback.travel("hit") + +func update(delta): + animation_tree.set("parameters/hit/blend_position", owner.rollvector) diff --git a/src/Player/States/Idle.gd b/src/Player/States/Idle.gd new file mode 100644 index 0000000..00d2b9b --- /dev/null +++ b/src/Player/States/Idle.gd @@ -0,0 +1,8 @@ +extends "res://Player/States/PlayerAnimationState.gd" + +func enter(): + animation_playback.travel("idle") + +func update(delta): + var input_vector = get_input_direction() + animation_tree.set("parameters/idle/blend_position", input_vector) diff --git a/src/Player/States/Move.gd b/src/Player/States/Move.gd deleted file mode 100644 index 1eccaec..0000000 --- a/src/Player/States/Move.gd +++ /dev/null @@ -1,16 +0,0 @@ -extends Node - - -# Declare member variables here. Examples: -# var a = 2 -# var b = "text" - - -# Called when the node enters the scene tree for the first time. -func _ready(): - pass # Replace with function body. - - -# Called every frame. 'delta' is the elapsed time since the previous frame. -#func _process(delta): -# pass diff --git a/src/Player/States/PlayerAnimationState.gd b/src/Player/States/PlayerAnimationState.gd new file mode 100644 index 0000000..53cf026 --- /dev/null +++ b/src/Player/States/PlayerAnimationState.gd @@ -0,0 +1,5 @@ +extends "res://Overlap/StateMachine/MotionState.gd" + +onready var animation_player := get_node("../../AnimationPlayer") +onready var animation_tree := get_node("../../AnimationTree") +onready var animation_playback = animation_tree.get("parameters/playback") diff --git a/src/Player/States/Roll.gd b/src/Player/States/Roll.gd new file mode 100644 index 0000000..6d04951 --- /dev/null +++ b/src/Player/States/Roll.gd @@ -0,0 +1,8 @@ +extends "res://Player/States/PlayerAnimationState.gd" + +func enter(): + animation_playback.travel("roll") + +func update(delta): + var input_vector = get_input_direction() + animation_tree.set("parameters/roll/blend_position", owner.rollvector) diff --git a/src/Player/States/Run.gd b/src/Player/States/Run.gd new file mode 100644 index 0000000..fe27ef1 --- /dev/null +++ b/src/Player/States/Run.gd @@ -0,0 +1,8 @@ +extends "res://Player/States/PlayerAnimationState.gd" + +func enter(): + animation_playback.travel("run") + +func update(delta): + var input_vector = get_input_direction() + animation_tree.set("parameters/run/blend_position", input_vector)