#html #game-physics
#HTML #игра-физика
Вопрос:
Я работаю над платформенной игрой, и у меня возникают проблемы с некоторым обнаружением столкновений. Игра состоит из множества блоков, расположенных рядом друг с другом или на расстоянии друг от друга, так что игрок перепрыгивает с одного блока на следующий. Прямо сейчас игрок может запрыгивать на верхние блоки, врезаться в боковые блоки и останавливаться, если прыгать в нижнюю часть блоков. Проблемы, с которыми я сталкиваюсь прямо сейчас, заключаются в том, что если я попадаю в редкий сценарий, когда игрок падает поверх определенной части блока, игра распознает его как сторону блока для блока рядом с ним, и игрок проваливается сквозь блок. Итак, если я прыгаю на самый край блоков [3], а блоки [4] находятся прямо рядом с ним, игра распознает, что игрок прыгнул в сторону блоков [4]. Есть идеи, как я могу это исправить? Ниже приведен код для моего обнаружения столкновений.
function checkBlockCollisions() {
// If a player collides with a block, their motion should be stopped.
for(var i = 0; i < blocks.length; i ) {
var angle = blocks[i].angleTo(player);
var thisTop = blocks[i].y - blocks[i].height / 2;
var thisBottom = blocks[i].y blocks[i].height / 2;
var playerTop = player.y - player.height / 2;
var playerBottom = player.y player.height / 2;
if(blocks[i].collidesWith(player)) {
if((angle >= 55 amp;amp; angle <= 360) amp;amp; player.falling) {
// If the player is above the block, then they should stop falling.
player.falling = false;
player.onBlock = true;
player.setDY(0);
// Make sure the player is not inside the block.
player.setPosition(player.x, thisTop - player.height / 2);
}
//top of block is lower than the middle of the player to the top and bottom of block is higher than the middle of the player to the bottom
if(thisTop > (player.y - player.height / 2) amp;amp; thisBottom < (player.y (player.height / 2 ))) {
// If the player runs into the side of a block, only stop the sideways motion.
player.setPosition(player.x - player.dx, player.y);
player.setDX(0);
} // end if
else if(player.falling) {
// If the player is below the block, then they should keep falling but stop accelerating upwards and sideways.
player.setDY(0);
player.setDX(0);
player.setPosition(player.x, thisBottom player.height / 2 1);
} // end if
} // end if
} // end for
} // end checkBlockCollisions
Комментарии:
1. Этот вопрос часто задают. Обнаружение столкновений СЛОЖНО. Если вам удастся устранить эту маленькую ошибку, вы обнаружите другую, а затем еще одну, и ваш движок всегда будет в состоянии, которое «работает в 99% случаев! единственная ошибка tiiiiny, когда $stuff тогда происходит $ weirdstuff «. ИМХО единственный выход — использовать библиотеку… переходите на box2d
Ответ №1:
Посмотрите на мой движок, это движок, написанный полностью для столкновений и очень простой в использовании: https://github.com/Murplyx/AAE—Axis-Aligned-Engine