59 lines
1.6 KiB
GDScript
59 lines
1.6 KiB
GDScript
class_name Player extends Node
|
|
|
|
const RAY_LENGTH = 1000.0
|
|
|
|
static var instance:Player
|
|
|
|
@onready var raycast := $RayCast3D as RayCast3D
|
|
|
|
var selected_unit:Ant
|
|
|
|
func _init() -> void:
|
|
instance = self
|
|
|
|
func _unhandled_input(event:InputEvent)->void:
|
|
if not event is InputEventMouseButton: return
|
|
var mouse_event := event as InputEventMouseButton
|
|
if not mouse_event.pressed: return
|
|
if mouse_event.button_index == MOUSE_BUTTON_MIDDLE: return
|
|
if mouse_event.button_index == MOUSE_BUTTON_LEFT:
|
|
input_left_mouse_click()
|
|
if mouse_event.button_index == MOUSE_BUTTON_RIGHT:
|
|
input_right_mouse_click()
|
|
|
|
func _physics_process(_delta: float) -> void:
|
|
process_raycast()
|
|
|
|
func input_left_mouse_click()->void:
|
|
var collider := raycast.get_collider()
|
|
selected_unit = null
|
|
if collider is Ant:
|
|
var player_unit := collider as Ant
|
|
selected_unit = player_unit
|
|
else:
|
|
PlayerCamp.instance.on_interact(
|
|
raycast.get_collider(),
|
|
raycast.get_collision_point()
|
|
)
|
|
|
|
func input_right_mouse_click()->void:
|
|
if selected_unit != null:
|
|
selected_unit.on_interact(
|
|
raycast.get_collider(),
|
|
raycast.get_collision_point()
|
|
)
|
|
else:
|
|
if PlayerCamp.instance.active_indicator != null:
|
|
PlayerCamp.instance.active_indicator.queue_free()
|
|
|
|
|
|
func process_raycast()->void:
|
|
var camera := get_viewport().get_camera_3d()
|
|
var mouse_position := get_viewport().get_mouse_position()
|
|
var from := camera.project_ray_origin(mouse_position)
|
|
var to := from + camera.project_ray_normal(mouse_position) * RAY_LENGTH
|
|
|
|
raycast.global_position = from
|
|
raycast.target_position = to
|
|
raycast.force_raycast_update()
|