From 0e1c9478fc0755397ee84d7405a21d436ac98a76 Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sun, 9 Feb 2025 06:03:25 +0100 Subject: [PATCH] add stomping --- objects/brick_player.tscn | 20 ++++++++++- scripts/components/stomp_damage_component.gd | 38 ++++++++++++++++++++ scripts/player.gd | 2 ++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 scripts/components/stomp_damage_component.gd diff --git a/objects/brick_player.tscn b/objects/brick_player.tscn index 608b6ca..511b678 100644 --- a/objects/brick_player.tscn +++ b/objects/brick_player.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=13 format=3 uid="uid://bqi5s710xb1ju"] +[gd_scene load_steps=15 format=3 uid="uid://bqi5s710xb1ju"] [ext_resource type="Script" path="res://scripts/player.gd" id="1_8j4h4"] [ext_resource type="Texture2D" uid="uid://b7gp0gqvkv8j4" path="res://sprites/MrBrick_base.png" id="2_bc55y"] @@ -11,10 +11,14 @@ [ext_resource type="Script" path="res://scripts/components/knockback.gd" id="9_rjyu4"] [ext_resource type="Script" path="res://scripts/components/brick_throw.gd" id="10_u0v3b"] [ext_resource type="PackedScene" uid="uid://bymro4t7angv5" path="res://objects/brick.tscn" id="11_qutq2"] +[ext_resource type="Script" path="res://scripts/components/StompDamageComponent.gd" id="12_0nvxt"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_hdsg1"] size = Vector2(16, 31) +[sub_resource type="RectangleShape2D" id="RectangleShape2D_vad0t"] +size = Vector2(16, 32) + [node name="Brick Player" type="CharacterBody2D"] collision_layer = 4 collision_mask = 11 @@ -45,6 +49,14 @@ eye_left = NodePath("../Root/Left Eye") eye_right = NodePath("../Root/Right Eye") player_controller = NodePath("..") +[node name="StompDamageArea" type="Area2D" parent="."] +collision_layer = 0 +collision_mask = 8 + +[node name="CollisionShape2D" type="CollisionShape2D" parent="StompDamageArea"] +position = Vector2(0, 1) +shape = SubResource("RectangleShape2D_vad0t") + [node name="CoyoteTimer" type="Timer" parent="."] [node name="CanPickUpComponent" type="Node" parent="."] @@ -73,5 +85,11 @@ timer = NodePath("../ThrowTimer") [node name="ThrowTimer" type="Timer" parent="."] +[node name="StompDamageComponent" type="Node" parent="." node_paths=PackedStringArray("area2d", "root")] +script = ExtResource("12_0nvxt") +damage = 4.0 +area2d = NodePath("../StompDamageArea") +root = NodePath("..") + [connection signal="on_death" from="HealthComponent" to="PlayerDeathComponent" method="_on_health_component_on_death"] [connection signal="on_health_change" from="HealthComponent" to="KnockbackComponent" method="_on_health_component_on_health_change"] diff --git a/scripts/components/stomp_damage_component.gd b/scripts/components/stomp_damage_component.gd new file mode 100644 index 0000000..4c70909 --- /dev/null +++ b/scripts/components/stomp_damage_component.gd @@ -0,0 +1,38 @@ +class_name StompDamageComponent +extends Node + +@export var damage: float = 0.25 +@export var area2d: Area2D +@export var root: Node2D + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + if not area2d: + printerr("No area2d assigned!") + return + if not root: + printerr("No root assigned!") + return + + area2d.body_entered.connect(on_area2d_body_entered) + + +func deal_damage(target: HealthComponent) -> void: + target.decrease_health(damage) + + +func on_area2d_body_entered(body: Node2D) -> void: + if body.has_node("HealthComponent"): + var health_component: HealthComponent = body.get_node("HealthComponent") + if not health_component: + printerr("No HealthComponent assigned!") + return + + if root.global_position.y < body.global_position.y: + if root is PlayerController: + var velocity: Vector2 = root.previous_velocity + print("Velocity: ", velocity) + if velocity.y > 0.0: + deal_damage(health_component) + print("Dealt damage to ", body) + \ No newline at end of file diff --git a/scripts/player.gd b/scripts/player.gd index 35d3e1b..e0d2601 100644 --- a/scripts/player.gd +++ b/scripts/player.gd @@ -5,6 +5,7 @@ extends CharacterBody2D var gravity = ProjectSettings.get_setting("physics/2d/default_gravity") var last_direction: Vector2 = Vector2.RIGHT +var previous_velocity: Vector2 = Vector2.ZERO @onready var root = $Root @onready var coyote_timer: Timer = $CoyoteTimer @@ -62,6 +63,7 @@ func _physics_process(delta): else: velocity.x = move_toward(velocity.x, 0, speed) + previous_velocity = velocity move_and_slide() func jump():