hit component
This commit is contained in:
@@ -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")
|
||||
|
33
scripts/components/hit_component.gd
Normal file
33
scripts/components/hit_component.gd
Normal 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
75
shaders/hit_flash.tres
Normal 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)
|
Reference in New Issue
Block a user