Предотвращение образования тел материи вне предопределенной области
На основе демонстрации Математики я также создал набор тел, которые живут в пределах области. Как и в демонстрации, область определяется четырьмя статическими телами, которые вместе определяют прямоугольник.
Когда дико двигаются тела с коробкой, они как-то убегают, проходя сквозь стены. Есть ли способ предотвратить эту экранирующую форму? Может быть, альтернативный способ определения коробки?
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 */
}