Godot 4 courses Launching in Early Access starting Jan 30
you can now pre-order
godot 4 courses
Save up to 25%

Local Multiplayer Input

beginner

By: Henrique Campos - July 25, 2020

A common mistake when coding player movement is using constants for the inputs. For instance:

export var speed := 600.0
export var direction := Vector2.ZERO

var _velocity := Vector2.ZERO

func _process(delta: float) -> void:
  update_direction()
  _velocity = direction * speed
  translate(_velocity * delta)


func update_direction() -> void:
	direction.x = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
	direction.y = Input.get_action_strength("move_down") - Input.get_action_strength("move_up")

Note that all the "move_*" checks are constants. Here the Player.gd class always reacts to the same inputs, which leads to one player controlling both players characters:

In this mini-tutorial, you’ll learn a quick fix for that.

Use variables!

Using constants means we can’t change the reference to input actions and prevents us from checking for different inputs on instances of the Player.gd class.

To solve that, we need to check for variables instead. We can export the input variables to be able to set them through the Editor.

export var move_right_action := "move_right"
export var move_left_action := "move_left"
export var move_down_action := "move_down"
export var move_up_action := "move_up"

In the update_direction() method, we check for these variables instead of constants:

func update_actor_direction() -> void:
	_actor.direction.x = Input.get_action_strength(move_right_action) - Input.get_action_strength(move_left_action)
	_actor.direction.y = Input.get_action_strength(move_down_action) - Input.get_action_strength(move_up_action)

Player 2 controls

We create the Player 2 controls in the Project > Project Settings > Input Map. In our demo project, we added the suffix 2 to differentiate them from Player 1’s actions.

Players input map

It’s important when creating an instance of the Player.tscn scene that we update the actions to Player 2’s.

Player 2 input variables

Now we have independent players characters.

Note that you can extend this approach to any number of local players. You just need to set their actions in the Input Map and match them on their characters instance. The same approach works for jump, shoot, hold, throw, and any other player action.

Made by

Our tutorials are the result of careful teamwork to ensure we produce high quality content. The following team members worked on this one:

Henrique Campos

Tutor

Johnny Goss

Tutor

Related courses

Banner image

Learn 2D Gamedev with Godot 4 $99.95

Built on the success of GDQuest’s bestselling course, this Godot 4 course uses cutting edge ed-tech to teach the fundamentals of game development over 19 modules packed with interactive exercises.

Banner image

Learn 3D Gamedev with Godot 4 $99.95

This long-awaited course adds a third dimension to the knowledge you pick up in Learn 2D Gamedev. By the end of it, you will have the skills to build your own 3D game.