Мы с другом разрабатываем головоломку сверху вниз.
Мы уже реализовали класс игрока, который может ходить и сталкиваться со стенами, но проблема заключается в самом столкновении.
Например:
Когда игрок ударяется о стену справа, мы устанавливаем скорость на x
ось быть 0, и игрок останавливается. Но после этого, если пользователь нажимает вверх клавиша, игрок перемещается на один пиксель вверх, а затем снова останавливается.
После этого, если вы продолжаете нажимать вправо и вверх поочередно, игрок проходит пиксель за пикселем стены.
И вот обнаружение столкновения игрока:
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)
Функция является частью класса игрока, и сообщите нам, если вам нужно его увидеть.
Мы будем рады, если вы отправите ответ о нашем коде или свяжетесь с нами, чтобы найти решение.
Так что спасибо за любую помощь, и, пожалуйста, задавайте вопросы, если вам нужно, Арад и Рон.
Просто догадайтесь с предоставленной информацией, но обратите внимание, что когда вы проходите сквозь стену, ваш персонаж на самом деле не направлен вправо. Он обращен вверх, поэтому collidesRight будет ложным. Вместо того, чтобы препятствовать движению в зависимости от того, в каком направлении смотрит ваш персонаж, запрещайте движение только на основании позиции, т.е.
if (intersecting_right(player, wall) && player.x_vel > 0)
player.x_vel = 0;
Других решений пока нет …