hit component

This commit is contained in:
2025-02-09 07:03:53 +01:00
parent 03ed7e29d1
commit bae84d60ee
3 changed files with 124 additions and 1 deletions

View File

@@ -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")

View File

@@ -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()

75
shaders/hit_flash.tres Normal file
View File

@@ -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)