Updated ConnectionCable
This commit is contained in:
@@ -4,3 +4,4 @@ extends AbstractLevel
|
|||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
super._ready()
|
super._ready()
|
||||||
$Objects/Lever.switching.connect($Doors/LeverDoor.toggle)
|
$Objects/Lever.switching.connect($Doors/LeverDoor.toggle)
|
||||||
|
$Objects/Lever.switching.connect($ConnectionCables/ConnectionCable.toggle)
|
||||||
|
|||||||
@@ -2,30 +2,67 @@ class_name ConnectionCable
|
|||||||
extends Line2D
|
extends Line2D
|
||||||
|
|
||||||
|
|
||||||
const SHADER_GLOW_INTERVAL = "glow_interval"
|
const SHADER_GLOW_INTERVAL = "shader_parameter/glow_interval"
|
||||||
const SHADER_GLOW_RADIUS = "glow_radius"
|
const SHADER_GLOW_RADIUS = "shader_parameter/glow_radius"
|
||||||
const SHADER_TRAVEL_TIME = "travel_time"
|
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 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:
|
func _ready() -> void:
|
||||||
var length := _get_length()
|
material.set(SHADER_GLOW_INTERVAL, glow_interval)
|
||||||
var glow_interval := 1.0 / maxi(1, round(length/GLOW_INTERVAL))
|
material.set(SHADER_GLOW_RADIUS, glow_radius)
|
||||||
var glow_radius := 0.5/length
|
material.set(SHADER_TRAVEL_TIME, _get_current_travel_time())
|
||||||
var travel_time := length/TRAVEL_SPEED
|
|
||||||
|
|
||||||
|
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)
|
_shader_tween.tween_property(material, SHADER_GLOW_RADIUS, glow_interval, SWITCH_TIME)
|
||||||
material.set_shader_parameter(SHADER_GLOW_RADIUS, glow_radius)
|
_shader_tween.tween_property(material, SHADER_TRAVEL_TIME, _get_current_travel_time(), 0.0)
|
||||||
material.set_shader_parameter(SHADER_TRAVEL_TIME, travel_time)
|
_shader_tween.tween_property(material, SHADER_GLOW_RADIUS, glow_radius, SWITCH_TIME)
|
||||||
|
|
||||||
|
|
||||||
func _get_length() -> float:
|
func _get_length() -> float:
|
||||||
if points.size() < 2:
|
if points.size() < 2:
|
||||||
return 0.0
|
return 0.0
|
||||||
|
|
||||||
var length := 0.0
|
var l := 0.0
|
||||||
for i in range(points.size() - 1):
|
for i in range(points.size() - 1):
|
||||||
length += points[i].distance_to(points[i + 1])
|
l += points[i].distance_to(points[i + 1])
|
||||||
return length
|
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
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ class_name AbstractPlatform
|
|||||||
extends AnimatableBody2D
|
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_COLOR_SWITCHING = "color_switching"
|
||||||
const ANIMATION_HIDING = "hiding"
|
const ANIMATION_HIDING = "hiding"
|
||||||
const ANIMATION_TIMER = "timer"
|
const ANIMATION_TIMER = "timer"
|
||||||
@@ -39,8 +43,8 @@ const MAX_WIDTH = TILE_SIZE * 32
|
|||||||
|
|
||||||
func _ready() -> void:
|
func _ready() -> void:
|
||||||
if not Engine.is_editor_hint():
|
if not Engine.is_editor_hint():
|
||||||
platform_rect.material.set_shader_parameter("seed", randf())
|
platform_rect.material.set(SHADER_SEED, randf())
|
||||||
platform_rect.material.set_shader_parameter("tile_size", TILE_SIZE)
|
platform_rect.material.set(SHADER_TILE_SIZE, TILE_SIZE)
|
||||||
rebuild_platform()
|
rebuild_platform()
|
||||||
|
|
||||||
|
|
||||||
@@ -55,4 +59,4 @@ func rebuild_platform() -> void:
|
|||||||
platform_rect.size.x = platform_width
|
platform_rect.size.x = platform_width
|
||||||
platform_rect.position = Vector2.ZERO
|
platform_rect.position = Vector2.ZERO
|
||||||
|
|
||||||
platform_rect.material.set_shader_parameter("platform_width", platform_width)
|
platform_rect.material.set(SHADER_PLATFORM_WIDTH, platform_width)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ float get_alpha(vec2 uv, float offset) {
|
|||||||
void fragment() {
|
void fragment() {
|
||||||
float alpha = 0.0;
|
float alpha = 0.0;
|
||||||
float offset = 0.0;
|
float offset = 0.0;
|
||||||
|
|
||||||
for (float offset = 0.0; offset <= 1.0; offset += glow_interval) {
|
for (float offset = 0.0; offset <= 1.0; offset += glow_interval) {
|
||||||
alpha += get_alpha(UV, offset);
|
alpha += get_alpha(UV, offset);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user