From 9eb34cbfb35726e8032606246e9751e4d18c5c10 Mon Sep 17 00:00:00 2001 From: teatov Date: Thu, 27 Feb 2025 21:56:37 +1000 Subject: [PATCH] make multiplayer input consider devices --- scenes/test.tscn | 1 - scripts/globals/inputer.gd | 19 +++++++++++++++++++ scripts/main_camera.gd | 10 ++++------ scripts/player/player.gd | 5 ++++- scripts/player/player_aiming.gd | 28 +++++++++++++++++++++++++++- scripts/player/player_movement.gd | 18 +----------------- 6 files changed, 55 insertions(+), 26 deletions(-) diff --git a/scenes/test.tscn b/scenes/test.tscn index 476fc53..7042442 100644 --- a/scenes/test.tscn +++ b/scenes/test.tscn @@ -18,7 +18,6 @@ process_physics_priority = -1 [node name="Player2" parent="." instance=ExtResource("2_f4ehn")] process_priority = -1 process_physics_priority = -1 -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.08931, 4.76837e-07, 1.5065) _input_mode = 1 [node name="Geometry" type="Node" parent="."] diff --git a/scripts/globals/inputer.gd b/scripts/globals/inputer.gd index e009cc9..2391d56 100644 --- a/scripts/globals/inputer.gd +++ b/scripts/globals/inputer.gd @@ -69,6 +69,25 @@ func get_action_prompt(action: StringName) -> String: return _get_event_prompt(events[0]) if events.size() != 0 else "???" +func get_vector_from_raw_strengths( + negative_x: float, + positive_x: float, + negative_y: float, + positive_y: float, + deadzone := 0.5 +) -> Vector2: + var vector := Vector2(positive_x - negative_x, positive_y - negative_y) + + var length := vector.length() + + if length <= deadzone: + return Vector2.ZERO + if length > 1.0: + return vector.normalized() + + return vector * inverse_lerp(deadzone, 1.0, length) / length + + func get_event_mode(event: InputEvent) -> Mode: if event is InputEventJoypadButton or event is InputEventJoypadMotion: return Mode.CONTROLLER diff --git a/scripts/main_camera.gd b/scripts/main_camera.gd index fa47542..214b5a8 100644 --- a/scripts/main_camera.gd +++ b/scripts/main_camera.gd @@ -39,11 +39,11 @@ func _follow(player: Player, delta: float) -> Vector3: player_offset["floor_height"] = player_position.y player_position.y = player_offset["floor_height"] + Projectile.HEIGHT - if player.input_mode_is(Inputer.Mode.KB_MOUSE): + if Referencer.players_count > 1: + player_offset["aim_offset"] = Vector3.ZERO + elif player.input_mode_is(Inputer.Mode.KB_MOUSE): player_offset["aim_offset"] = player.aiming.aim_offset - elif ( - player.input_mode_is(Inputer.Mode.CONTROLLER) and Referencer.players_count == 1 - ): + elif player.input_mode_is(Inputer.Mode.CONTROLLER): var new_aim_offset := ( Vector3.ZERO if player.aiming.aim_input.length() == 0 @@ -52,8 +52,6 @@ func _follow(player: Player, delta: float) -> Vector3: player_offset["aim_offset"] = player_offset["aim_offset"].lerp( new_aim_offset, _aim_damping * delta ) - else: - player_offset["aim_offset"] = Vector3.ZERO var follow_position := ( player_position diff --git a/scripts/player/player.gd b/scripts/player/player.gd index 31ef4b4..654b92b 100644 --- a/scripts/player/player.gd +++ b/scripts/player/player.gd @@ -44,7 +44,10 @@ func _physics_process(delta: float) -> void: func _unhandled_input(event: InputEvent) -> void: var mode := Inputer.get_event_mode(event) - if not input_mode_is(mode): + if ( + not input_mode_is(mode) + or (_input_mode == Inputer.Mode.CONTROLLER and event.device != _device_index) + ): return movement.handle_input(event, mode) diff --git a/scripts/player/player_aiming.gd b/scripts/player/player_aiming.gd index 47dbd9a..32134f8 100644 --- a/scripts/player/player_aiming.gd +++ b/scripts/player/player_aiming.gd @@ -9,9 +9,35 @@ var aim_input: Vector2 var _floor_height: float +var _aim_left: float +var _aim_right: float +var _aim_up: float +var _aim_down: float + + +func handle_input(event: InputEvent, mode: Inputer.Mode) -> void: + if Referencer.players_count == 1: + return + + if mode == Inputer.Mode.CONTROLLER and event is InputEventJoypadMotion: + var motion_event := event as InputEventJoypadMotion + if motion_event.is_action("aim_left"): + _aim_left = motion_event.get_action_strength("aim_left") + if motion_event.is_action("aim_right"): + _aim_right = motion_event.get_action_strength("aim_right") + if motion_event.is_action("aim_up"): + _aim_up = motion_event.get_action_strength("aim_up") + if motion_event.is_action("aim_down"): + _aim_down = motion_event.get_action_strength("aim_down") + func controller_aiming(move_input: Vector2) -> void: - aim_input = Input.get_vector("aim_left", "aim_right", "aim_up", "aim_down") + if Referencer.players_count == 1: + aim_input = Input.get_vector("aim_left", "aim_right", "aim_up", "aim_down") + else: + aim_input = Inputer.get_vector_from_raw_strengths( + _aim_left, _aim_right, _aim_up, _aim_down + ) if aim_input.length() == 0 and move_input.length() == 0: return diff --git a/scripts/player/player_movement.gd b/scripts/player/player_movement.gd index b8a1db4..e654109 100644 --- a/scripts/player/player_movement.gd +++ b/scripts/player/player_movement.gd @@ -66,7 +66,7 @@ func _lateral_movement(velocity: Vector3, delta: float, can_move: bool) -> Vecto if Referencer.players_count == 1: move_input = Input.get_vector("move_left", "move_right", "move_up", "move_down") else: - move_input = _get_vector_from_raw_strengths( + move_input = Inputer.get_vector_from_raw_strengths( _move_left, _move_right, _move_up, _move_down ) Debugger.text("move_input" + str(get_instance_id()), move_input) @@ -97,20 +97,4 @@ func _vertical_movement(velocity: Vector3, delta: float, is_on_floor: bool) -> V return velocity -func _get_vector_from_raw_strengths( - negative_x: float, - positive_x: float, - negative_y: float, - positive_y: float, - deadzone := 0.5 -) -> Vector2: - var vector := Vector2(positive_x - negative_x, positive_y - negative_y) - var length := vector.length() - - if length <= deadzone: - return Vector2.ZERO - if length > 1.0: - return vector.normalized() - - return vector * inverse_lerp(deadzone, 1.0, length) / length