51 lines
1.7 KiB
GDScript
51 lines
1.7 KiB
GDScript
class_name PlayerCursor
|
|
extends CanvasLayer
|
|
|
|
@export var _side_change_speed: float = 15
|
|
@export var _screen_inset: float = 100
|
|
|
|
@export_group("References")
|
|
@export var _base: Control
|
|
@export var _bat: Control
|
|
@export var _arrow: Control
|
|
|
|
var _side: float = 0
|
|
|
|
|
|
func handle_cursor(player: Player, delta: float) -> void:
|
|
var cursor_pos_world := player.attack.global_position + player.aiming.aim_offset
|
|
var cursor_pos_screen := MainCamera.instance.unproject_position(cursor_pos_world)
|
|
|
|
var clamp_corner_min := Vector2.ZERO
|
|
var clamp_corner_max := get_viewport().get_visible_rect().size
|
|
if player.input_mode_is(Inputer.Mode.CONTROLLER):
|
|
clamp_corner_min += Vector2(_screen_inset, _screen_inset)
|
|
clamp_corner_max -= Vector2(_screen_inset, _screen_inset)
|
|
|
|
_base.position = (
|
|
cursor_pos_screen.clamp(clamp_corner_min, clamp_corner_max) - _base.size / 2
|
|
)
|
|
|
|
_side = lerpf(
|
|
_side as float,
|
|
(PI / 2.0) * (1.0 if player.attack.side == PlayerAttacker.Side.LEFT else -1.0),
|
|
_side_change_speed * delta
|
|
)
|
|
|
|
var aim_offset_normalized := player.aiming.aim_offset.normalized()
|
|
var bat_rotation_point_screen := MainCamera.instance.unproject_position(
|
|
cursor_pos_world + aim_offset_normalized.rotated(Vector3.UP, _side as float)
|
|
)
|
|
var arrow_rotation_point_screen := MainCamera.instance.unproject_position(
|
|
cursor_pos_world + aim_offset_normalized
|
|
)
|
|
|
|
_bat.rotation = cursor_pos_screen.angle_to_point(bat_rotation_point_screen)
|
|
_arrow.rotation = (
|
|
cursor_pos_screen.angle_to_point(arrow_rotation_point_screen) + PI / 2
|
|
)
|
|
|
|
_base.modulate = player.cursor_color
|
|
if player.input_mode_is(Inputer.Mode.KB_MOUSE):
|
|
_base.position = (get_viewport().get_mouse_position() - _base.size / 2)
|