57 lines
1.5 KiB
GDScript
57 lines
1.5 KiB
GDScript
## Cake — tap to cut a slice, slice auto-respawns after a delay.
|
|
class_name Cake extends Node2D
|
|
|
|
enum State { WHOLE, CUTTING, CUT, RESETTING }
|
|
|
|
const CUT_DURATION: float = 0.3
|
|
const RESET_DURATION: float = 0.3
|
|
const RESET_DELAY: float = 3.0
|
|
const BUTTON_HALF_WIDTH: float = 40.0
|
|
const BUTTON_HALF_HEIGHT: float = 20.0
|
|
|
|
var _state: State = State.WHOLE
|
|
|
|
|
|
func _input(event: InputEvent) -> void:
|
|
if _state != State.WHOLE:
|
|
return
|
|
if not event is InputEventScreenTouch:
|
|
return
|
|
var touch: InputEventScreenTouch = event as InputEventScreenTouch
|
|
if not touch.pressed:
|
|
return
|
|
var local: Vector2 = to_local(touch.position)
|
|
if abs(local.x) > BUTTON_HALF_WIDTH or abs(local.y) > BUTTON_HALF_HEIGHT:
|
|
return
|
|
_start_cutting()
|
|
|
|
|
|
func _start_cutting() -> void:
|
|
AudioManager.play_sfx("object_tap")
|
|
_state = State.CUTTING
|
|
var slice: Node2D = get_node_or_null("Slice") as Node2D
|
|
var tween: Tween = create_tween()
|
|
if slice != null:
|
|
tween.tween_property(slice, "modulate:a", 0.0, CUT_DURATION)
|
|
tween.tween_callback(_on_cut_complete)
|
|
|
|
|
|
func _on_cut_complete() -> void:
|
|
_state = State.CUT
|
|
var tween: Tween = create_tween()
|
|
tween.tween_interval(RESET_DELAY)
|
|
tween.tween_callback(_start_reset)
|
|
|
|
|
|
func _start_reset() -> void:
|
|
_state = State.RESETTING
|
|
var slice: Node2D = get_node_or_null("Slice") as Node2D
|
|
var tween: Tween = create_tween()
|
|
if slice != null:
|
|
tween.tween_property(slice, "modulate:a", 1.0, RESET_DURATION)
|
|
tween.tween_callback(_on_reset_complete)
|
|
|
|
|
|
func _on_reset_complete() -> void:
|
|
_state = State.WHOLE
|