move player cursor handling to the player scene

This commit is contained in:
2025-08-29 19:02:11 +10:00
parent 8e26c88aa8
commit 3369f1c31d
6 changed files with 108 additions and 98 deletions

View File

@@ -1,4 +1,4 @@
[gd_scene load_steps=49 format=3 uid="uid://b73y71y3efmv"]
[gd_scene load_steps=50 format=3 uid="uid://b73y71y3efmv"]
[ext_resource type="Script" uid="uid://bvvmaqn1fp6nq" path="res://scripts/gameplay/player/player.gd" id="1_xt3i8"]
[ext_resource type="Material" uid="uid://cc18ee0wbfoud" path="res://resources/materials/debug/debug_player.tres" id="2_0p422"]
@@ -24,9 +24,10 @@
[ext_resource type="AudioStream" uid="uid://chbx68a8mxve0" path="res://assets/sfx/player/player_hit_swoosh.wav" id="17_ke2ow"]
[ext_resource type="AudioStream" uid="uid://bef4e6hhaait3" path="res://assets/sfx/player/swing/player_swing_1.wav" id="18_31cv2"]
[ext_resource type="AudioStream" uid="uid://dt5i30dkgawb5" path="res://assets/sfx/player/swing/player_swing_2.wav" id="19_pf23h"]
[ext_resource type="Script" path="res://scripts/gameplay/player/player_attacker.gd" id="20_31cv2"]
[ext_resource type="Script" uid="uid://dmu2tkt0wo7d1" path="res://scripts/gameplay/player/player_attacker.gd" id="20_31cv2"]
[ext_resource type="Script" uid="uid://bxsmma3kjo381" path="res://scripts/gameplay/player/player_attack_effect.gd" id="24_31cv2"]
[ext_resource type="AudioStream" uid="uid://dgm4ccrcahaci" path="res://resources/footsteps/footsteps_baja.tres" id="27_31cv2"]
[ext_resource type="PackedScene" uid="uid://d1v8bd7wuquej" path="res://scenes/ui/player_cursor.tscn" id="28_pf23h"]
[sub_resource type="Curve" id="Curve_03vie"]
_data = [Vector2(0.952555, 1), 0.0, 0.0, 0, 0, Vector2(1, 0), 0.0, 0.0, 0, 0]
@@ -135,12 +136,13 @@ is_hemisphere = true
[sub_resource type="AudioStreamPolyphonic" id="AudioStreamPolyphonic_qfm1y"]
[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("attack")]
[node name="Player" type="CharacterBody3D" node_paths=PackedStringArray("attack", "_cursor")]
collision_layer = 16
script = ExtResource("1_xt3i8")
cursor_color = Color(0.964706, 0.870588, 0.917647, 1)
_collision_debug_material = ExtResource("2_0p422")
attack = NodePath("Attacker")
_cursor = NodePath("PlayerCursor")
[node name="Model" parent="." instance=ExtResource("3_f1ej7")]
@@ -150,6 +152,7 @@ bones/0/rotation = Quaternion(0.709712, -0.176382, -0.660118, -0.171586)
bones/0/scale = Vector3(1, 1, 1)
bones/1/position = Vector3(-9.75365e-05, 0.0319142, -0.124525)
bones/1/rotation = Quaternion(-0.000141591, 0.789452, 0.613812, 0.000224233)
bones/1/scale = Vector3(1, 1, 1)
bones/2/rotation = Quaternion(6.24507e-10, 4.41808e-08, -6.03351e-10, 1)
bones/2/scale = Vector3(1, 1, 1)
bones/3/rotation = Quaternion(1.74623e-10, -2.60798e-10, -1.30968e-10, 1)
@@ -159,6 +162,7 @@ bones/5/position = Vector3(6.05363e-09, 0.111695, -8.19564e-08)
bones/5/rotation = Quaternion(0.0730383, -0.122639, 0.261682, 0.95454)
bones/6/rotation = Quaternion(-0.419799, -0.099015, 0.00812949, 0.902163)
bones/7/rotation = Quaternion(0.325855, 0.285799, -0.242013, 0.868082)
bones/7/scale = Vector3(1, 1, 1)
bones/8/rotation = Quaternion(-0.2495, 0.296628, 0.151267, 0.90933)
bones/9/rotation = Quaternion(1.13474e-07, 0.707107, 0.707107, -5.23149e-08)
bones/10/scale = Vector3(1, 1, 1)
@@ -179,11 +183,14 @@ bones/19/position = Vector3(-0.029965, -6.74833e-08, -0.0114938)
bones/20/position = Vector3(0.0319374, 2.70462e-10, -0.00811319)
bones/21/position = Vector3(0.0451344, 0.0764403, 0.0935013)
bones/21/rotation = Quaternion(0.160115, 0.667183, 0.68874, -0.234237)
bones/21/scale = Vector3(1, 1, 1)
bones/22/position = Vector3(-0.00351833, -2.67936e-08, 0.0010112)
bones/25/position = Vector3(-0.0442944, 0.0756561, 0.0940351)
bones/25/rotation = Quaternion(-0.161417, 0.667625, 0.688436, 0.232975)
bones/25/scale = Vector3(1, 1, 1)
bones/26/position = Vector3(0.00351835, 2.9417e-08, 0.00101115)
bones/29/rotation = Quaternion(0.0382404, -0.550798, 0.832483, 0.0461726)
bones/29/scale = Vector3(1, 1, 1)
bones/30/rotation = Quaternion(-0.0869156, 0.0044743, 0.0650064, 0.994082)
bones/31/rotation = Quaternion(0.00282337, 0.992799, -0.117349, -0.0238866)
bones/32/rotation = Quaternion(0.632344, -1.60676e-07, -1.28148e-06, 0.774687)
@@ -191,7 +198,9 @@ bones/33/rotation = Quaternion(-0.0342351, -3.5846e-07, 8.54711e-08, 0.999414)
bones/35/rotation = Quaternion(0.41021, -0.0198433, 0.211071, 0.887008)
bones/36/rotation = Quaternion(-0.651527, 3.06553e-07, 4.80602e-07, 0.758626)
bones/37/rotation = Quaternion(0.0550548, -0.0780516, 0.0545206, 0.993934)
bones/37/scale = Vector3(1, 1, 1)
bones/38/rotation = Quaternion(-0.561348, 3.54993e-07, 9.68581e-07, 0.82758)
bones/38/scale = Vector3(1, 1, 1)
bones/39/rotation = Quaternion(0.197471, 0.678974, 0.678974, -0.19747)
bones/39/scale = Vector3(1, 1, 1)
bones/41/position = Vector3(0.0128964, 0.000225329, -0.00384278)
@@ -203,6 +212,7 @@ bones/44/position = Vector3(-0.00910762, -1.30386e-08, 0.00452032)
bones/45/position = Vector3(-0.013421, 6.33299e-08, -0.0283991)
bones/46/position = Vector3(-0.0513805, 8.90344e-07, -0.0104124)
bones/47/position = Vector3(0.0446487, -1.27684e-06, -0.0177286)
bones/48/rotation = Quaternion(-0.19747, 0.678974, 0.678974, 0.19747)
bones/48/scale = Vector3(1, 1, 1)
bones/50/position = Vector3(-0.0180255, 0.000225338, -0.00485544)
bones/50/rotation = Quaternion(-6.48622e-09, -0.00862222, 1.11814e-08, 0.999963)
@@ -214,6 +224,7 @@ bones/54/position = Vector3(0.0134209, 4.70912e-08, -0.0184937)
bones/55/position = Vector3(0.0513805, 9.29226e-07, -0.0104125)
bones/56/position = Vector3(-0.0446488, -1.30966e-06, -0.0177287)
bones/57/rotation = Quaternion(0.231711, -0.0107282, -0.674644, 0.70075)
bones/57/scale = Vector3(1, 1, 1)
bones/58/rotation = Quaternion(0.522238, 0.0740878, -0.404748, 0.746965)
bones/58/scale = Vector3(1, 1, 1)
bones/59/position = Vector3(-9.57874e-08, 0.28245, -2.04679e-08)
@@ -231,8 +242,11 @@ bones/65/rotation = Quaternion(-0.350045, -0.622991, 0.32694, 0.618434)
bones/65/scale = Vector3(1, 1.06804, 0.999999)
bones/66/rotation = Quaternion(-0.366656, -0.669855, 0.130948, 0.632227)
bones/66/scale = Vector3(1, 1.06804, 1)
bones/67/rotation = Quaternion(-0.0266082, 0.706555, -0.0266833, 0.706654)
bones/68/rotation = Quaternion(0.588387, 0.00842921, 0.0114187, 0.808455)
bones/68/scale = Vector3(1, 1, 1)
bones/69/rotation = Quaternion(0.688842, 0.0139142, 0.0146803, 0.724629)
bones/69/scale = Vector3(1, 1, 1)
bones/70/rotation = Quaternion(0.688963, 3.18001e-09, 9.47635e-09, 0.724796)
bones/71/rotation = Quaternion(-0.394358, 3.88507e-07, 1.22561e-06, 0.918957)
bones/71/scale = Vector3(1, 1.3754, 1)
@@ -242,6 +256,7 @@ bones/73/rotation = Quaternion(-0.453244, -0.0243879, 0.0218395, 0.890785)
bones/73/scale = Vector3(1, 1.21299, 1)
bones/75/rotation = Quaternion(0.542353, -0.00178243, -0.00294061, 0.840144)
bones/76/rotation = Quaternion(0.64733, 0.00117141, 0.00142018, 0.762208)
bones/76/scale = Vector3(1, 1, 1)
bones/77/rotation = Quaternion(0.647312, 8.53979e-09, -1.5355e-09, 0.762225)
bones/78/rotation = Quaternion(-0.419933, 5.12895e-07, 1.11657e-06, 0.907555)
bones/78/scale = Vector3(1, 1.29838, 1)
@@ -249,7 +264,9 @@ bones/79/rotation = Quaternion(-0.41991, -0.00079643, 0.00166066, 0.907564)
bones/79/scale = Vector3(1, 1.29838, 1)
bones/80/rotation = Quaternion(-0.478367, 0.000101198, -0.00211334, 0.878157)
bones/80/scale = Vector3(1, 1.16111, 1)
bones/81/rotation = Quaternion(0.0361992, 0.706123, 0.0361283, 0.70624)
bones/82/rotation = Quaternion(0.461428, -0.0178797, -0.0344953, 0.886326)
bones/82/scale = Vector3(1, 1, 1)
bones/83/rotation = Quaternion(0.573376, -0.00892217, -0.0127629, 0.819144)
bones/84/rotation = Quaternion(0.573452, 2.34811e-08, 5.61145e-08, 0.819239)
bones/85/rotation = Quaternion(-0.461816, 5.05443e-07, 1.11474e-06, 0.886976)
@@ -258,6 +275,8 @@ bones/86/rotation = Quaternion(-0.461768, 0.00718379, -0.013798, 0.886864)
bones/86/scale = Vector3(1, 1.19474, 1)
bones/87/rotation = Quaternion(-0.517814, 0.0335063, -0.0412293, 0.853842)
bones/87/scale = Vector3(1, 1.09458, 1)
bones/88/rotation = Quaternion(0.0569009, 0.704803, 0.0568902, 0.704825)
bones/88/scale = Vector3(1, 1, 1)
bones/89/rotation = Quaternion(0.394028, -0.0167212, -0.0389965, 0.918118)
bones/90/rotation = Quaternion(0.510242, -0.0211244, -0.0355649, 0.859036)
bones/91/rotation = Quaternion(0.510679, 2.16669e-09, 1.57069e-08, 0.859772)
@@ -280,7 +299,9 @@ bones/98/rotation = Quaternion(-0.0586372, -0.00568235, -0.12181, 0.990804)
bones/99/rotation = Quaternion(-0.463939, 0.15397, -0.11612, 0.864622)
bones/99/scale = Vector3(1, 1, 1)
bones/100/rotation = Quaternion(0.0487089, -0.0278453, 0.474124, 0.878669)
bones/100/scale = Vector3(1, 1, 1)
bones/101/rotation = Quaternion(0.0609121, 0.449251, 0.748827, 0.483447)
bones/101/scale = Vector3(1, 1, 1)
bones/102/position = Vector3(6.2732e-09, 0.281682, 9.00968e-08)
bones/102/rotation = Quaternion(0.0823444, 5.1342e-05, 4.83887e-05, 0.996604)
bones/102/scale = Vector3(1, 1, 1)
@@ -290,14 +311,19 @@ bones/104/position = Vector3(-1.97803e-07, 0.068466, -0.000150014)
bones/104/rotation = Quaternion(-0.38389, 0.000249183, -0.000182866, 0.923379)
bones/104/scale = Vector3(1, 1, 1)
bones/105/rotation = Quaternion(-0.272954, 0.938438, 0.146391, -0.152973)
bones/105/scale = Vector3(1, 1, 1)
bones/106/rotation = Quaternion(0.58496, 0.153924, 0.0835466, 0.791928)
bones/106/scale = Vector3(1, 1, 1)
bones/107/rotation = Quaternion(0.510624, 0.0271032, 0.0393668, 0.858475)
bones/107/scale = Vector3(1, 1, 1)
bones/108/rotation = Quaternion(-0.329205, 0.636159, -0.30397, 0.628115)
bones/108/scale = Vector3(1, 1.10703, 1)
bones/109/rotation = Quaternion(-0.343634, 0.682552, -0.10805, 0.635896)
bones/109/scale = Vector3(1, 1.10703, 1)
bones/110/rotation = Quaternion(-0.0266082, -0.706555, 0.0266833, 0.706654)
bones/111/rotation = Quaternion(0.5358, -0.00768626, -0.0119316, 0.844226)
bones/112/rotation = Quaternion(0.620817, -0.0125362, -0.0158732, 0.783695)
bones/112/scale = Vector3(1, 1, 1)
bones/113/rotation = Quaternion(0.620922, 3.46369e-08, -6.57383e-10, 0.783872)
bones/114/rotation = Quaternion(-0.435361, -5.24814e-07, -1.11385e-06, 0.900256)
bones/114/scale = Vector3(1, 1.25705, 1)
@@ -307,6 +333,7 @@ bones/116/rotation = Quaternion(-0.481352, 0.0244881, -0.0222001, 0.875904)
bones/116/scale = Vector3(1, 1.1547, 1)
bones/118/rotation = Quaternion(0.535939, 0.00176, 0.00295405, 0.84425)
bones/119/rotation = Quaternion(0.620951, -0.00112226, -0.00145929, 0.783848)
bones/119/scale = Vector3(1, 1, 1)
bones/120/rotation = Quaternion(0.620932, -1.66193e-08, 4.7599e-09, 0.783864)
bones/121/rotation = Quaternion(-0.435355, -5.3242e-07, -1.07606e-06, 0.900259)
bones/121/scale = Vector3(1, 1.25707, 1)
@@ -314,6 +341,7 @@ bones/122/rotation = Quaternion(-0.435332, 0.000824678, -0.00164675, 0.900268)
bones/122/scale = Vector3(1, 1.25706, 1)
bones/123/rotation = Quaternion(-0.481707, -0.00011581, 0.00210061, 0.87633)
bones/123/scale = Vector3(1, 1.15478, 1)
bones/124/rotation = Quaternion(0.0361992, -0.706123, -0.0361283, 0.70624)
bones/125/rotation = Quaternion(0.53563, 0.0207679, 0.0328375, 0.843558)
bones/126/rotation = Quaternion(0.62085, 0.00966187, 0.0122125, 0.783775)
bones/127/rotation = Quaternion(0.620932, -1.27514e-08, -3.01273e-08, 0.783864)
@@ -323,6 +351,8 @@ bones/129/rotation = Quaternion(-0.43531, -0.00677157, 0.0140056, 0.900146)
bones/129/scale = Vector3(1, 1.25706, 1)
bones/130/rotation = Quaternion(-0.48072, -0.0323989, 0.0414881, 0.875293)
bones/130/scale = Vector3(1, 1.15484, 1)
bones/131/rotation = Quaternion(0.0569009, -0.704803, -0.0568902, 0.704825)
bones/131/scale = Vector3(1, 1, 1)
bones/132/rotation = Quaternion(0.535603, 0.0227346, 0.0358254, 0.843403)
bones/133/rotation = Quaternion(0.620347, 0.0256828, 0.0324268, 0.783236)
bones/134/rotation = Quaternion(0.620878, -8.97364e-09, -5.99042e-09, 0.783907)
@@ -346,9 +376,13 @@ bones/141/rotation = Quaternion(-0.0876969, -0.00686066, -0.0793036, 0.992962)
bones/142/rotation = Quaternion(-0.587388, -0.0926214, 0.485692, 0.640703)
bones/142/scale = Vector3(1, 1, 0.999999)
bones/143/position = Vector3(-0.02041, 0.110161, 0.0701683)
bones/143/rotation = Quaternion(0.0323581, -3.23524e-09, 4.47963e-09, 0.999476)
bones/144/position = Vector3(-0.0409147, 0.054936, 0.0820282)
bones/144/rotation = Quaternion(0.0323581, -3.23524e-09, 4.47954e-09, 0.999476)
bones/145/position = Vector3(-0.0626397, 0.00168204, 0.0600031)
bones/145/rotation = Quaternion(0.0323581, -3.23524e-09, 4.47955e-09, 0.999476)
bones/146/position = Vector3(0.0385293, 0.0552758, -0.101069)
bones/146/rotation = Quaternion(0.0323581, -3.23524e-09, 4.47962e-09, 0.999476)
bones/147/position = Vector3(0.0987034, 0.0409437, -0.0281637)
bones/147/rotation = Quaternion(0.12444, -0.181954, 0.0628765, 0.973373)
bones/148/position = Vector3(0.111264, 0.0929392, -0.0283639)
@@ -358,7 +392,9 @@ bones/149/rotation = Quaternion(0.12444, -0.181954, 0.0628765, 0.973373)
bones/150/position = Vector3(0.0577697, 0.0025552, 0.065909)
bones/150/rotation = Quaternion(0.12444, -0.181954, 0.0628765, 0.973373)
bones/151/position = Vector3(0.0087225, 0.0589397, 0.0793704)
bones/151/rotation = Quaternion(0.0323581, -3.08697e-09, -9.99408e-11, 0.999476)
bones/152/position = Vector3(0.00292983, -0.0059475, 0.0783843)
bones/152/rotation = Quaternion(0.0323581, -3.08697e-09, -9.99408e-11, 0.999476)
bones/153/position = Vector3(0.031348, 0.11444, 0.0551177)
bones/153/rotation = Quaternion(0.12444, -0.181954, 0.0628765, 0.973373)
bones/154/position = Vector3(0.0637267, 0.139331, 0.0384155)
@@ -380,7 +416,9 @@ bones/161/rotation = Quaternion(0.0314138, 0.0266726, -0.333223, 0.941947)
bones/162/position = Vector3(-0.116001, 0.0676389, -0.0453657)
bones/162/rotation = Quaternion(0.0314138, 0.0266726, -0.333223, 0.941947)
bones/163/position = Vector3(-0.0826924, 0.0793718, 0.0516733)
bones/163/rotation = Quaternion(0.0323581, -2.41381e-07, -7.81472e-09, 0.999476)
bones/164/position = Vector3(-0.102105, 0.0279538, 0.0309587)
bones/164/rotation = Quaternion(0.0323581, -2.41381e-07, -7.81472e-09, 0.999476)
bones/165/position = Vector3(-0.0586871, 0.151042, 0.0513973)
bones/165/rotation = Quaternion(0.0314138, 0.0266726, -0.333223, 0.941947)
bones/166/position = Vector3(-0.062244, 0.184127, 0.0201765)
@@ -577,4 +615,6 @@ panning_strength = 0.0
bus = &"SFX"
attenuation_filter_cutoff_hz = 20500.0
[node name="PlayerCursor" parent="." instance=ExtResource("28_pf23h")]
[editable path="Model"]

View File

@@ -1,6 +1,7 @@
[gd_scene load_steps=5 format=3 uid="uid://d1v8bd7wuquej"]
[gd_scene load_steps=6 format=3 uid="uid://d1v8bd7wuquej"]
[ext_resource type="Texture2D" uid="uid://cu7dd1c24w8i3" path="res://assets/textures/ui/cursor.png" id="1_j2xq6"]
[ext_resource type="Script" uid="uid://ddx56siie1sf4" path="res://scripts/gameplay/player/player_cursor.gd" id="1_y4x60"]
[sub_resource type="AtlasTexture" id="AtlasTexture_p3xy3"]
atlas = ExtResource("1_j2xq6")
@@ -14,7 +15,13 @@ region = Rect2(312, 227, 168, 61)
atlas = ExtResource("1_j2xq6")
region = Rect2(222, 143, 71, 50)
[node name="CursorBase" type="Control"]
[node name="PlayerCursor" type="CanvasLayer" node_paths=PackedStringArray("_base", "_bat", "_arrow")]
script = ExtResource("1_y4x60")
_base = NodePath("CursorBase")
_bat = NodePath("CursorBase/CursorBat")
_arrow = NodePath("CursorBase/CursorArrow")
[node name="CursorBase" type="Control" parent="."]
layout_mode = 3
anchors_preset = 8
anchor_left = 0.5
@@ -30,7 +37,7 @@ grow_vertical = 2
pivot_offset = Vector2(20, 20)
mouse_filter = 2
[node name="CursorCircle" type="TextureRect" parent="."]
[node name="CursorCircle" type="TextureRect" parent="CursorBase"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
@@ -48,7 +55,7 @@ mouse_filter = 2
texture = SubResource("AtlasTexture_p3xy3")
expand_mode = 1
[node name="CursorBat" type="TextureRect" parent="."]
[node name="CursorBat" type="TextureRect" parent="CursorBase"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5
@@ -66,7 +73,7 @@ mouse_filter = 2
texture = SubResource("AtlasTexture_j2xq6")
expand_mode = 1
[node name="CursorArrow" type="TextureRect" parent="."]
[node name="CursorArrow" type="TextureRect" parent="CursorBase"]
layout_mode = 1
anchors_preset = 8
anchor_left = 0.5

View File

@@ -13,6 +13,7 @@ static var instances: Array[Player]
@export_group("References")
@export var attack: PlayerAttacker
@export var _cursor: PlayerCursor
var stats: PlayerStats = PlayerStats.new()
var movement: PlayerMovementHandler = PlayerMovementHandler.new()
@@ -49,6 +50,7 @@ func _physics_process(delta: float) -> void:
look_at(global_position + aiming.aim_offset, Vector3.UP, true)
_process_respawning()
_cursor.handle_cursor(self, delta)
func _unhandled_input(event: InputEvent) -> void:

View File

@@ -0,0 +1,50 @@
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)

View File

@@ -0,0 +1 @@
uid://ddx56siie1sf4

View File

@@ -1,15 +1,9 @@
extends CanvasLayer
@export var _side_change_speed: float = 15
@export var _screen_inset: float = 100
@export_group("References")
@export var _single_cursor: Control
var _cursor_scene := preload("res://scenes/ui/cursor_base.tscn")
var _cursors: Dictionary[int, PlayerCursor]
func _ready() -> void:
Input.mouse_mode = Input.MOUSE_MODE_HIDDEN
@@ -22,87 +16,3 @@ func _process(_delta: float) -> void:
_single_cursor.visible = true
return
_single_cursor.visible = false
func _physics_process(delta: float) -> void:
call_deferred("_handle_cursors", delta)
func _handle_cursors(delta: float) -> void:
for player_index in range(Player.instances.size()):
_handle_cursor(player_index, delta)
func _init_player_cursor(id: int) -> void:
var cursor_node: Control = _cursor_scene.instantiate() as Control
add_child(cursor_node)
_cursors[id] = PlayerCursor.new(
cursor_node,
cursor_node.get_node("CursorBat") as Control,
cursor_node.get_node("CursorArrow") as Control
)
func _handle_cursor(player_index: int, delta: float) -> void:
var player := Player.instances[player_index]
var id := player.get_instance_id()
if not _cursors.has(id):
_init_player_cursor(id)
return
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)
var cursor: PlayerCursor = _cursors[id]
cursor.base.position = (
cursor_pos_screen.clamp(clamp_corner_min, clamp_corner_max)
- cursor.base.size / 2
)
cursor.side = lerpf(
cursor.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, cursor.side as float)
)
)
var arrow_rotation_point_screen := MainCamera.instance.unproject_position(
cursor_pos_world + aim_offset_normalized
)
cursor.bat.rotation = cursor_pos_screen.angle_to_point(bat_rotation_point_screen)
cursor.arrow.rotation = (
cursor_pos_screen.angle_to_point(arrow_rotation_point_screen) + PI / 2
)
cursor.base.modulate = player.cursor_color
if player.input_mode_is(Inputer.Mode.KB_MOUSE):
cursor.base.position = (
get_viewport().get_mouse_position() - cursor.base.size / 2
)
class PlayerCursor:
var base: Control
var bat: Control
var arrow: Control
var side: float = 0
func _init(_base: Control, _bat: Control, _arrow: Control) -> void:
base = _base
bat = _bat
arrow = _arrow