Предотвращение образования тел материи вне предопределенной области

На основе демонстрации Математики я также создал набор тел, которые живут в пределах области. Как и в демонстрации, область определяется четырьмя статическими телами, которые вместе определяют прямоугольник.

Когда дико двигаются тела с коробкой, они как-то убегают, проходя сквозь стены. Есть ли способ предотвратить эту экранирующую форму? Может быть, альтернативный способ определения коробки?

1 ответ

Решение

Это на самом деле проблема со всеми этими алгоритмами обнаружения столкновений.

В итоге я добавил код, который знает о границах блока и проверяет каждые 300 мсек, находится ли какой-либо из тел вне его. Если это так, он использует Matter.Body.translate, чтобы вернуть их обратно в коробку.

Обратите внимание, что в этом коде используется не игровой цикл, а события для запуска его механизма проверки. Было бы лучше сделать это с помощью игрового цикла Математика (запускать поиск каждые так много тиков), но я не осознавал этого в то время.

Это код, который я использовал в конечном итоге (в моем случае поле размером с сам холст):

/* `allBodies` is a variable that contains all the bodies that can
 * escape. Use something like `Composite.allBodies(world)` to get 
 * them all but beware to not include the box's borders which are
 * also bodies.
 * `startCoordinates` is an object that contains the x and y
 * coordinate of the place on the canvas where we should move escaped
 * bodies to.
 */
function initEscapedBodiesRetrieval(allBodies, startCoordinates) {

    function hasBodyEscaped(body) {
        var x = body.position.x;
        var y = body.position.y;

        return x < 0 || x > _canvasWidth || y < 0 || y > _canvasHeight;
    }

    setInterval(function() {
        var i, body;

        for (i = 0; i < allBodies.length; i++) {
            body = allBodies[i];
            if (hasBodyEscaped(body)) {
                Matter.Body.translate(body, { x: (startCoordinates.x - body.position.x), y: (startCoordinates.y - body.position.y) });
            }
        }
    }, 300); /* We do this every 300 msecs */ 
}
Другие вопросы по тегам