You can use the function warp_mouse
either on Viewport (for a 3D game) or Control (on a 2D game or UI).
You can also use the function warp_mouse_position
on Input, which will work globally. Here is an example.
extends Node2D
onready var cursor = get_node("Cursor")
var mouse_pos = Vector2()
var mouse_speed = 3.0
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
func _process(delta):
var mouse_rel = Vector2.ZERO
if Input.is_action_pressed("mouse_up"):
mouse_rel += Vector2.UP * mouse_speed
if Input.is_action_pressed("mouse_down"):
mouse_rel += Vector2.DOWN * mouse_speed
if Input.is_action_pressed("mouse_left"):
mouse_rel += Vector2.LEFT * mouse_speed
if Input.is_action_pressed("mouse_right"):
mouse_rel += Vector2.RIGHT * mouse_speed
if mouse_rel != Vector2.ZERO:
Input.warp_mouse_position(mouse_pos + mouse_rel)
cursor.position = get_global_mouse_position()
func _input(event):
if event is InputEventMouseMotion:
mouse_pos = event.position
Here the node "Cursor" is a sprite of a mouse cursor, and the input mapping for "mouse_up" is the up arrow on the keyboard, "mouse_left" is the left arrow, etc.