Can't Move Character in Dodge the Creeps

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By wetfish

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)
:bust_in_silhouette: Reply From: kidscancode

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.

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)

wetfish | 2020-01-23 07:08

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.

kidscancode | 2020-01-23 15:12