0 votes

Just like the title says. I can't get my character to move in the Dodge the Creeps tutorial.

My code doesn't have any errors, and I've re-typed everything 4 or 5 times and still haven't been able to make it work.

Could someone help me? Thanks so much

extends Area2D

export var speed = 400  # How fast the player will move (pixels/sec).
var screen_size  # Size of the game window.

func _ready():
    screen_size = get_viewport_rect().size

func _process(delta):
    var velocity = Vector2()
    if Input.is_action_pressed("ui_right"):
        velocity.x +=1
    if Input.is_action_pressed("ui_left"):
        velocity.x -=1
    if Input.is_action_pressed("ui_up"):
        velocity.y +=1
    if Input.is_action_pressed("ui_down"):
        velocity.y -=1
    else:
        $AnimatedSprite.stop()
    position += velocity * delta
    position.x = clamp(position.x, 0, screen_size.x)
    position.y = clamp(position.y, 0, screen_size.y)
asked Jan 23 in Projects by wetfish (12 points)

1 Answer

0 votes

If you compare your code with the code in this section of the tutorial:
https://docs.godotengine.org/en/latest/getting_started/step_by_step/your_first_game.html#moving-the-player

You'll see that you've skipped a few lines. Specifically, after checking the four input directions, you should have

if velocity.length() > 0:
    velocity = velocity.normalized() * speed
    $AnimatedSprite.play()
else:
    $AnimatedSprite.stop()

It's the lack of that second line (normalizing the input and multiplying by speed) that's leading to a lack of movement - or to be more accurate, such slow movement that it's unnoticeable.

answered Jan 23 by kidscancode (17,702 points)

Good catch. I inserted that (in fact, I re-typed everything from scratch), but it's still not moving.

My full code now looks like this:

extends Area2D

    export var speed = 400 #speed
    var screen_size #size of window

    func _ready():
        screen_size = get_viewport_rect().size

    func _process(delta):
        var velocity = Vector2() #movement vector
        if Input.is_action_pressed ("ui.right"):
            velocity.x += 1
        if Input.is_action_pressed ("ui.left"):
            velocity.x -= 1
        if Input.is_action_pressed ("ui.down"):
            velocity.y += 1
        if Input.is_action_pressed ("ui.up"):
            velocity.y -= 1
        if velocity.length() > 0:
            velocity = velocity.normalized() * speed 
            $AnimatedSprite.play ()
        else:
            $AnimatedSprite.stop ()

        position += velocity * delta
        position.x = clamp(position.x, 0, screen_size.x)
        position.y = clamp(position.y, 0, screen_size.y)

Well, now you've changed the names of the input actions to have . in them, which doesn't work. The built-in input action names are "ui_left", etc.

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.