基于matterjs 演示,我还创建了一组居住在一个区域内的实体。就像在演示中一样,该区域由四个静态物体定义,它们共同定义一个盒子。
当用盒子疯狂移动身体时,它们似乎以某种方式穿过墙壁逃脱。有没有办法防止这种转义形式发生?也许是另一种定义盒子的方法?
基于matterjs 演示,我还创建了一组居住在一个区域内的实体。就像在演示中一样,该区域由四个静态物体定义,它们共同定义一个盒子。
当用盒子疯狂移动身体时,它们似乎以某种方式穿过墙壁逃脱。有没有办法防止这种转义形式发生?也许是另一种定义盒子的方法?
这实际上是所有这些碰撞检测算法的问题。
我最终做的是添加知道盒子边界的代码,并每 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 */
}