diff --git a/project.godot b/project.godot index a121bb0..66912f4 100644 --- a/project.godot +++ b/project.godot @@ -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] diff --git a/scenes/ui/cursor.tscn b/scenes/ui/cursor.tscn new file mode 100644 index 0000000..82599b0 --- /dev/null +++ b/scenes/ui/cursor.tscn @@ -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 diff --git a/scripts/globals/cursor.gd b/scripts/globals/cursor.gd new file mode 100644 index 0000000..08339c0 --- /dev/null +++ b/scripts/globals/cursor.gd @@ -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 diff --git a/scripts/globals/inputer.gd b/scripts/globals/inputer.gd index d990cf7..55d2aa9 100644 --- a/scripts/globals/inputer.gd +++ b/scripts/globals/inputer.gd @@ -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)) diff --git a/scripts/main_camera.gd b/scripts/main_camera.gd index 777aaf7..68a6e1f 100644 --- a/scripts/main_camera.gd +++ b/scripts/main_camera.gd @@ -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 = ( diff --git a/scripts/player/player.gd b/scripts/player/player.gd index 16390fc..a770417 100644 --- a/scripts/player/player.gd +++ b/scripts/player/player.gd @@ -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()) diff --git a/scripts/player/player_aiming.gd b/scripts/player/player_aiming.gd index 2022049..f9b6bab 100644 --- a/scripts/player/player_aiming.gd +++ b/scripts/player/player_aiming.gd @@ -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