HTML 5 платформер для обнаружения столкновений

#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