2015-12-29 3 views
3

На основании matterjs demo Я также создал набор тел, которые живут в пределах области. Так же, как и в демо, область определяется четырьмя статическими телами, которые вместе определяют поле.Предотвращение образования тел материальных тел с предопределенной областью

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

+0

У меня было это случилось со мной тоже. У меня нет времени проверять его прямо сейчас, но как вы думаете, поможет ли стенам действительно толстая? – WhiteHotLoveTiger

+0

Нет, это не имеет значения. На самом деле это проблема во всех этих алгоритмах обнаружения столкновений. См. Мой собственный ответ на мой собственный вопрос о том, как я их решал. – koenpeters

ответ

1

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

В результате я добавил код, который знает о границах коробки и проверяет каждые 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 */ 
} 
+0

Это выглядит полезно. Благодарю. – WhiteHotLoveTiger

Смежные вопросы