사용자가 소켓을 통해 객체를 제어하는 서버 측 물리 실험을하고 있습니다. 사용자가 세계 경계 밖으로 개체를 이동할 때 내가 실행중인 문제가 발생합니다.Box2Djs에서 몸체를 고정 해제하거나 나가는 것을 막으십시오.
npm
을 통해 설치된 Box2Djs를 사용하고 있습니다.
나는 세계 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입니다.
문제는 경계 수신기가 실행될 때 플래그가 allowSleep, 고정 및 아일랜드 플래그 인 22로 설정되었음을 알아 챘습니다. 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);
사람이이 문제를 해결하는 방법에 대한 통찰력을 가지고 있습니까? JavaScript가 Box2D를 사용하여 찾을 수있는 문서는 거의 없지만 웹 사이트가 가리키는 플래시 문서 (절반은 시간과 일치하지 않음)와 동결에 대해 말하지 않는 C++ 설명서가 있습니다.
세계에는 중력이없고 모든 물체에는 선형 및 각진 감쇠 (psuedo-in-space 느낌)가 있다고 언급하는 것이 도움이 될 것입니다.
왜이 플래그에 관심이 있습니까? 잘못된 시뮬레이션 또는 스턴스가 있습니까? – Pavel
그것은 시체가 움직이는 것을 멈추게하고 나는 다시 움직이는 것을 멈추게 할 수 없으며 그것이 의미있는 유일한 깃발입니다. 경계 청취자는 움직일 수 있도록 반대쪽으로 스냅하려고했습니다. –