@onready var _skin = $skin
+@onready var _ray = $RayCast3D
+@export_category("Appearance")
+@export var color: Color = Color.GOLD
+
@export_category("Movement")
-@export var speed = 5.0
+@export var speed: float = 5.0
@export_category("Camera")
-@export var distance = 3.0
+@export var distance: float = 3.0
@onready var _springArm = $SpringArm3D
+@onready var _camera = $SpringArm3D/Camera3D
enum state {ALIVE, DEAD}
var _state = state.ALIVE
+var _input_map = null
+
+
func _ready() -> void:
_springArm.spring_length = distance
+ _skin.set_color(color)
func _input(event: InputEvent) -> void:
if _state == state.ALIVE:
- if event.is_action_pressed("player_left"):
+ if event.is_action_pressed(_input_map.left):
global_rotate(Vector3.UP, PI/2)
playerTurn.emit(self)
- elif event.is_action_pressed("player_right"):
+ elif event.is_action_pressed(_input_map.right):
global_rotate(Vector3.UP, -PI/2)
playerTurn.emit(self)
else:
- if event.is_action_pressed("player_restart"):
+ if event.is_action_pressed(_input_map.restart):
playerRestart.emit(self)
if _state == state.ALIVE:
velocity = global_transform.basis.z * speed
move_and_slide()
- if velocity.length() == 0:
+ if _ray_intersect_length() < 0.05 or velocity.length() < 0.02:
_explode()
+func _ray_intersect_length() -> float:
+ if _ray.is_colliding():
+ var point: Vector3 = _ray.get_collision_point()
+ var v: Vector3 = _ray.global_position - point
+ return v.length()
+ else:
+ return INF
+
func _explode() -> void:
_skin.visible = false
_state = state.DEAD
playerDestroyed.emit(self)
+
+
+func get_camera_rid() -> RID:
+ return _camera.get_camera_rid()
+
+
+func set_input_map(input_map) -> void:
+ _input_map = input_map