From bae84d60eefbed607c982cbcf908c6501b28ec4e Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Sun, 9 Feb 2025 07:03:53 +0100 Subject: [PATCH] hit component --- objects/enemy.tscn | 17 ++++++- scripts/components/hit_component.gd | 33 +++++++++++++ shaders/hit_flash.tres | 75 +++++++++++++++++++++++++++++ 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 scripts/components/hit_component.gd create mode 100644 shaders/hit_flash.tres diff --git a/objects/enemy.tscn b/objects/enemy.tscn index 50fb05d..b648aba 100644 --- a/objects/enemy.tscn +++ b/objects/enemy.tscn @@ -1,5 +1,6 @@ -[gd_scene load_steps=10 format=3 uid="uid://bwdlmualj6xbw"] +[gd_scene load_steps=13 format=3 uid="uid://bwdlmualj6xbw"] +[ext_resource type="Shader" uid="uid://bs4xvm4qkurpr" path="res://shaders/hit_flash.tres" id="1_ep4yr"] [ext_resource type="Texture2D" uid="uid://xes6mt2dd5gu" path="res://sprites/robot_cutout.png" id="1_uh38l"] [ext_resource type="Script" path="res://scripts/components/health.gd" id="2_o170m"] [ext_resource type="Script" path="res://scripts/components/damage.gd" id="3_8jl3u"] @@ -7,10 +8,16 @@ [ext_resource type="Script" path="res://scripts/components/periodic_shooting.gd" id="5_m03v0"] [ext_resource type="Script" path="res://scripts/components/enemy_death.gd" id="6_6p3gr"] [ext_resource type="Script" path="res://scripts/components/flashing_component.gd" id="7_xsaiy"] +[ext_resource type="Script" path="res://scripts/components/hit_component.gd" id="9_0qjr4"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_pwwji"] size = Vector2(18, 27) +[sub_resource type="ShaderMaterial" id="ShaderMaterial_j18j0"] +shader = ExtResource("1_ep4yr") +shader_parameter/enabled = false +shader_parameter/tint = Color(1, 1, 1, 1) + [sub_resource type="RectangleShape2D" id="RectangleShape2D_ejbqt"] size = Vector2(18, 27) @@ -22,6 +29,7 @@ position = Vector2(0, 0.5) shape = SubResource("RectangleShape2D_pwwji") [node name="Sprite2D" type="Sprite2D" parent="."] +material = SubResource("ShaderMaterial_j18j0") texture = ExtResource("1_uh38l") [node name="HealthComponent" type="Node" parent="."] @@ -41,6 +49,7 @@ left_ray = NodePath("../Left Ray") right_ray = NodePath("../Right Ray") [node name="PeriodicShootingComponent" type="Node" parent="." node_paths=PackedStringArray("side_to_side_movement", "root")] +process_mode = 3 script = ExtResource("5_m03v0") side_to_side_movement = NodePath("../SideToSideMovement") root = NodePath("..") @@ -68,6 +77,12 @@ position = Vector2(-16, 13) position = Vector2(16, 13) [node name="FlashingComponent" type="Node" parent="." node_paths=PackedStringArray("sprite", "health_component")] +process_mode = 3 script = ExtResource("7_xsaiy") sprite = NodePath("../Sprite2D") health_component = NodePath("../HealthComponent") + +[node name="HitComponent" type="Node" parent="." node_paths=PackedStringArray("sprite", "health_component")] +script = ExtResource("9_0qjr4") +sprite = NodePath("../Sprite2D") +health_component = NodePath("../HealthComponent") diff --git a/scripts/components/hit_component.gd b/scripts/components/hit_component.gd new file mode 100644 index 0000000..939fe3d --- /dev/null +++ b/scripts/components/hit_component.gd @@ -0,0 +1,33 @@ +class_name HitComponent +extends Node + +@export var sprite: Sprite2D +@export var health_component: HealthComponent +@export var hit_duration: float = 0.1 + + +func _ready() -> void: + if health_component: + health_component.on_health_change.connect(on_health_change) + + if not sprite: + printerr("No sprite assigned!") + return + + if sprite.material: + sprite.material = sprite.material.duplicate() + + +func activate() -> void: + sprite.material.set_shader_parameter("enabled", true) + + +func deactivate() -> void: + sprite.material.set_shader_parameter("enabled", false) + + +func on_health_change(delta: float, _total_health: float) -> void: + if delta < 0: + activate() + await get_tree().create_timer(hit_duration).timeout + deactivate() diff --git a/shaders/hit_flash.tres b/shaders/hit_flash.tres new file mode 100644 index 0000000..77f45f9 --- /dev/null +++ b/shaders/hit_flash.tres @@ -0,0 +1,75 @@ +[gd_resource type="VisualShader" load_steps=5 format=3 uid="uid://bs4xvm4qkurpr"] + +[sub_resource type="VisualShaderNodeColorParameter" id="VisualShaderNodeColorParameter_m0j3m"] +parameter_name = "tint" +default_value_enabled = true + +[sub_resource type="VisualShaderNodeBooleanParameter" id="VisualShaderNodeBooleanParameter_wd72c"] +parameter_name = "enabled" +default_value_enabled = true + +[sub_resource type="VisualShaderNodeIf" id="VisualShaderNodeIf_i6y1w"] +default_input_values = [0, 0.0, 1, 1.0, 2, 1e-05, 3, Vector3(0, 0, 0), 4, Vector3(0, 0, 0), 5, Vector3(0, 0, 0)] + +[sub_resource type="VisualShaderNodeInput" id="VisualShaderNodeInput_752me"] +input_name = "color" + +[resource] +code = "shader_type canvas_item; +render_mode blend_mix; + +uniform bool enabled = false; +uniform vec4 tint : source_color = vec4(1.000000, 1.000000, 1.000000, 1.000000); + + + +void fragment() { +// BooleanParameter:3 + bool n_out3p0 = enabled; + + +// ColorParameter:2 + vec4 n_out2p0 = tint; + + +// Input:5 + vec4 n_out5p0 = COLOR; + + + vec3 n_out4p0; +// If:4 + float n_in4p1 = 1.00000; + float n_in4p2 = 0.00001; + if(abs((n_out3p0 ? 1.0 : 0.0) - n_in4p1) < n_in4p2) + { + n_out4p0 = vec3(n_out2p0.xyz); + } + else if((n_out3p0 ? 1.0 : 0.0) < n_in4p1) + { + n_out4p0 = vec3(n_out5p0.xyz); + } + else + { + n_out4p0 = vec3(n_out5p0.xyz); + } + + +// Output:0 + COLOR.rgb = n_out4p0; + + +} +" +graph_offset = Vector2(1.80557, 412.047) +mode = 1 +flags/light_only = false +nodes/fragment/0/position = Vector2(740, 560) +nodes/fragment/2/node = SubResource("VisualShaderNodeColorParameter_m0j3m") +nodes/fragment/2/position = Vector2(80, 260) +nodes/fragment/3/node = SubResource("VisualShaderNodeBooleanParameter_wd72c") +nodes/fragment/3/position = Vector2(80, 560) +nodes/fragment/4/node = SubResource("VisualShaderNodeIf_i6y1w") +nodes/fragment/4/position = Vector2(480, 560) +nodes/fragment/5/node = SubResource("VisualShaderNodeInput_752me") +nodes/fragment/5/position = Vector2(80, 840) +nodes/fragment/connections = PackedInt32Array(3, 0, 4, 0, 2, 0, 4, 3, 4, 0, 0, 0, 5, 0, 4, 4, 5, 0, 4, 5)