Compare commits

...

2 Commits

Author SHA1 Message Date
92678240ab allow for multiple players 2025-08-29 21:43:59 +10:00
d2854bfef5 fix camera position calculation 2025-08-29 21:14:26 +10:00
4 changed files with 90 additions and 6 deletions

View File

@ -14,6 +14,12 @@
[node name="Debugger" parent="." instance=ExtResource("6_lpvoh")]
[node name="Player" parent="." instance=ExtResource("2_f4ehn")]
_input_mode = 1
_device_index = 1
[node name="Player2" parent="." instance=ExtResource("2_f4ehn")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 2.09589, 0, 1.53304)
_input_mode = 1
[node name="Geometry" type="Node" parent="."]

View File

@ -25,6 +25,7 @@ func _physics_process(_delta: float) -> void:
var follow_position: Vector3 = Vector3.ZERO
for player in Player.instances:
follow_position += player.global_position
follow_position /= Player.instances.size()
follow_position += Vector3.UP * _height_offset
global_position = follow_position + transform.basis.z * _distance

View File

@ -3,13 +3,21 @@ extends CharacterBody3D
static var instances: Array[Player]
@export var _input_mode: Inputer.Mode = Inputer.Mode.KB_MOUSE
@export var _device_index: int = 0
@export_group("References")
@export var _mover: PlayerMover
static func is_single_player() -> bool:
return instances.size() <= 1
func _ready() -> void:
instances.append(self)
func _exit_tree() -> void:
instances.erase(self)
@ -17,3 +25,22 @@ func _exit_tree() -> void:
func _physics_process(delta: float) -> void:
velocity = _mover.handle_movement(velocity, delta, is_on_floor(), true)
move_and_slide()
func _unhandled_input(event: InputEvent) -> void:
var mode := Inputer.get_event_mode(event)
if (
not input_mode_is(mode)
or (
not is_single_player()
and _input_mode == Inputer.Mode.CONTROLLER
and event.device != _device_index
)
):
return
_mover.handle_input(event, mode)
func input_mode_is(mode: Inputer.Mode) -> bool:
return is_single_player() or _input_mode == mode

View File

@ -9,6 +9,46 @@ extends Node
@export var fall_speed: float = 20
@export var fall_acceleration: float = 25
var _move_left: float
var _move_right: float
var _move_up: float
var _move_down: float
func handle_input(event: InputEvent, mode: Inputer.Mode) -> void:
if Player.is_single_player():
return
if mode == Inputer.Mode.KB_MOUSE and event is InputEventKey:
var key_event := event as InputEventKey
if key_event.is_action_pressed("move_left"):
_move_left = 1
elif key_event.is_action_released("move_left"):
_move_left = 0
if key_event.is_action_pressed("move_right"):
_move_right = 1
elif key_event.is_action_released("move_right"):
_move_right = 0
if key_event.is_action_pressed("move_up"):
_move_up = 1
elif key_event.is_action_released("move_up"):
_move_up = 0
if key_event.is_action_pressed("move_down"):
_move_down = 1
elif key_event.is_action_released("move_down"):
_move_down = 0
if mode == Inputer.Mode.CONTROLLER and event is InputEventJoypadMotion:
var motion_event := event as InputEventJoypadMotion
if motion_event.is_action("move_left"):
_move_left = motion_event.get_action_strength("move_left")
if motion_event.is_action("move_right"):
_move_right = motion_event.get_action_strength("move_right")
if motion_event.is_action("move_up"):
_move_up = motion_event.get_action_strength("move_up")
if motion_event.is_action("move_down"):
_move_down = motion_event.get_action_strength("move_down")
func handle_movement(
velocity: Vector3, delta: float, is_on_floor: bool, can_move: bool
@ -20,12 +60,22 @@ func handle_movement(
func _lateral_movement(velocity: Vector3, delta: float, can_move: bool) -> Vector3:
var move_input := Input.get_vector(
"move_left",
"move_right",
"move_up",
"move_down",
Settings.movement_stick_deadzone
var move_input := (
Input.get_vector(
"move_left",
"move_right",
"move_up",
"move_down",
Settings.movement_stick_deadzone
)
if Player.is_single_player()
else Inputer.get_vector_from_raw_strengths(
_move_left,
_move_right,
_move_up,
_move_down,
Settings.movement_stick_deadzone
)
)
if move_input.length() > 0 and can_move: