50 lines
1.5 KiB
GDScript
50 lines
1.5 KiB
GDScript
extends CanvasLayer
|
|
|
|
@export var side_change_speed: float = 15
|
|
|
|
var _side: float
|
|
|
|
@onready var _base: Control = $CursorBase
|
|
# @onready var _circle: Control = $CursorBase/CursorCircle
|
|
@onready var _bat: Control = $CursorBase/CursorBat
|
|
@onready var _arrow: Control = $CursorBase/CursorArrow
|
|
|
|
|
|
func _ready() -> void:
|
|
Input.mouse_mode = Input.MOUSE_MODE_HIDDEN
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
if not Referencer.player or not Referencer.main_camera:
|
|
var mouse_pos := get_viewport().get_mouse_position()
|
|
_base.position = mouse_pos - _base.size / 2
|
|
_bat.visible = false
|
|
return
|
|
_bat.visible = true
|
|
|
|
var player := Referencer.player
|
|
|
|
var cursor_pos_world := player.attack.global_position + player.aiming.aim_offset
|
|
var cursor_pos_screen := Referencer.main_camera.unproject_position(cursor_pos_world)
|
|
_base.position = (
|
|
cursor_pos_screen.clamp(Vector2.ZERO, get_viewport().get_visible_rect().size)
|
|
- _base.size / 2
|
|
)
|
|
|
|
_side = lerpf(
|
|
_side,
|
|
(PI / 2.0) * (1.0 if player.attack.side == PlayerAttack.Side.LEFT else -1.0),
|
|
side_change_speed * delta
|
|
)
|
|
|
|
var aim_offset_normalized := player.aiming.aim_offset.normalized()
|
|
var bat_rotation_point_screen := Referencer.main_camera.unproject_position(
|
|
cursor_pos_world + aim_offset_normalized.rotated(Vector3.UP, _side)
|
|
)
|
|
var arrow_rotation_point_screen := Referencer.main_camera.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)
|