generated from krampus/template-godot4
50 lines
1.2 KiB
GDScript3
50 lines
1.2 KiB
GDScript3
|
class_name BallPoint extends Node3D
|
||
|
## Ball spawn point & origin. I.E. the "tee".
|
||
|
|
||
|
## Emitted when a new ball is placed.
|
||
|
signal ball_changed(ball: GameBall)
|
||
|
|
||
|
## Types of game balls
|
||
|
enum Type {
|
||
|
NONE,
|
||
|
BASIC,
|
||
|
PLASMA,
|
||
|
}
|
||
|
|
||
|
## Scenes for each type of ball.
|
||
|
const SCENE_MAP: Dictionary = {
|
||
|
Type.BASIC: preload("res://src/equipment/balls/physics_ball/physics_ball.tscn"),
|
||
|
Type.PLASMA: preload("res://src/equipment/balls/plasma_ball/plasma_ball.tscn"),
|
||
|
}
|
||
|
|
||
|
@export var ball: GameBall:
|
||
|
set(value):
|
||
|
ball = value
|
||
|
ball_changed.emit(ball)
|
||
|
|
||
|
|
||
|
## Get a new instance of a ball of the given type.
|
||
|
## Returns null if the type can't be instantiated (e.g. NONE type)
|
||
|
func get_instance(type: Type) -> GameBall:
|
||
|
if type in SCENE_MAP:
|
||
|
var scene: PackedScene = SCENE_MAP.get(type)
|
||
|
return scene.instantiate() as GameBall
|
||
|
return null
|
||
|
|
||
|
|
||
|
## Clear any existing ball, instantiate a new one of the given type, and place it at the ball point.
|
||
|
func spawn_ball(type: Type) -> void:
|
||
|
# Clear existing ball
|
||
|
if is_instance_valid(ball):
|
||
|
ball.queue_free()
|
||
|
|
||
|
ball = get_instance(type)
|
||
|
if is_instance_valid(ball):
|
||
|
add_child(ball)
|
||
|
snap()
|
||
|
|
||
|
|
||
|
## Snap the ball back to the ball point.
|
||
|
func snap() -> void:
|
||
|
ball.global_transform = global_transform
|