Это на самом деле проблема со всеми этими алгоритмами обнаружения столкновений.
В результате я добавил код, который знает о границах коробки и проверяет каждые 300 мсек, если какое-либо из тел находится за его пределами. Если это так, он использует Matter.Body.translate, чтобы вернуть их обратно в поле.
Обратите внимание, что этот код не использует игровой цикл, а скорее события для его триггера запуска механизма проверки. Было бы лучше сделать это, используя игровой цикл matterjs (запустить поиск по так много тиков), но я не понимал, что в то время.
Это код, который я закончил с использованием (в моем случае коробка такая же большая, как и сам холст):
/* `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 */
}
У меня было это случилось со мной тоже. У меня нет времени проверять его прямо сейчас, но как вы думаете, поможет ли стенам действительно толстая? – WhiteHotLoveTiger
Нет, это не имеет значения. На самом деле это проблема во всех этих алгоритмах обнаружения столкновений. См. Мой собственный ответ на мой собственный вопрос о том, как я их решал. – koenpeters