xrjamfeb2025/scenes/audio_demo/objects/arcade_hoops_ctrl.gd

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)