c ++ столкновение игрока со стеной с SFML - PullRequest
0 голосов
/ 13 июня 2018

Мы с другом разрабатываем головоломку сверху вниз.
Мы уже реализовали класс игрока, который может ходить и сталкиваться со стенами, но проблема заключается в самом столкновении.

Например:
Когда игрок касается стены справа, мы устанавливаем скорость на оси x равной 0, и игрок останавливается.Но после этого, если пользователь нажимает клавишу up , игрок перемещается на один пиксель вверх, а затем снова останавливается.
После этого, если вы продолжаете нажимать вправо и вверх поочередно, игрок проходит черезстена пиксель за пикселем.

Игрок проходит сквозь стену

А вот обнаружение столкновения игрока:

for (int i = 0; i < lvl.getSizeInTiles().x; i++) {
        for (int j = 0; j < lvl.getSizeInTiles().y; j++) {
            if (lvl.getTileFromBuffer(i, j).getType() == "wall") {
                if (intersects(lvl.getTileFromBuffer(i, j).getPosition().x, lvl.getTileFromBuffer(i, j).getPosition().y, lvl.getTileFromBuffer(i, j).getSize().x, lvl.getTileFromBuffer(i, j).getSize().y)) {
                    if (faceDirection == "UP" && vel.y < 0) {
                        collidesUp = true;
                    }
                    else {
                        collidesUp = false;
                    }

                    if (faceDirection == "DOWN" && vel.y > 0) {
                        collidesDown = true;
                    }
                    else {
                        collidesDown = false;
                    }

                    if (faceDirection == "LEFT" && vel.x < 0) {
                        collidesLeft = true;
                    }
                    else {
                        collidesLeft = false;
                    }

                    if (faceDirection == "RIGHT" && vel.x > 0) {
                        collidesRight = true;
                    }
                    else {
                        collidesRight = false;
                    }
                }
            }
        }
    }
}
if (vel.x > 0 && !collidesRight) {
    pos.x += vel.x;
}
if (vel.x < 0 && !collidesLeft) {
    pos.x += vel.x;
}
if (vel.y > 0 && !collidesDown) {
    pos.y += vel.y;
}
if (vel.y < 0 && !collidesUp) {
    pos.y += vel.y;
}

Просто краткая заметка: Функция intersect(x, y, w, h) является частью класса игрока, и сообщите нам, если вам нужно ее увидеть.

Мы будем рады, если выотправьте ответ о нашем коде или свяжите нас с тем местом, где мы сможем найти решение.

Так что спасибо вам за любую помощь и, если нужно, задайте вопросы, Арад и Рон.

1 Ответ

0 голосов
/ 13 июня 2018

Всего лишь предположение с предоставленной информацией, но обратите внимание, что когда вы проходите сквозь стену, ваш персонаж на самом деле не направлен вправо.Он обращен вверх, поэтому collidesRight будет ложным.Вместо того, чтобы препятствовать движению в зависимости от того, в каком направлении смотрит ваш персонаж, запрещайте движение только в зависимости от позиции, т.е.

if (intersecting_right(player, wall) && player.x_vel > 0)
    player.x_vel = 0;
...