From 713be75d9027d54c4ddfa3c65bcb6f7ff4f8d8fa Mon Sep 17 00:00:00 2001 From: Ruslan Ignatov Date: Tue, 16 Jun 2026 22:43:29 +0300 Subject: [PATCH] Updated ConnectionCable --- game/levels/test_level.gd | 1 + game/objects/interactive/connection_cable.gd | 65 +++++++++++++++----- game/platform/abstract_platform.gd | 10 ++- game/shaders/connection_cable.gdshader | 1 + 4 files changed, 60 insertions(+), 17 deletions(-) diff --git a/game/levels/test_level.gd b/game/levels/test_level.gd index d0f56ef..446f1f1 100644 --- a/game/levels/test_level.gd +++ b/game/levels/test_level.gd @@ -4,3 +4,4 @@ extends AbstractLevel func _ready() -> void: super._ready() $Objects/Lever.switching.connect($Doors/LeverDoor.toggle) + $Objects/Lever.switching.connect($ConnectionCables/ConnectionCable.toggle) diff --git a/game/objects/interactive/connection_cable.gd b/game/objects/interactive/connection_cable.gd index cc3bd37..4c873f6 100644 --- a/game/objects/interactive/connection_cable.gd +++ b/game/objects/interactive/connection_cable.gd @@ -2,30 +2,67 @@ class_name ConnectionCable extends Line2D -const SHADER_GLOW_INTERVAL = "glow_interval" -const SHADER_GLOW_RADIUS = "glow_radius" -const SHADER_TRAVEL_TIME = "travel_time" +const SHADER_GLOW_INTERVAL = "shader_parameter/glow_interval" +const SHADER_GLOW_RADIUS = "shader_parameter/glow_radius" +const SHADER_TRAVEL_TIME = "shader_parameter/travel_time" -const TRAVEL_SPEED = 100.0 +const TRAVEL_SPEED_ON = 150.0 +const TRAVEL_SPEED_OFF = 75.0 const GLOW_INTERVAL = 100.0 +const SWITCH_TIME = 0.15 + + +@export var is_on := false: + set(value): + is_on = value + if is_node_ready(): + _play_toggle_animation() + + +var _shader_tween : Tween + + +@onready var length := _get_length() +@onready var glow_interval := 1.0 / maxi(1, round(length/GLOW_INTERVAL)) +@onready var glow_radius := 0.5/length +@onready var travel_time_on := _get_travel_time(TRAVEL_SPEED_ON) +@onready var travel_time_off := _get_travel_time(TRAVEL_SPEED_OFF) + func _ready() -> void: - var length := _get_length() - var glow_interval := 1.0 / maxi(1, round(length/GLOW_INTERVAL)) - var glow_radius := 0.5/length - var travel_time := length/TRAVEL_SPEED + material.set(SHADER_GLOW_INTERVAL, glow_interval) + material.set(SHADER_GLOW_RADIUS, glow_radius) + material.set(SHADER_TRAVEL_TIME, _get_current_travel_time()) + + +func toggle() -> void: + is_on = not is_on + + +func _play_toggle_animation() -> void: + if _shader_tween and _shader_tween.is_running(): + _shader_tween.kill() + _shader_tween = create_tween() - material.set_shader_parameter(SHADER_GLOW_INTERVAL, glow_interval) - material.set_shader_parameter(SHADER_GLOW_RADIUS, glow_radius) - material.set_shader_parameter(SHADER_TRAVEL_TIME, travel_time) + _shader_tween.tween_property(material, SHADER_GLOW_RADIUS, glow_interval, SWITCH_TIME) + _shader_tween.tween_property(material, SHADER_TRAVEL_TIME, _get_current_travel_time(), 0.0) + _shader_tween.tween_property(material, SHADER_GLOW_RADIUS, glow_radius, SWITCH_TIME) func _get_length() -> float: if points.size() < 2: return 0.0 - var length := 0.0 + var l := 0.0 for i in range(points.size() - 1): - length += points[i].distance_to(points[i + 1]) - return length + l += points[i].distance_to(points[i + 1]) + return l + + +func _get_travel_time(speed: float) -> float: + return length/speed + + +func _get_current_travel_time() -> float: + return travel_time_on if is_on else travel_time_off diff --git a/game/platform/abstract_platform.gd b/game/platform/abstract_platform.gd index b8f0824..cd701c1 100644 --- a/game/platform/abstract_platform.gd +++ b/game/platform/abstract_platform.gd @@ -3,6 +3,10 @@ class_name AbstractPlatform extends AnimatableBody2D +const SHADER_SEED = "shader_parameter/seed" +const SHADER_TILE_SIZE = "shader_parameter/tile_size" +const SHADER_PLATFORM_WIDTH = "shader_parameter/platform_width" + const ANIMATION_COLOR_SWITCHING = "color_switching" const ANIMATION_HIDING = "hiding" const ANIMATION_TIMER = "timer" @@ -39,8 +43,8 @@ const MAX_WIDTH = TILE_SIZE * 32 func _ready() -> void: if not Engine.is_editor_hint(): - platform_rect.material.set_shader_parameter("seed", randf()) - platform_rect.material.set_shader_parameter("tile_size", TILE_SIZE) + platform_rect.material.set(SHADER_SEED, randf()) + platform_rect.material.set(SHADER_TILE_SIZE, TILE_SIZE) rebuild_platform() @@ -55,4 +59,4 @@ func rebuild_platform() -> void: platform_rect.size.x = platform_width platform_rect.position = Vector2.ZERO - platform_rect.material.set_shader_parameter("platform_width", platform_width) + platform_rect.material.set(SHADER_PLATFORM_WIDTH, platform_width) diff --git a/game/shaders/connection_cable.gdshader b/game/shaders/connection_cable.gdshader index 3d3f624..779baf6 100644 --- a/game/shaders/connection_cable.gdshader +++ b/game/shaders/connection_cable.gdshader @@ -14,6 +14,7 @@ float get_alpha(vec2 uv, float offset) { void fragment() { float alpha = 0.0; float offset = 0.0; + for (float offset = 0.0; offset <= 1.0; offset += glow_interval) { alpha += get_alpha(UV, offset); }