X-Git-Url: http://git.purplebirdman.com/lightcycles.git/blobdiff_plain/324144cac84227aecd582e51288173e7fa0b9bda..f0a8b4b6ed5b689dc505fe5a6266bef9a649057d:/player/player.gd diff --git a/player/player.gd b/player/player.gd index 27754a4..3cd1522 100644 --- a/player/player.gd +++ b/player/player.gd @@ -1,22 +1,78 @@ +class_name Player extends CharacterBody3D -@export_category("Movement") -@export var speed = 5.0 + +signal playerTurn +signal playerDestroyed +signal playerRestart + + +@onready var _skin = $skin +@onready var _ray = $RayCast3D + + +@export_category("Appearance") +@export var color: Color = Color.GOLD + +@export_category("Movement") +@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 _skin = %skin +@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 event.is_action_pressed("player_left"): - global_rotate(Vector3.UP, PI/2) - elif event.is_action_pressed("player_right"): - global_rotate(Vector3.UP, -PI/2) - -func _physics_process(delta: float) -> void: - velocity = global_transform.basis.z * speed - move_and_slide() + if _state == state.ALIVE: + if event.is_action_pressed(_input_map.left): + global_rotate(Vector3.UP, PI/2) + playerTurn.emit(self) + elif event.is_action_pressed(_input_map.right): + global_rotate(Vector3.UP, -PI/2) + playerTurn.emit(self) + else: + if event.is_action_pressed(_input_map.restart): + playerRestart.emit(self) + + +func _physics_process(_delta: float) -> void: + if _state == state.ALIVE: + velocity = global_transform.basis.z * speed + move_and_slide() + 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