This video will teach you how to handle input in Godot 3 including keyboard, mouse, and joystick/gamepad devices. We will look at handling input via both polling and event driven, as well as creating an input map to handle input actions in a generic manner.
The Video
Assets and Code Samples
PolledInput
extends Sprite2D
#This example shows input polling, both keyboard and mouse
func _process(delta):
#Handle arrow key presses
if(Input.is_key_pressed(KEY_LEFT)):
self.position.x-= 1
if(Input.is_key_pressed(KEY_RIGHT)):
self.position.x+= 1
if(Input.is_key_pressed(KEY_UP)):
if(Input.is_key_pressed(KEY_SHIFT)):
self.position.y-= 10
else:
self.position.y-= 1
#Holding SHIFT moves by 10x up and down
if(Input.is_key_pressed(KEY_DOWN)):
if(Input.is_key_pressed(KEY_SHIFT)):
self.position.y+= 10
else:
self.position.y+= 1
#Quit on Q press
if(Input.is_key_pressed(KEY_Q)):
get_tree().quit()
#Check for mouse movement
if(Input.is_mouse_button_pressed(BUTTON_LEFT)):
self.position = get_viewport().get_mouse_position()
EventDriven
extends Sprite
var justwarped = false
func _input(event):
if event is InputEventMouseMotion:
if !justwarped:
self.translate(event.relative)
else:
justwarped = false
if event is InputEventMouseButton:
match event.button_index:
BUTTON_LEFT:
Input.warp_mouse_position(self.position)
justwarped = true
BUTTON_RIGHT:
self.position = Vector2(get_viewport().size.x/2, get_viewport().size.y/2)
if (event is InputEventKey):
print("Key pressed: " + char(event.scancode))
if(event.echo == true):
print("Key held down")
else:
print("First press")
Gamepad
extends Sprite
var startingPos = Vector2(self.position)
# Dead zone is the area around the center of the control when it is at rest
var deadZone = 0.2
# Speed Multiplier is what you would use to implement a sensitivity setting. Higher == more movement per press
var speedMultiplier = 3
func _ready():
# Register event to monitor if joystick connected or disconnected
Input.connect("joy_connection_changed",self,"joy_con_changed")
func _process(delta):
#Make sure at least one Joystick is connected
if Input.get_connected_joypads().size() > 0:
var xAxis = Input.get_joy_axis(0,JOY_AXIS_7)
if abs(xAxis) > deadZone:
# xAxis is a value from +/0 0-1 depending on how hard the stick is being pressed
if xAxis < 0:
self.position.x-= 100 * delta * ( speedMultiplier * abs(xAxis))
if xAxis > 0:
self.position.x+= 100 * delta * ( speedMultiplier * abs(xAxis))
if Input.is_joy_button_pressed(0,JOY_BUTTON_0): # Same as JOY_XBOX_A
self.position = startingPos
# Buttons have different meanings on different devices
# Let's loop through and see what they are defined as
for i in range(16):
if Input.is_joy_button_pressed(0,i):
print("Button at " + str(i) + " pressed, should be button: " + Input.get_joy_button_string(i))
#
if Input.is_joy_button_pressed(0,JOY_DPAD_UP):
position.y -= 10
func joy_con_changed(deviceid,isConnected):
if isConnected:
print("Joystick " + str(deviceid) + " connected")
if Input.is_joy_known(0):
print("Recognized and compatible joystick")
print(Input.get_joy_name(0) + " device connected")
else:
print("Joystick " + str(deviceid) + " disconnected")
Vibrate (Missed in video… sorry)
extends Node
func _process(delta):
if Input.is_joy_button_pressed(0,JOY_BUTTON_0):
# Full weak and strong motor vibrate, vibrate 2 second
Input.start_joy_vibration(0,1.0,1.0,2)
if Input.is_joy_button_pressed(0,JOY_BUTTON_1):
# Half strength both motors
Input.start_joy_vibration(0,0.5,0.5,2)
if Input.is_joy_button_pressed(0,JOY_BUTTON_2):
# Full strength strong motor, nothing to weak
Input.start_joy_vibration(0,0.0,1.0,2)
if Input.is_joy_button_pressed(0,JOY_BUTTON_3):
# Full strength weak, none to strong
Input.start_joy_vibration(0,1.0,0.0,2)
# Now output whats currently happening in vibration land
print("Duration " + str(Input.get_joy_vibration_duration(0)))
print("Strength weak " + str(Input.get_joy_vibration_strength(0).x))
print("Strength strong " + str(Input.get_joy_vibration_strength(0).y))
InputMap
extends Sprite
func _input(event):
if(event.is_action("LEFT")):
self.position.x-= 1
if(event.is_action("RIGHT")):
self.position.x+= 1
if(event.is_action_pressed("UP")):
self.position.y-= 1
if(event.is_action_released("DOWN")):
self.position.y+= 1
