From 9c8eb77b96be08f06bd0d542e2e15570248b58cf Mon Sep 17 00:00:00 2001 From: Nitsud Yarg Date: Fri, 7 Jun 2024 14:25:46 -0700 Subject: [PATCH] Update camera based on PlayerInfo singleton. Add player enemy interractions and health! --- project.godot | 6 ++++++ src/CameraControl-Position2D.gd | 8 ++++---- src/components/Health_Component.gd | 26 ++++++++++++++++++++++++++ src/components/Health_Component.tscn | 6 ++++++ src/components/Hurtbox_Component.gd | 4 +++- src/enemyC/EnemyC.gd | 15 +++++++++++++++ src/enemyC/EnemyC.tscn | 13 +++++++++++-- src/enemyC/attack.gd | 1 + src/playerC/Player-KinematicBody2D.gd | 16 ++++++++++++++++ src/playerC/Player.tscn | 8 +++++++- src/playerC/player_move_component.gd | 3 +++ src/state.gd | 2 -- src/state_animated_actor.gd | 12 +++++++++++- 13 files changed, 109 insertions(+), 11 deletions(-) create mode 100644 src/components/Health_Component.gd create mode 100644 src/components/Health_Component.tscn create mode 100644 src/enemyC/EnemyC.gd diff --git a/project.godot b/project.godot index d85a928..2bd277c 100644 --- a/project.godot +++ b/project.godot @@ -20,6 +20,11 @@ _global_script_classes=[ { "path": "res://src/playerC/resources/FrameSounds.gd" }, { "base": "Node", +"class": "HealthComponent", +"language": "GDScript", +"path": "res://src/components/Health_Component.gd" +}, { +"base": "Node", "class": "MovementComponent", "language": "GDScript", "path": "res://src/movement_component.gd" @@ -52,6 +57,7 @@ _global_script_classes=[ { _global_script_class_icons={ "Actor": "", "FrameSoundEffects": "", +"HealthComponent": "", "MovementComponent": "", "State": "", "StateAnimatedActor": "", diff --git a/src/CameraControl-Position2D.gd b/src/CameraControl-Position2D.gd index b7c592b..162f9fa 100644 --- a/src/CameraControl-Position2D.gd +++ b/src/CameraControl-Position2D.gd @@ -6,7 +6,7 @@ var grid_position = Vector2() var grid_size = Vector2() var t = 0.0 -onready var parent = get_node("../Player") +onready var parent = PlayerInfo #onready var parent = $Player func _ready(): @@ -52,8 +52,8 @@ func update_grid_position(): func calculate_grid_position(): # this needs to heavily round off the parents position - var x_offset = floor(parent.position.x / grid_size.x) - var y_offset = floor(parent.position.y / grid_size.y) + var x_offset = floor(parent.player_position.x / grid_size.x) + var y_offset = floor(parent.player_position.y / grid_size.y) var x = round(x_offset) #var x = (((grid_position.x * grid_size.x) + ((grid_position.x + 1) * grid_size.x))/2) var y = round(y_offset) @@ -64,7 +64,7 @@ func calculate_grid_position(): func jump_to_grid_position(): #var x_pos = (((grid_position.x * grid_size.x) + ((grid_position.x + 1) * grid_size.x))/2) # rounding or flooring position seems to just cause a lot of jitter - var x_pos = (parent.position.x - grid_size.x/2) + var x_pos = (parent.player_position.x - grid_size.x/2) # if (x_pos - grid_size.x/2) < 0: # x_pos = grid_size.x/2 # if x_pos < 0: diff --git a/src/components/Health_Component.gd b/src/components/Health_Component.gd new file mode 100644 index 0000000..fc1e548 --- /dev/null +++ b/src/components/Health_Component.gd @@ -0,0 +1,26 @@ +class_name HealthComponent +extends Node + +export var max_health: int = 0 +var health :int = 100 + + +signal health_depleted() + +func take_damage(damage_amount :int): + if damage_amount < 0: + print("ERROR: Only positive numbers in health component functions.") + health -= damage_amount + + if health <= 0: + emit_signal("health_depleted") + health = 0 + +func heal(heal_amount :int): + if heal_amount < 0: + print("ERROR: Only positive numbers in health component functions.") + return + health += heal_amount + + if health > max_health: + health = max_health diff --git a/src/components/Health_Component.tscn b/src/components/Health_Component.tscn new file mode 100644 index 0000000..9baee23 --- /dev/null +++ b/src/components/Health_Component.tscn @@ -0,0 +1,6 @@ +[gd_scene load_steps=2 format=2] + +[ext_resource path="res://src/components/Health_Component.gd" type="Script" id=1] + +[node name="Health_Component" type="Node"] +script = ExtResource( 1 ) diff --git a/src/components/Hurtbox_Component.gd b/src/components/Hurtbox_Component.gd index a830633..a797f15 100644 --- a/src/components/Hurtbox_Component.gd +++ b/src/components/Hurtbox_Component.gd @@ -13,8 +13,10 @@ var call_function: FuncRef func _ready(): if hurtbox_entered_function: call_function = funcref(owner, hurtbox_entered_function) + else: + print("Warning: No hurtbox function defined on ", owner.name) -func set_hittbox(enabled: bool): +func set_hurtbox(enabled: bool): for child in get_children(): if child is CollisionShape2D: child.set_deferred("disabled", !enabled) diff --git a/src/enemyC/EnemyC.gd b/src/enemyC/EnemyC.gd new file mode 100644 index 0000000..2fdf35d --- /dev/null +++ b/src/enemyC/EnemyC.gd @@ -0,0 +1,15 @@ +extends Actor + + + +func _on_attack_state_exited(): + $Hitbox_Component.set_hitbox(false) + + +func _on_attack_frame_reached(state_name, animation_name, frame_number): + if frame_number == 2 and animation_name == 'attack': + print("I quit attacking.") + $Hitbox_Component.set_hitbox(true) + if frame_number == 0 and animation_name == 'attack': + print("I attack now!") + $Hitbox_Component.set_hitbox(false) diff --git a/src/enemyC/EnemyC.tscn b/src/enemyC/EnemyC.tscn index c8ef1f2..f6ab261 100644 --- a/src/enemyC/EnemyC.tscn +++ b/src/enemyC/EnemyC.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=29 format=2] +[gd_scene load_steps=30 format=2] [ext_resource path="res://src/templates/Actor/ActorTemplate.tscn" type="PackedScene" id=1] [ext_resource path="res://src/enemyC/enemyC_movement_component.gd" type="Script" id=2] [ext_resource path="res://src/enemyC/attack.gd" type="Script" id=3] [ext_resource path="res://src/components/Hitbox_Component.tscn" type="PackedScene" id=4] [ext_resource path="res://src/components/GenericSender.tscn" type="PackedScene" id=5] +[ext_resource path="res://src/enemyC/EnemyC.gd" type="Script" id=6] [sub_resource type="StreamTexture" id=1] load_path = "res://.import/botEnemy.png-46efd539a38730ff15fb4ddb087329c6.stex" @@ -119,13 +120,14 @@ extents = Vector2( 9, 3.5 ) height = 10.0 [node name="EnemyC" instance=ExtResource( 1 )] +script = ExtResource( 6 ) actor_type = "Enemy" [node name="AnimatedSprite" parent="." index="0"] position = Vector2( 11, -7 ) frames = SubResource( 20 ) animation = "idle" -frame = 1 +frame = 0 __meta__ = { "_aseprite_wizard_config_": { "layer": "", @@ -161,6 +163,10 @@ script = ExtResource( 3 ) debug_state = true timeout_seconds = 2.0 animation_sequence = [ "attack" ] +emitter_frame_subscriptions = { +0: "attack", +2: "attack" +} fall_node = NodePath("../fall") idle_node = NodePath("../idle") @@ -199,3 +205,6 @@ receiver_node_name = "GenericReceiver" [node name="CollisionShape2D" type="CollisionShape2D" parent="GenericSender" index="0"] position = Vector2( 48, 0 ) shape = SubResource( 24 ) + +[connection signal="frame_reached" from="movement_state_machine/attack" to="." method="_on_attack_frame_reached"] +[connection signal="state_exited" from="movement_state_machine/attack" to="." method="_on_attack_state_exited"] diff --git a/src/enemyC/attack.gd b/src/enemyC/attack.gd index 9137b02..af011bb 100644 --- a/src/enemyC/attack.gd +++ b/src/enemyC/attack.gd @@ -16,6 +16,7 @@ func enter() -> void: print(owner.name, " Move Component: ", move_component.desired_movement_vector.x) func process_frame(_delta: float) -> State: + .process_frame(_delta) if move_component.wants_shoot() == false and state_timeout.time_left == 0: return idle_state diff --git a/src/playerC/Player-KinematicBody2D.gd b/src/playerC/Player-KinematicBody2D.gd index 6df38ea..7fc6ba1 100644 --- a/src/playerC/Player-KinematicBody2D.gd +++ b/src/playerC/Player-KinematicBody2D.gd @@ -36,6 +36,22 @@ func shoot_projectile(): func gotcha(damage): print("oh! You got me for ", damage) + $Hurtbox_Component.set_hurtbox(false) + $Health_Component.take_damage(damage) + if $Health_Component.health > 0: + movement_state_machine.change_state($movement_state_machine/hurt) + yield( get_tree().create_timer(2 + $movement_state_machine/hurt.timeout_seconds), "timeout") + $Hurtbox_Component.set_hurtbox(true) + +func _on_hurt_state_exited(): + pass + #$Hurtbox_Component.set_hurtbox(true) + #actually await may be better here. + +func _on_Health_Component_health_depleted(): + # die I guess. + queue_free() + func heylookatme(sender): print("does it work!") diff --git a/src/playerC/Player.tscn b/src/playerC/Player.tscn index 870c37e..3ae76d7 100644 --- a/src/playerC/Player.tscn +++ b/src/playerC/Player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=92 format=2] +[gd_scene load_steps=93 format=2] [ext_resource path="res://src/playerC/Player-KinematicBody2D.gd" type="Script" id=1] [ext_resource path="res://src/playerC/states/idle.gd" type="Script" id=2] @@ -15,6 +15,7 @@ [ext_resource path="res://src/state_modifier.gd" type="Script" id=13] [ext_resource path="res://src/playerC/sm.gd" type="Script" id=14] [ext_resource path="res://src/components/GenericReceiver.tscn" type="PackedScene" id=15] +[ext_resource path="res://src/components/Health_Component.tscn" type="PackedScene" id=16] [sub_resource type="Resource" id=148] script = ExtResource( 11 ) @@ -538,3 +539,8 @@ default_color = Color( 1, 0.607843, 0, 1 ) [node name="GenericReceiver" parent="." instance=ExtResource( 15 )] body_entered_function = "heylookatme" + +[node name="Health_Component" parent="." instance=ExtResource( 16 )] + +[connection signal="state_exited" from="movement_state_machine/hurt" to="." method="_on_hurt_state_exited"] +[connection signal="health_depleted" from="Health_Component" to="." method="_on_Health_Component_health_depleted"] diff --git a/src/playerC/player_move_component.gd b/src/playerC/player_move_component.gd index a5c2d1f..00f99f3 100644 --- a/src/playerC/player_move_component.gd +++ b/src/playerC/player_move_component.gd @@ -5,6 +5,9 @@ extends MovementComponent export var player_number: int = 1 +func process_physics(delta): + PlayerInfo.player_position = owner.global_position + # Return the desired direction of movement for the character # in the range [-1, 1], where positive values indicate a desire # to move to the right and negative values to the left. diff --git a/src/state.gd b/src/state.gd index 8421250..34c8fc7 100644 --- a/src/state.gd +++ b/src/state.gd @@ -6,8 +6,6 @@ export var timeout_seconds: float = 0.0 signal state_entered() signal state_exited() -signal frame_reached(state_name, animation_name, frame_number) -export(Dictionary) var emitter_frame_subscriptions # Declare member variables here. Examples: var modifier_stack_ref: Array # Well this didn't work diff --git a/src/state_animated_actor.gd b/src/state_animated_actor.gd index 282f3bb..0bc1c23 100644 --- a/src/state_animated_actor.gd +++ b/src/state_animated_actor.gd @@ -19,6 +19,11 @@ extends State export var move_speed: float = 60 export(Array, String) var animation_sequence + +signal frame_reached(state_name, animation_name, frame_number) +export(Dictionary) var emitter_frame_subscriptions +var frame_signal_emitted: bool = false + # this just wouldn't work well. Maybe I can try a resource # export(Array, NodePath) var transition_state_nodes @@ -98,7 +103,12 @@ func process_frame(_delta: float) -> State: # Singal based frame call. if emitter_frame_subscriptions.has(animations.frame): if emitter_frame_subscriptions[animations.frame] == animations.animation: - emit_signal("frame_reached", self.name, animations.animation, animations.frame) + if frame_signal_emitted == false: + emit_signal("frame_reached", self.name, animations.animation, animations.frame) + # Try to only so this once. + frame_signal_emitted = true + else: + frame_signal_emitted = false return null