137 lines
3.2 KiB
GDScript
137 lines
3.2 KiB
GDScript
extends Node3D
|
|
|
|
|
|
|
|
## Optional audio stream to play when the player jumps on this surface
|
|
@export var start_sound : AudioStream
|
|
|
|
## Optional audio stream to play when the player lands on this surface
|
|
@export var game_over_sound : AudioStream
|
|
|
|
## Optional audio stream to play when the player lands on this surface
|
|
@export var score_sound : AudioStream
|
|
|
|
## Optional audio stream to play when the player lands on this surface
|
|
@export var voice_sound : AudioStream
|
|
|
|
@export var token: int = 0
|
|
@export var _start_count = 60
|
|
|
|
@export var start_text : String = ""
|
|
@export var game_over_text : String = ""
|
|
@export var scored_text : String= ""
|
|
## Audio streams to play when the player walks on this surface
|
|
@onready var player := $AudioStreamPlayer3D
|
|
|
|
@onready var score_label := $Score_Text
|
|
@onready var timer := $Timer
|
|
@onready var timer_label := $Timer_Text
|
|
@onready var start_button := $PlayButton/InteractableAreaButton
|
|
@onready var eject_button := $EjectButton/InteractableAreaButton
|
|
@onready var info_label := $Start_Text
|
|
@onready var zone : XRToolsSnapZone = $SnapZone
|
|
@onready var holder : Node3D = $TokenHolder
|
|
var ejected_token = preload ("res://scenes/audio_demo/objects/token.tscn")
|
|
var _count
|
|
var score
|
|
var tween
|
|
|
|
# Flag indicating when ball is inside the area
|
|
var _ball_inside := false
|
|
|
|
# Flag indicating if timer is running
|
|
var _running := false
|
|
## Signal indicating a target has been passed through
|
|
signal target_passed()
|
|
signal count_down(number)
|
|
|
|
|
|
|
|
|
|
func _ready() -> void:
|
|
timer_label.text = str(_start_count)
|
|
info_label.text = str(start_text)
|
|
timer.timeout.connect(_on_start)
|
|
|
|
start_button.button_pressed.connect(_on_game_start)
|
|
|
|
eject_button.button_pressed.connect(_on_token_eject)
|
|
zone.has_picked_up.connect(_on_token_insert)
|
|
|
|
|
|
func _process(delta):
|
|
if !_running:
|
|
zone.enabled = true
|
|
else:
|
|
zone.enabled = false
|
|
|
|
func _on_entrance_area_entered(_pickable):
|
|
_ball_inside = true
|
|
|
|
|
|
func _on_entrance_area_exited(_pickable):
|
|
_ball_inside = false
|
|
|
|
|
|
func _on_exit_area_entered(_pickable):
|
|
if _ball_inside and _running:
|
|
if player.playing:
|
|
player.stop()
|
|
if _count <= 11:
|
|
player.stream = voice_sound
|
|
else:
|
|
player.stream = score_sound
|
|
player.play()
|
|
|
|
emit_signal("target_passed")
|
|
score += 1
|
|
info_label.text = str(scored_text)
|
|
score_label.text = str(score)
|
|
|
|
func _on_token_insert(_what : Node3D) -> void:
|
|
token += 1
|
|
zone.enabled = false
|
|
tween = get_tree().create_tween()
|
|
tween.tween_callback(_what.queue_free).set_delay(0.15)
|
|
tween.kill
|
|
|
|
|
|
func _on_token_eject(_button) -> void:
|
|
var token_to_eject = ejected_token.instantiate()
|
|
if token > 0:
|
|
holder.add_child(token_to_eject)
|
|
token -= 1
|
|
zone.enabled = true
|
|
|
|
|
|
func _on_game_start(_button) -> void:
|
|
if token > 0 and !_running:
|
|
token -= 1
|
|
info_label.text = str(start_text)
|
|
_count = _start_count
|
|
score = 0
|
|
_running = true
|
|
timer.start(1)
|
|
_on_start()
|
|
|
|
|
|
func _on_start() -> void:
|
|
emit_signal("count_down", _count)
|
|
if _count == _start_count:
|
|
player.stream = start_sound
|
|
player.play()
|
|
_count -= 1
|
|
info_label.text = str("")
|
|
timer_label.text = str(_count)
|
|
if _count < 1:
|
|
_on_game_over()
|
|
|
|
|
|
func _on_game_over() -> void:
|
|
if player.playing:
|
|
player.stop()
|
|
player.stream = game_over_sound
|
|
player.play()
|
|
timer.stop()
|
|
_running = false
|
|
info_label.text = str(game_over_text)
|