From 976b8eba2f16871d24c7d0ee729300a5eca56296 Mon Sep 17 00:00:00 2001 From: konsumlamm Date: Mon, 15 Apr 2024 16:52:37 +0200 Subject: [PATCH] Add shield shader --- src/scenes/player.tscn | 25 ++++++++++++++++++++++++- src/scripts/player.gd | 8 ++++++++ src/scripts/spells/shield.gd | 4 ++-- src/shaders/shield.gdshader | 19 +++++++++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 src/shaders/shield.gdshader diff --git a/src/scenes/player.tscn b/src/scenes/player.tscn index 04ce957..4383b97 100644 --- a/src/scenes/player.tscn +++ b/src/scenes/player.tscn @@ -1,10 +1,11 @@ -[gd_scene load_steps=23 format=3 uid="uid://cvjqv326igmk0"] +[gd_scene load_steps=29 format=3 uid="uid://cvjqv326igmk0"] [ext_resource type="Shader" path="res://shaders/hit-indicator.gdshader" id="1_4eijp"] [ext_resource type="Script" path="res://scripts/player.gd" id="1_8i3nd"] [ext_resource type="Texture2D" uid="uid://s8kxx0tvktsq" path="res://assets/player-idle.png" id="3_tmw0k"] [ext_resource type="PackedScene" uid="uid://c44q2u3nky1ek" path="res://scenes/player_ui.tscn" id="5_w4gtq"] [ext_resource type="Script" path="res://scripts/ghost_inventory.gd" id="6_4ximd"] +[ext_resource type="Shader" path="res://shaders/shield.gdshader" id="6_lxgy7"] [sub_resource type="RectangleShape2D" id="RectangleShape2D_26xo2"] size = Vector2(9, 26) @@ -135,6 +136,22 @@ _data = { "hit": SubResource("Animation_lpfv2") } +[sub_resource type="FastNoiseLite" id="FastNoiseLite_uct1m"] + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_eb6d2"] +noise = SubResource("FastNoiseLite_uct1m") + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_r2s7t"] +shader = ExtResource("6_lxgy7") +shader_parameter/noise = SubResource("NoiseTexture2D_eb6d2") + +[sub_resource type="Gradient" id="Gradient_mfw4p"] +offsets = PackedFloat32Array(0) +colors = PackedColorArray(0, 0, 0, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_pnvrp"] +gradient = SubResource("Gradient_mfw4p") + [node name="Player" type="CharacterBody2D" groups=["player"]] z_index = 1 collision_layer = 79 @@ -175,5 +192,11 @@ libraries = { } speed_scale = 3.0 +[node name="Shield" type="Sprite2D" parent="."] +visible = false +material = SubResource("ShaderMaterial_r2s7t") +scale = Vector2(0.6, 0.6) +texture = SubResource("GradientTexture2D_pnvrp") + [connection signal="body_entered" from="Area2D" to="." method="_on_area_2d_body_entered"] [connection signal="body_exited" from="Area2D" to="." method="_on_area_2d_body_exited"] diff --git a/src/scripts/player.gd b/src/scripts/player.gd index 8122881..246dbbd 100644 --- a/src/scripts/player.gd +++ b/src/scripts/player.gd @@ -174,6 +174,14 @@ func take_damage(dmg: int): get_tree().get_first_node_in_group('hp-bar').set_value(life) hit_indicator.play('hit') +func enable_shield(strength: float): + shield_multiplier = strength + $Shield.visible = true + +func disable_shield(): + shield_multiplier = 1.0 + $Shield.visible = false + func _on_pentagram_layer_combo_done(combo: Array[int]): var spell = SpellBook.find_spell(combo) if spell > 0: diff --git a/src/scripts/spells/shield.gd b/src/scripts/spells/shield.gd index 5ad29a0..7e9bcf1 100644 --- a/src/scripts/spells/shield.gd +++ b/src/scripts/spells/shield.gd @@ -1,8 +1,8 @@ extends SpellBase func cast(player: Player, _enemies: Array[Node]): - player.shield_multiplier *= 0.5 + player.enable_shield(0.5) func uncast(player: Player, _enemies: Array[Node]): - player.shield_multiplier *= 2.0 + player.disable_shield() diff --git a/src/shaders/shield.gdshader b/src/shaders/shield.gdshader new file mode 100644 index 0000000..8b7b191 --- /dev/null +++ b/src/shaders/shield.gdshader @@ -0,0 +1,19 @@ +shader_type canvas_item; + +const float thickness = 0.02; +const float feather = 0.005; + +uniform sampler2D noise; + +vec2 rotate(vec2 v, float angle) { + float s = sin(angle); + float c = cos(angle); + return mat2(vec2(c, s), vec2(-s, c)) * v; +} + +void fragment() { + float alpha = COLOR.a * (1.0 - smoothstep(0.5 - feather, 0.5, length(UV - vec2(0.5, 0.5)))); + alpha *= smoothstep(0.5 - thickness - feather, 0.5 - thickness, length(UV - vec2(0.5, 0.5))); + alpha *= texture(noise, rotate(UV, TIME)).r; + COLOR = vec4(0.0, 0.0, 1.0, alpha); +}