add custom cursor

This commit is contained in:
Teatov 2025-02-27 03:09:30 +10:00
parent 77764f2892
commit 5f1cd4b796
7 changed files with 120 additions and 6 deletions

View File

@ -26,6 +26,7 @@ Referencer="*res://scripts/globals/referencer.gd"
Inputer="*res://scripts/globals/inputer.gd"
Debugger="*res://scenes/debugger.tscn"
Settings="*res://scripts/globals/settings.gd"
Cursor="*res://scenes/ui/cursor.tscn"
[debug]

61
scenes/ui/cursor.tscn Normal file
View File

@ -0,0 +1,61 @@
[gd_scene load_steps=3 format=3 uid="uid://0y0n7ltt7g4e"]
[ext_resource type="Texture2D" uid="uid://xi8bgmkq6kiq" path="res://assets/textures/shadow_decal.png" id="1_77wok"]
[ext_resource type="Script" path="res://scripts/globals/cursor.gd" id="1_tkygf"]
[node name="Cursor" type="CanvasLayer"]
process_mode = 3
process_priority = 1000
process_physics_priority = 1000
layer = 128
script = ExtResource("1_tkygf")
[node name="CursorBase" type="Control" parent="."]
layout_mode = 3
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -20.0
offset_top = -20.0
offset_right = 20.0
offset_bottom = 20.0
grow_horizontal = 2
grow_vertical = 2
pivot_offset = Vector2(20, 20)
mouse_filter = 2
[node name="CursorCircle" type="TextureRect" parent="CursorBase"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = -13.0
offset_top = -13.0
offset_right = 13.0
offset_bottom = 13.0
grow_horizontal = 2
grow_vertical = 2
pivot_offset = Vector2(13, 13)
texture = ExtResource("1_77wok")
expand_mode = 1
[node name="CursorBat" type="TextureRect" parent="CursorBase"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
anchor_top = 0.5
anchor_right = 0.5
anchor_bottom = 0.5
offset_left = 14.0
offset_top = -7.0
offset_right = 59.0
offset_bottom = 7.0
grow_horizontal = 2
grow_vertical = 2
pivot_offset = Vector2(-14, 7)
texture = ExtResource("1_77wok")
expand_mode = 1

44
scripts/globals/cursor.gd Normal file
View File

@ -0,0 +1,44 @@
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
# 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_pos_world := Referencer.player.attack.global_position
var player_pos_screen := Referencer.main_camera.unproject_position(player_pos_world)
var cursor_pos_world := player_pos_world + Referencer.player.aiming.aim_offset
var cursor_pos_screen := Referencer.main_camera.unproject_position(cursor_pos_world)
_base.position = cursor_pos_screen - _base.size / 2
_side = lerpf(
_side,
(
(PI / 2.0)
* (
1.0
if Referencer.player.attack.side == PlayerAttack.Side.RIGHT
else -1.0
)
),
side_change_speed * delta
)
var angle := (
player_pos_screen.angle_to_point(_base.position + _base.size / 2) + _side
)
_bat.rotation = angle

View File

@ -46,12 +46,10 @@ func _input(event: InputEvent) -> void:
if mode == Mode.KB_MOUSE and event_mode == Mode.CONTROLLER:
mode = Mode.CONTROLLER
mode_changed.emit(mode)
Input.mouse_mode = Input.MOUSE_MODE_HIDDEN
if mode == Mode.CONTROLLER and event_mode == Mode.KB_MOUSE:
mode = Mode.KB_MOUSE
mode_changed.emit(mode)
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
if Debugger.show_debug() and event.is_pressed():
Debugger.text("input", _get_event_prompt_current_mode(event))

View File

@ -4,7 +4,8 @@ extends Camera3D
@export var _height_offset: float = 0.5
@export var _distance: float = 50
@export var _angle_degrees: Vector3 = Vector3(-35, -45, 0)
@export var _aim_offset_factor: float = 0.2
@export var _aim_offset_factor_mouse: float = 0.2
@export var _aim_offset_factor_controller: float = 0.5
@export var _aim_damping: float = 1
var _floor_height: float = 0
@ -35,7 +36,17 @@ func _follow(delta: float) -> void:
)
_aim_offset = _aim_offset.lerp(new_aim_offset, _aim_damping * delta)
var follow_position := player_position + _aim_offset * _aim_offset_factor
var follow_position := (
player_position
+ (
_aim_offset
* (
_aim_offset_factor_mouse
if Inputer.mode == Inputer.Mode.KB_MOUSE
else _aim_offset_factor_controller
)
)
)
global_rotation_degrees = _angle_degrees
global_position = (

View File

@ -39,7 +39,6 @@ func _physics_process(delta: float) -> void:
func _aiming() -> void:
aiming.controller_aiming(movement.move_input)
var mouse_pos := get_viewport().get_mouse_position()
aiming.mouse_aiming(mouse_pos, global_position, is_on_floor())

View File

@ -1,7 +1,7 @@
class_name PlayerAiming
extends RefCounted
@export var _controller_aim_offset: float = 15
@export var _controller_aim_offset: float = 6
@export var _vertical_aim_aspect: float = 1.5
var aim_offset: Vector3