Я создал небольшой прототип движения, используя 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;
}
Любая помощь с моей логикой была бы высоко оценена. Заранее спасибо.
Вот иди! Это не совсем так. В основном вы проверили, что вы перетаскивали плеер каждый раз, когда вы проверяли плитку на столкновение, поэтому, если хотя бы одна плитка, которая была проверена, не столкнулась, игрок переместился в любом случае.
Таким образом, это делает:
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;
}
Повеселись!
hasCollided()
?