From 05b31471aa3d78e6085028503e963f65ab12d7cd Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Mon, 29 Jun 2026 18:00:52 +0300 Subject: [PATCH] Added corruption shader --- game/entities/player/player.gd | 1 + game/entities/player/player.tscn | 3 +++ game/levels/abstract_level.gd | 19 ++++++++++++++++++- game/levels/abstract_level.tscn | 17 +++++++++++++++-- game/levels/test_level.tscn | 6 ++++-- game/shaders/glitch.gdshader | 22 ++++++++++++++++++++++ game/shaders/glitch.gdshader.uid | 1 + 7 files changed, 64 insertions(+), 5 deletions(-) create mode 100644 game/shaders/glitch.gdshader create mode 100644 game/shaders/glitch.gdshader.uid diff --git a/game/entities/player/player.gd b/game/entities/player/player.gd index 8e69718..e930ac1 100644 --- a/game/entities/player/player.gd +++ b/game/entities/player/player.gd @@ -34,6 +34,7 @@ var _last_wall_normal: = 0.0 @onready var attack_left_sprite : AnimatedSprite2D = $AttackLeftSprite @onready var attack_right_sprite : AnimatedSprite2D = $AttackRightSprite +@onready var camera : Camera2D = $Camera2D @onready var state_machine : StateMachine = $StateMachine @onready var jump_buffer_timer : Timer = $JumpBufferTimer diff --git a/game/entities/player/player.tscn b/game/entities/player/player.tscn index 0de84c2..6118753 100644 --- a/game/entities/player/player.tscn +++ b/game/entities/player/player.tscn @@ -569,6 +569,9 @@ sprite_frames = SubResource("SpriteFrames_i4f54") animation = &"attack" [node name="Camera2D" type="Camera2D" parent="." unique_id=1654451713] +limit_bottom = 0 +drag_horizontal_enabled = true +drag_vertical_enabled = true [node name="StateMachine" parent="." unique_id=560273456 node_paths=PackedStringArray("initial_state") instance=ExtResource("2_x4rrl")] initial_state = NodePath("IdleState") diff --git a/game/levels/abstract_level.gd b/game/levels/abstract_level.gd index 2edafa6..0f6d214 100644 --- a/game/levels/abstract_level.gd +++ b/game/levels/abstract_level.gd @@ -2,17 +2,34 @@ class_name AbstractLevel extends Node2D +@export var initial_corruption_x := 0.0 +@export var corruption_speed := 0.0 + + +var _corruption_x: float + + @onready var player : Player = $Player @onready var pause_menu : PauseMenu = $%PauseMenu +@onready var level_material : ShaderMaterial = $%LevelColorRect.material + func _ready() -> void: - $Menus.show() + _corruption_x = initial_corruption_x pause_menu.hide() #TODO Add gameplay music +func _process(delta: float) -> void: + _corruption_x += corruption_speed * delta + + var screen_to_world := player.camera.get_canvas_transform().affine_inverse() + level_material.set_shader_parameter("screen_to_world", screen_to_world) + level_material.set_shader_parameter("corruption_x", _corruption_x) + + func _input(event: InputEvent) -> void: if event.is_action_pressed("pause"): SoundManager.play_ui_stream(SoundManager.ui_stream_accept) diff --git a/game/levels/abstract_level.tscn b/game/levels/abstract_level.tscn index 617a7a7..b84eee8 100644 --- a/game/levels/abstract_level.tscn +++ b/game/levels/abstract_level.tscn @@ -3,6 +3,7 @@ [ext_resource type="Script" uid="uid://wm4pbk5w5ats" path="res://game/levels/abstract_level.gd" id="1_o2mui"] [ext_resource type="PackedScene" uid="uid://ts4dy8xmtot8" path="res://game/entities/player/player.tscn" id="2_r0ht6"] [ext_resource type="PackedScene" uid="uid://0e3xvmn36j5b" path="res://game/menu/pause_menu.tscn" id="3_fnnmn"] +[ext_resource type="Shader" uid="uid://brudtlwas6x66" path="res://game/shaders/glitch.gdshader" id="4_6b8cu"] [ext_resource type="Texture2D" uid="uid://b8rm1kxgci4l1" path="res://images/level/beams.png" id="4_pi5fd"] [sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_6b8cu"] @@ -1169,6 +1170,12 @@ terrain_set_0/terrain_0/name = "Beams" terrain_set_0/terrain_0/color = Color(0.64282656, 0, 0.1545574, 1) sources/0 = SubResource("TileSetAtlasSource_6b8cu") +[sub_resource type="ShaderMaterial" id="ShaderMaterial_yeikn"] +shader = ExtResource("4_6b8cu") +shader_parameter/corruption_x = 0.0 +shader_parameter/edge_width = 50.0 +shader_parameter/screen_to_world = Projection(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1) + [node name="AbstractLevel" type="Node2D" unique_id=1001045799] script = ExtResource("1_o2mui") @@ -1177,8 +1184,14 @@ script = ExtResource("1_o2mui") [node name="TileMapLayer" type="TileMapLayer" parent="." unique_id=502099522] tile_set = SubResource("TileSet_71ysb") -[node name="Menus" type="CanvasLayer" parent="." unique_id=1125559156] +[node name="CanvasLayer" type="CanvasLayer" parent="." unique_id=1125559156] -[node name="PauseMenu" parent="Menus" unique_id=1815975678 instance=ExtResource("3_fnnmn")] +[node name="LevelColorRect" type="ColorRect" parent="CanvasLayer" unique_id=739757562] +unique_name_in_owner = true +material = SubResource("ShaderMaterial_yeikn") +offset_right = 640.0 +offset_bottom = 360.0 + +[node name="PauseMenu" parent="CanvasLayer" unique_id=1815975678 instance=ExtResource("3_fnnmn")] unique_name_in_owner = true process_mode = 2 diff --git a/game/levels/test_level.tscn b/game/levels/test_level.tscn index 4339ef9..4eca0ab 100644 --- a/game/levels/test_level.tscn +++ b/game/levels/test_level.tscn @@ -3,9 +3,11 @@ [ext_resource type="PackedScene" uid="uid://hdnty666fw1h" path="res://game/levels/abstract_level.tscn" id="1_46m3m"] [node name="TestLevel" unique_id=1001045799 instance=ExtResource("1_46m3m")] +initial_corruption_x = -500.0 +corruption_speed = 10.0 [node name="Player" parent="." index="0" unique_id=763780926] -position = Vector2(0, -30) +position = Vector2(0, -38) [node name="TileMapLayer" parent="." index="1" unique_id=502099522] -tile_map_data = PackedByteArray("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") +tile_map_data = PackedByteArray("AAAMAP//AAAFAAoAAAAMAP7/AAALAAYAAAAMAP3/AAAIAAYAAAAMAPz/AAAKAAYAAAAMAPv/AAADAAYAAAAMAPr/AAAGAAYAAAAMAPn/AAABAAYAAAAMAPj/AAAIAAYAAAAMAPf/AAAFAAYAAAAMAPb/AAAIAAYAAAAMAPX/AAALAAYAAAAMAPT/AAALAAYAAAAMAPP/AAADAAYAAAAMAPL/AAACAAYAAAAMAPH/AAAFAAYAAAAMAPD/AAABAAYAAAAAAPn/AAADAAQAAAAAAPj/AAAKAAYAAAAAAPf/AAACAAYAAAAAAPb/AAADAAYAAAAAAPX/AAAJAAYAAAAAAPT/AAADAAYAAAAAAPP/AAAIAAYAAAAAAPL/AAAKAAYAAAAAAPH/AAAGAAYAAAAAAPD/AAAJAAYAAAAAAO//AAAJAAYAAAD0////AAAGAAcAAAD0//7/AAAGAAYAAAD0//3/AAABAAYAAAD0//z/AAAGAAYAAAD0//v/AAAFAAYAAAD0//r/AAAHAAYAAAD0//n/AAAHAAYAAAD0//j/AAACAAYAAAD0//f/AAAEAAYAAAD0//b/AAABAAYAAAD0//X/AAABAAYAAAD0//T/AAAIAAYAAAD0//P/AAALAAYAAAD0//L/AAAFAAYAAAD0//H/AAAGAAYAAAD0//D/AAAKAAYAAAD0/+//AAAGAAYAAAD0/+7/AAAKAAYAAAD0/+3/AAAJAAYAAAD0/+z/AAALAAYAAAD0/+v/AAAAAAYAAAD0/+r/AAAIAAYAAAD0/+n/AAAFAAYAAAD0/+j/AAAIAAYAAAD0/+b/AAAEAAYAAAD0/+f/AAADAAYAAAAMAO//AAAIAAYAAAAMAO7/AAACAAYAAAAMAO3/AAAHAAYAAAAMAOz/AAAJAAYAAAAMAOv/AAAFAAYAAAAMAOr/AAALAAYAAAAMAOn/AAADAAYAAAAMAOj/AAAGAAYAAAAMAOf/AAAFAAYAAAAAAO7/AAABAAYAAAAAAO3/AAALAAYAAAAAAOz/AAAKAAYAAAAAAOv/AAAIAAYAAAAAAOr/AAADAAYAAAAAAOn/AAAEAAYAAAAAAOj/AAACAAYAAAAAAOf/AAAAAAYAAAAAAOb/AAAEAAYAAAAMAOb/AAAFAAYAAAAMAOX/AAAJAAgAAAANAOX/AAAIAAUAAAAOAOX/AAAAAAUAAAAPAOX/AAACAAUAAAAQAOX/AAAAAAUAAAARAOX/AAAHAAUAAAASAOX/AAAHAAUAAAATAOX/AAACAAUAAAAUAOX/AAAKAAUAAAAVAOX/AAAKAAUAAAAWAOX/AAAGAAUAAAAXAOX/AAALAAUAAAAYAOX/AAAKAAUAAAAZAOX/AAAAAAUAAAAaAOX/AAADAAUAAAAbAOX/AAAAAAIAAAD0/+X/AAAKAAkAAADz/+X/AAAFAAUAAADy/+X/AAAGAAUAAADx/+X/AAAJAAUAAADw/+X/AAAHAAUAAADv/+X/AAABAAUAAADu/+X/AAAIAAUAAADt/+X/AAAKAAUAAADs/+X/AAAHAAUAAADr/+X/AAAHAAUAAADq/+X/AAABAAUAAADp/+X/AAAKAAUAAADo/+X/AAAIAAUAAADn/+X/AAABAAUAAADm/+X/AAALAAUAAADl/+X/AAAGAAEAAAAAAOX/AAAAAAYAAAAAAOT/AAALAAYAAAAAAOP/AAACAAYAAAAAAOL/AAAEAAYAAAAAAOH/AAAHAAYAAAAAAOD/AAADAAYAAAAAAN//AAAGAAYAAAAAAN7/AAAEAAYAAAAAAN3/AAABAAYAAAAAANz/AAAKAAYAAAAAANv/AAADAAYAAAAAANr/AAACAAMAAAALAP//AAAHAAUAAAAKAP//AAAFAAUAAAAJAP//AAACAAUAAAAIAP//AAAIAAUAAAAHAP//AAAAAAUAAAAGAP//AAABAAUAAAAFAP//AAAJAAUAAAAEAP//AAALAAUAAAADAP//AAAEAAUAAAACAP//AAADAAUAAAABAP//AAAJAAUAAAAAAP//AAAJAAUAAAD/////AAAJAAUAAAD+////AAACAAUAAAD9////AAADAAUAAAD8////AAAGAAUAAAD7////AAACAAUAAAD6////AAAIAAUAAAD5////AAACAAUAAAD4////AAAHAAUAAAD3////AAACAAUAAAD2////AAAKAAUAAAD1////AAAEAAUAAAA=") diff --git a/game/shaders/glitch.gdshader b/game/shaders/glitch.gdshader new file mode 100644 index 0000000..90ebaac --- /dev/null +++ b/game/shaders/glitch.gdshader @@ -0,0 +1,22 @@ +shader_type canvas_item; + +uniform float corruption_x = 0.0; +uniform float edge_width = 50.0; +uniform mat4 screen_to_world; + +uniform sampler2D SCREEN_TEXTURE : hint_screen_texture, filter_nearest_mipmap; + +void fragment() { + vec4 screen_color = texture(SCREEN_TEXTURE, SCREEN_UV); + + float gray = dot(screen_color.rgb, vec3(0.299, 0.587, 0.114)); + vec3 bw = vec3(gray); + + vec4 world_pos = screen_to_world * vec4(FRAGCOORD.xy, 0.0, 1.0); + + float dist = world_pos.x - corruption_x; + float t = smoothstep(-edge_width, edge_width, dist); + + COLOR.rgb = mix(bw, screen_color.rgb, t); + COLOR.a = screen_color.a; +} diff --git a/game/shaders/glitch.gdshader.uid b/game/shaders/glitch.gdshader.uid new file mode 100644 index 0000000..ea0ce31 --- /dev/null +++ b/game/shaders/glitch.gdshader.uid @@ -0,0 +1 @@ +uid://brudtlwas6x66