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

0

Я создал небольшой прототип движения, используя jQuery/HTML5 Canvas с алгоритмом карты плитки. Моя проблема заключается в том, что столкновение действует нечетно. Я объясню, если я двигаюсь влево и вправо, обнаружение столкновения и движение останавливается, если я двигаюсь вверх и вниз, то происходит. Если я двигаюсь влево и вправо (происходит столкновение), то вверх и вниз столкновение перестает быть истинным, когда я двигаюсь вверх и вниз после того, как я уже столкнулся влево и вправо.

Вот мой JSFiddle

Вот фрагмент моего обнаружения и движения

            if (keydown == UP) {
                if (!hasCollided(pX, pY - v, mX, mY)) pY -= v;
                keydown = null;
            } else if (keydown == DOWN) {
                if (!hasCollided(pX, pY + v, mX, mY)) pY += v;
                keydown = null;
            } else if (keydown == LEFT) {
                if (!hasCollided(pX - v, pY, mX, mY)) pX -= v;
                keydown = null;
            } else if (keydown == RIGHT) {
                if (!hasCollided(pX + v, pY, mX, mY)) pX += v;
                keydown = null;
            }

Любая помощь с моей логикой была бы высоко оценена. Заранее спасибо.

  • 1
    Не могли бы вы опубликовать код в hasCollided() ?
Теги:
collision
html5-canvas

1 ответ

2
Лучший ответ

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

Таким образом, это делает:

var desPosX = 0;
    var desPosY = 0;
    if (keydown == UP) {
        desPosY = -v;
    } else if (keydown == DOWN) {
        desPosY = v;
    }
    if (keydown == LEFT) {
        desPosX = -v;
    } else if (keydown == RIGHT) {
        desPosX = v;
    }
    var collided = false;
    if(!gliding)
        keydown = null;
    for (var y = minY; y < maxY; y++) {
        for (var x = minX; x < maxX; x++) {
            if (map[y][x] == 1) {
                mX = x * 32;
                mY = y * 32;
            }

            if (hasCollided(desPosX+pX, desPosY+pY, mX, mY)) {
                collided = true;
            }
        }
    }
    if (!collided) {
        pX += desPosX;
        pY += desPosY;
    }

Повеселись!

  • 0
    Спасибо, это больше, чем я искал. Очень признателен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню