xiandie/scene/ground/script/c02/盒子猫canvas_layer.gd

107 lines
2.5 KiB
GDScript

extends CanvasLayer
@export var disable_crawl := false:
set(val):
disable_crawl = val
if disable_crawl and is_node_ready():
down_pressing = false
@export var show_cat := false
@export var show_cat_duration := 6.0
@onready var cat_fg := $TextureCat as TextureRect
func _ready():
offset = Vector2.ZERO
visible = true
await get_parent().ready
# 盒子猫镜头左右各增加边框宽度
var camera = SceneManager.get_camera_marker()
camera.limit_left -= 100
camera.limit_right += 100
camera.limit_top -= 50
# camera.limit_bottom += 50
if show_cat and not ArchiveManager.get_global_value(&"c02_boxcat_skip_intro"):
cat_fg.visible = true
var tween = create_tween()
tween.tween_interval(2.5)
tween.tween_property(cat_fg, "modulate:a", 0.0, show_cat_duration - 2.5)
else:
cat_fg.visible = false
var down_pressing = false:
set(val):
if down_pressing == val:
return
if disable_crawl and val:
return
down_pressing = val
_try_toggle_crawl()
# 用来判断盒子猫是否在下蹲状态
var crawling = false:
set(val):
crawling = val
locking = crawling
# print("crawling: ", val)
if crawling != down_pressing:
# 执行结束后,如果发现不一致,尝试切换
crawling_toggle_tween = null
_try_toggle_crawl()
var crawling_toggle_tween: Tween
var locking = false:
set(val):
if locking == val:
return
locking = val
if locking:
SceneManager.lock_player()
else:
SceneManager.unlock_player()
var _toggle_mutex = Mutex.new()
func _try_toggle_crawl():
_toggle_mutex.lock()
if down_pressing == crawling:
_toggle_mutex.unlock()
return
if crawling_toggle_tween and crawling_toggle_tween.is_valid():
_toggle_mutex.unlock()
return
crawling_toggle_tween = create_tween()
var crawl = down_pressing
if crawl:
locking = true
SceneManager.player_action(7)
$"Sfx翻身躲藏".play()
else:
SceneManager.player_action(8, true)
$"Sfx退出躲藏".play()
crawling_toggle_tween.tween_interval(0.3)
crawling_toggle_tween.tween_callback(func(): crawling = crawl)
_toggle_mutex.unlock()
func _unhandled_input(event: InputEvent) -> void:
if event.is_action_pressed("down"):
get_viewport().set_input_as_handled()
down_pressing = true
elif event.is_action_released("down"):
get_viewport().set_input_as_handled()
down_pressing = false
func show_footprint():
$TextureFootprint.show()
var frame = $TextureFrame
frame.modulate.a = 0.0
frame.visible = true
var tween = create_tween()
tween.tween_interval(2.0)
tween.tween_property(frame, "modulate:a", 1.0, 4.0)