xiandie/scene/little_game/旋转锁.gd

71 lines
1.6 KiB
GDScript

extends Control
@export var freeze := false
@export var gear_x_delta := [0, -18, -28, -40, -53, -70]
@export var actived_gear := 0:
set(val):
actived_gear = val
activate_gear()
@onready var key = $Key
var random_degrees := [0.0, 0.0, 0.0, 0.0, 0.0]
var key_origin_x := 0.0
var tween_key
func _ready() -> void:
key_origin_x = key.position.x
# randomize the initial rotation of the gears
for i in range(5):
random_degrees[i] = snappedi(randf_range(0, 360), 20)
var gear = get_node("Pivot/" + str(i)) as Area2D
gear.area_entered.connect(_on_gear_touched)
$"Pivot/5".area_entered.connect(_on_success)
_reset_all()
func _on_gear_touched(_area):
print("Gear touched!")
if not freeze:
_reset_all()
func _on_success(_area):
freeze = true
print("Success!")
#TODO
func _reset_all():
key.position.x = key_origin_x
for i in range(5):
var gear = get_node("Pivot/" + str(i))
gear.init_rotation(random_degrees[i])
actived_gear = 0
func _input(event: InputEvent) -> void:
if event.is_action("cancel"):
# TODO: go back to the previous scene
print("Cancel action triggered!")
elif event.is_action("left"):
if not freeze:
move_key()
elif event.is_action("right"):
if not freeze:
move_key(-1)
func activate_gear() -> void:
for i in range(5):
var gear = get_node("Pivot/" + str(i))
gear.active = i == actived_gear
func move_key(direction := 1):
if tween_key and tween_key.is_running():
return
actived_gear = clampi(actived_gear + direction, 0, 5)
tween_key = create_tween()
tween_key.tween_property(key, "position:x", key_origin_x + gear_x_delta[actived_gear], 0.5)