0 votes


Sorry for silly question (this is my first 4 hrs with Godot).

I'm unable to access set_pos method from Node2D object

Error message:
Invalid call. Nonexistent function 'set_pos' in base 'CanvasLayer'.


extends KinematicBody2D

var motion = Vector2(0, 0)
const SPEED = 1000
const GRAVITY = 300
const UP = Vector2(0, -1)
const JUMP_SPEED = 4000
const WORLD_LIMIT = 8000

signal animate

func _ready():

func _physics_process(delta):
    move_and_slide(motion, UP)

func touch_controls():
    #   get_node("Camera2D/LeftCanvas").position = $Camera2D.get_camera_position()
#   $Camera2D.get_camera_position()
    var viewport = get_node("/root").get_children()[0].get_viewport_rect().size
    var viewport_res = get_node("/root").get_children()[0].get_viewport_rect().size
    var viewport_scale = 600/viewport.y

    $Camera2D/LeftCanvas/LeftControls.set_pos(Vector2(0, 500))

func animate():
    emit_signal("animate", motion)

func apply_gravity():
    if position.y > WORLD_LIMIT:
    if is_on_floor():
        motion.y = 0
    elif is_on_ceiling():
        motion.y = 2
        motion.y += GRAVITY

func end_game():

func jump():
    if Input.is_action_pressed("Jump") and is_on_floor():
        motion.y -= JUMP_SPEED

func move():
    if Input.is_action_pressed("Right") and not Input.is_action_pressed("Left"):
        motion.x = SPEED
    elif Input.is_action_pressed("Left") and not Input.is_action_pressed("Right"):
        motion.x = -SPEED
        motion.x = 0
in Engine by (14 points)

1 Answer

0 votes

You have a couple of problems here:

  • There is no method called set_pos() in Godot - not since Godot 3.0 was released. Names were changed: pos to position, rot to rotation, etc. I suspect you may be looking a very old tutorial.

  • You're trying to set a position on a CanvasLayer. CanvasLayer objects don't have a position. https://docs.godotengine.org/en/latest/classes/class_canvaslayer.html

  • You're not using move_and_slide() correctly. In order for is_on_floor() to work properly, you must apply constant gravity, not remove it when on the ground. move_and_slide() returns a modified velocity vector for just this reason.

Since you're new to Godot, I highly recommend you look at the official docs. The best place to start is here:


And there is information about using kinematic bodies here:

by (19,651 points)
Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to webmaster@godotengine.org with your username.