From e99c5568282d06d2a9eb712f8603580196b37a5b Mon Sep 17 00:00:00 2001 From: Nitsud Yarg Date: Fri, 7 Jun 2024 11:09:52 -0700 Subject: [PATCH] Settled on hitbox/hurtbox routines. --- src/components/Hitbox_Component.gd | 10 ++++++ src/components/Hitbox_Component.tscn | 2 ++ src/components/Hurtbox_Component.gd | 44 +++++++++++++++++++-------- src/components/Hurtbox_Component.tscn | 2 -- src/enemyC/EnemyC.tscn | 1 + src/playerC/Player-KinematicBody2D.gd | 4 +-- src/playerC/Player.tscn | 1 + src/state_animated_actor.gd | 3 ++ 8 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/components/Hitbox_Component.gd b/src/components/Hitbox_Component.gd index 1bbddbb..9a50b28 100644 --- a/src/components/Hitbox_Component.gd +++ b/src/components/Hitbox_Component.gd @@ -1,8 +1,18 @@ extends Area2D +export(int) var damage_amount = 0 + func set_hitbox(enabled: bool): for child in get_children(): if child is CollisionShape2D: child.set_deferred("disabled", !enabled) ## TODO: This breaks now I guess because I moved the process functions out to parent class #player_hurtbox.set_deferred("disabled", !enabled) #WTF Apparently this is how to do it + + +func _on_Hitbox_Component_area_shape_entered(area_rid, area, area_shape_index, local_shape_index): + var colliding_node = area.get_parent() + if colliding_node.has_node("Hurtbox_Component"): + colliding_node.get_node("Hurtbox_Component").on_hit(self) + else: + print(owner.name, ": Attempted to Hit an unready node, no Hurtbox_Component reciever node in ", colliding_node.name) diff --git a/src/components/Hitbox_Component.tscn b/src/components/Hitbox_Component.tscn index aada4c9..740633b 100644 --- a/src/components/Hitbox_Component.tscn +++ b/src/components/Hitbox_Component.tscn @@ -6,3 +6,5 @@ collision_layer = 128 collision_mask = 0 script = ExtResource( 1 ) + +[connection signal="area_shape_entered" from="." to="." method="_on_Hitbox_Component_area_shape_entered"] diff --git a/src/components/Hurtbox_Component.gd b/src/components/Hurtbox_Component.gd index 2398a78..a830633 100644 --- a/src/components/Hurtbox_Component.gd +++ b/src/components/Hurtbox_Component.gd @@ -1,23 +1,43 @@ extends Area2D +export(String) var hurtbox_entered_function = "" + +var call_function: FuncRef + +# 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(): + if hurtbox_entered_function: + call_function = funcref(owner, hurtbox_entered_function) + func set_hittbox(enabled: bool): for child in get_children(): if child is CollisionShape2D: child.set_deferred("disabled", !enabled) +# Switching to a new model that starts with Hitbox +func on_hit(sender): + print("Received hit from: " + sender.name) + if hurtbox_entered_function: + call_function.call_func(sender.damage_amount) + # This one doesn't seem to work -func _on_Hurtbox_Component_body_entered(body): - print(body.name, "hit", owner.name) - if owner.has_method("gotcha"): - print(body.name, " you can do it.", owner.name) +#func _on_Hurtbox_Component_body_entered(body): +# print(body.name, "hit", owner.name) +# if owner.has_method("gotcha"): +# print(body.name, " you can do it.", owner.name) # well this one works. -func _on_Hurtbox_Component_area_shape_entered(area_rid, area, area_shape_index, local_shape_index): - #print(area.get_parent().name, "hit", owner.name) -# if area.get_parent().has_method("gotcha"): - print(area.get_parent().name, " you can do it.", owner.name) - - if owner.has_method("_on_Hurtbox_area_entered"): - owner.call("_on_Hurtbox_area_entered") - print(area.get_parent().name, " just hit me: ", owner.name) +#func _on_Hurtbox_Component_area_shape_entered(area_rid, area, area_shape_index, local_shape_index): +# #print(area.get_parent().name, "hit", owner.name) +## if area.get_parent().has_method("gotcha"): +# print(area.get_parent().name, " you can do it.", owner.name) +# +# if owner.has_method("_on_Hurtbox_area_entered"): +# owner.call("_on_Hurtbox_area_entered") +# print(area.get_parent().name, " just hit me: ", owner.name) diff --git a/src/components/Hurtbox_Component.tscn b/src/components/Hurtbox_Component.tscn index b41c826..ce0b294 100644 --- a/src/components/Hurtbox_Component.tscn +++ b/src/components/Hurtbox_Component.tscn @@ -4,5 +4,3 @@ [node name="Hurtbox_Component" type="Area2D"] script = ExtResource( 1 ) - -[connection signal="area_shape_entered" from="." to="." method="_on_Hurtbox_Component_area_shape_entered"] diff --git a/src/enemyC/EnemyC.tscn b/src/enemyC/EnemyC.tscn index 01d34ee..c8ef1f2 100644 --- a/src/enemyC/EnemyC.tscn +++ b/src/enemyC/EnemyC.tscn @@ -185,6 +185,7 @@ cast_to = Vector2( 21, 0 ) collision_mask = 2 [node name="Hitbox_Component" parent="." index="8" instance=ExtResource( 4 )] +damage_amount = 10 [node name="CollisionShape2D" type="CollisionShape2D" parent="Hitbox_Component" index="0"] modulate = Color( 1, 0.596078, 0.121569, 1 ) diff --git a/src/playerC/Player-KinematicBody2D.gd b/src/playerC/Player-KinematicBody2D.gd index 8ac73d4..6df38ea 100644 --- a/src/playerC/Player-KinematicBody2D.gd +++ b/src/playerC/Player-KinematicBody2D.gd @@ -34,8 +34,8 @@ func shoot_projectile(): #func play_sound(): # sound_effects.stream = "res://assets/Sounds/crappy pew.wav" -func gotcha(): - print("oh! You got me.") +func gotcha(damage): + print("oh! You got me for ", damage) func heylookatme(sender): print("does it work!") diff --git a/src/playerC/Player.tscn b/src/playerC/Player.tscn index 310bed4..870c37e 100644 --- a/src/playerC/Player.tscn +++ b/src/playerC/Player.tscn @@ -513,6 +513,7 @@ animation_suffix = true collision_layer = 32768 collision_mask = 128 monitoring = false +hurtbox_entered_function = "gotcha" [node name="CollisionShape2D" type="CollisionShape2D" parent="Hurtbox_Component"] modulate = Color( 1, 0, 0, 1 ) diff --git a/src/state_animated_actor.gd b/src/state_animated_actor.gd index 71d78ee..282f3bb 100644 --- a/src/state_animated_actor.gd +++ b/src/state_animated_actor.gd @@ -94,9 +94,12 @@ func process_frame(_delta: float) -> State: animations.play(animation_sequence[animation_index] + animation_suffix) print("An animation sequence: ", animations.animation , animation_index) current_animation_sequence = animation_index + + # 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) + return null func process_physics(_delta: float) -> State: