add local multiplayer
This commit is contained in:
@@ -3,12 +3,11 @@ extends CanvasLayer
|
||||
@export var side_change_speed: float = 15
|
||||
@export var screen_inset: float = 100
|
||||
|
||||
var _side: float
|
||||
var _cursor_scene := preload("res://scenes/ui/cursor_base.tscn")
|
||||
|
||||
@onready var _base: Control = $CursorBase
|
||||
# @onready var _circle: Control = $CursorBase/CursorCircle
|
||||
@onready var _bat: Control = $CursorBase/CursorBat
|
||||
@onready var _arrow: Control = $CursorBase/CursorArrow
|
||||
var _cursors: Dictionary
|
||||
|
||||
@onready var _single_cursor: Control = $CursorBase
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
@@ -18,39 +17,68 @@ func _ready() -> void:
|
||||
func _process(delta: float) -> void:
|
||||
if not Referencer.players or not Referencer.main_camera:
|
||||
var mouse_pos := get_viewport().get_mouse_position()
|
||||
_base.position = mouse_pos - _base.size / 2
|
||||
_bat.visible = false
|
||||
_single_cursor.position = mouse_pos - _single_cursor.size / 2
|
||||
_single_cursor.visible = true
|
||||
return
|
||||
_bat.visible = true
|
||||
_single_cursor.visible = false
|
||||
|
||||
var player := Referencer.players[0]
|
||||
for player_index in range(Referencer.players_count):
|
||||
_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] = {
|
||||
"base": cursor_node,
|
||||
"bat": cursor_node.get_node("CursorBat"),
|
||||
"arrow": cursor_node.get_node("CursorArrow"),
|
||||
"side": 0
|
||||
}
|
||||
|
||||
|
||||
func _handle_cursor(player_index: int, delta: float) -> void:
|
||||
var player := Referencer.players[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 := Referencer.main_camera.unproject_position(cursor_pos_world)
|
||||
|
||||
var clamp_corner_min := Vector2.ZERO
|
||||
var clamp_corner_max := get_viewport().get_visible_rect().size
|
||||
if Inputer.mode == Inputer.Mode.CONTROLLER:
|
||||
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
|
||||
var cursor: Dictionary = _cursors[id]
|
||||
|
||||
cursor["base"].position = (
|
||||
cursor_pos_screen.clamp(clamp_corner_min, clamp_corner_max)
|
||||
- cursor["base"].size / 2
|
||||
)
|
||||
|
||||
_side = lerpf(
|
||||
_side,
|
||||
cursor["side"] = lerpf(
|
||||
cursor["side"] as float,
|
||||
(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)
|
||||
(
|
||||
cursor_pos_world
|
||||
+ aim_offset_normalized.rotated(Vector3.UP, cursor["side"] as float)
|
||||
)
|
||||
)
|
||||
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)
|
||||
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
|
||||
)
|
||||
|
||||
@@ -42,7 +42,7 @@ func _input(event: InputEvent) -> void:
|
||||
if event is InputEventMouseMotion:
|
||||
return
|
||||
|
||||
var event_mode := _get_event_mode(event)
|
||||
var event_mode := get_event_mode(event)
|
||||
if mode == Mode.KB_MOUSE and event_mode == Mode.CONTROLLER:
|
||||
mode = Mode.CONTROLLER
|
||||
mode_changed.emit(mode)
|
||||
@@ -69,8 +69,15 @@ func get_action_prompt(action: StringName) -> String:
|
||||
return _get_event_prompt(events[0]) if events.size() != 0 else "???"
|
||||
|
||||
|
||||
func get_event_mode(event: InputEvent) -> Mode:
|
||||
if event is InputEventJoypadButton or event is InputEventJoypadMotion:
|
||||
return Mode.CONTROLLER
|
||||
|
||||
return Mode.KB_MOUSE
|
||||
|
||||
|
||||
func _get_event_prompt_current_mode(event: InputEvent) -> String:
|
||||
var event_mode := _get_event_mode(event)
|
||||
var event_mode := get_event_mode(event)
|
||||
if mode == Mode.CONTROLLER and event_mode == Mode.CONTROLLER:
|
||||
return _get_controller_prompt(event)
|
||||
if mode == Mode.KB_MOUSE and event_mode == Mode.KB_MOUSE:
|
||||
@@ -79,7 +86,7 @@ func _get_event_prompt_current_mode(event: InputEvent) -> String:
|
||||
|
||||
|
||||
func _get_event_prompt(event: InputEvent) -> String:
|
||||
var event_mode := _get_event_mode(event)
|
||||
var event_mode := get_event_mode(event)
|
||||
if event_mode == Mode.CONTROLLER:
|
||||
return _get_controller_prompt(event)
|
||||
if event_mode == Mode.KB_MOUSE:
|
||||
@@ -176,10 +183,3 @@ func _set_current_prompts(type: ControllerType) -> void:
|
||||
_current_prompts = _prompts_steam
|
||||
ControllerType.KNOCKOFF:
|
||||
_current_prompts = _prompts_knockoff
|
||||
|
||||
|
||||
func _get_event_mode(event: InputEvent) -> Mode:
|
||||
if event is InputEventJoypadButton or event is InputEventJoypadMotion:
|
||||
return Mode.CONTROLLER
|
||||
|
||||
return Mode.KB_MOUSE
|
||||
|
||||
@@ -2,3 +2,4 @@ extends Node
|
||||
|
||||
var main_camera: Camera3D
|
||||
var players: Array[Player]
|
||||
var players_count: int = 0
|
||||
|
||||
Reference in New Issue
Block a user