0 votes

Hello,

I'm relatively new to Godot, and had a question about top-down collision. I'm using CollisionBody2D for walls, and I'm trying to get them to collide with the player, but it's not working.

player.gd:

    extends KinematicBody2D
signal WallCollide


export var speed = 400 # movement speed
var screen_size 

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

func _process(delta):
    var velocity = Vector2.ZERO # The player's movement vector.
    if Input.is_action_pressed("move_right"):
        velocity.x += 1
    if Input.is_action_pressed("move_left"):
        velocity.x -= 1
    if Input.is_action_pressed("move_down"):
        velocity.y += 1
    if Input.is_action_pressed("move_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)
    if velocity.x != 0:
        $AnimatedSprite.animation = "right"
        $AnimatedSprite.flip_v = false
        # See the note below about boolean assignment.
        $AnimatedSprite.flip_h = velocity.x < 0
    elif velocity.y != 0:
        $AnimatedSprite.animation = "up"
        $AnimatedSprite.flip_v = velocity.y > 0

func _on_Player_body_entered(body):
    if body.class == "wall":
        emit_signal("WallCollide")


func _on_Player_WallCollide():
    speed = 0
    #only this strange b/c i needed something *really* drastic to make sure it worked
Godot version v3.4.4.stable.official.419e713a2
in Engine by (15 points)

1 Answer

+1 vote
Best answer

I think you might be better off with collision shape
Instead of collision body. If youre using a tilemap, there are loads of tutorials on youtube about collisions with tilemaps. Just search: "How to set up collisions with tilemaps"

by (99 points)
selected by

I actually am using CollisionShape2D already, it turns out. I didn't actually know tilemap was a thing, using it now and it works.

glad to hear that!

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 Frequently asked questions and 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 [email protected] with your username.