我正在做一个服务器端物理实验,用户通过套接字控制一个对象。当用户将对象移动到世界边界之外时,我遇到的问题会产生。
我正在使用通过npm
.
我创建世界 500x500,然后将以下侦听器附加到它:
var boundaryListener = new b2d.b2BoundaryListener();
boundaryListener.Violation = function (body) {
//we will move this body to the opposite side
var position = body.GetWorldCenter();
//snap to opposite side
if (position.x < 0) {
position.x = worldAABB.upperBound.x + position.x;
}
if (position.y < 0) {
position.y = worldAABB.upperBound.y + position.y;
}
if (position.x > worldAABB.upperBound.x) {
position.x -= worldAABB.upperBound.x;
}
if (position.y > worldAABB.upperBound.y) {
position.y -= worldAABB.upperBound.y;
}
body.m_flags = body.m_flags & (~b2d.b2Body.e_frozenFlag); //does nothing :(
}
this.world.SetBoundaryListener(boundaryListener);
worldAABB
是世界用作边界的 b2AABB。
问题是我注意到,当触发边界侦听器时,标志设置为 22,即 allowSleep、frozen 和 island 标志。看起来当 b2Body 越过世界边界时,它会被冻结。最后一行是试图通过弄乱内部标志来解冻身体,但我有一种明显的感觉,这是错误的做法。
我怎样才能解冻身体?没有任何功能可以清除我可以看到的冻结标志(javascript 超过 10,000 行,所以老实说我还没有阅读整个内容)并且将一些物体放置为墙壁似乎没有效果(用户的对象直接穿过他们)。
我的墙是这样创建的:
//create walls
var wallShape = new b2d.b2PolygonDef();
wallShape.SetAsBox(500, 10);
wallShape.density = 0.0;
wallShape.friction = 0.3;
var bodyDef = new b2d.b2BodyDef();
bodyDef.position.Set(250, 20);
var north = this.world.CreateBody(bodyDef);
north.CreateShape(wallShape);
bodyDef = new b2d.b2BodyDef();
bodyDef.position.Set(250, 499);
var south = this.world.CreateBody(bodyDef);
south.CreateShape(wallShape);
bodyDef = new b2d.b2BodyDef();
bodyDef.position.Set(499,250);
bodyDef.angle = Math.PI / 2;
var east = this.world.CreateBody(bodyDef);
east.CreateShape(wallShape);
bodyDef = new b2d.b2BodyDef();
bodyDef.position.Set(1, 250);
bodyDef.angle = Math.PI / 2;
var west = this.world.CreateBody(bodyDef);
west.CreateShape(wallShape);
有没有人对如何解决这个问题有任何见解?除了网站指向的 flash 文档(一半时间不匹配)和 C++ 文档甚至没有谈到冻结之外,我几乎找不到关于在 javascript 中使用 Box2D 的文档。
提到这个世界没有重力并且所有物体都有一些线性和角度阻尼(它应该是一种虚拟的空间感觉)可能会有所帮助。