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

91 lines
2.3 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 - 3)
else:
cat_fg.visible = false
var down_pressing = false:
set(val):
# print("down_pressing: ", val)
down_pressing = val
_try_toggle_crawl()
# 用来判断盒子猫是否在下蹲状态
var crawling = false:
set(val):
crawling = val
# print("crawling: ", val)
if val != down_pressing:
# 执行结束后,如果发现不一致,尝试切换
# print("crawling mismatch, swtich to: ", down_pressing)
# 需要重置 tween
crawling_toggle_tween = null
_try_toggle_crawl()
var crawling_toggle_tween: Tween
func _try_toggle_crawl():
if crawling_toggle_tween and crawling_toggle_tween.is_valid():
# print("tweening, skip.")
return
crawling_toggle_tween = create_tween()
var crawl = down_pressing
if crawl:
SceneManager.freeze_player(0, 7)
else:
SceneManager.freeze_player(0, 8, true)
crawling_toggle_tween.tween_interval(0.4)
if not crawl:
crawling_toggle_tween.tween_callback(SceneManager.release_player)
crawling_toggle_tween.tween_callback(func(): crawling = crawl)
func _unhandled_input(event: InputEvent) -> void:
if disable_crawl:
return
if event.is_action_pressed("down"):
get_viewport().set_input_as_handled()
if not down_pressing:
down_pressing = true
elif event.is_action_released("down"):
get_viewport().set_input_as_handled()
if down_pressing:
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)