我正在制作Flash游戏,在尝试在Box2D中绘制多边形时,我遇到了一个非常奇怪的问题。
这是我使用的代码:
var fixtureDefs:Array = new Array();
...
var fDef:b2FixtureDef = new b2FixtureDef();
fDef.density = 0;
fDef.shape = new b2PolygonShape();
b2PolygonShape(fDef.shape).SetAsArray(vertexArray);
fixtureDefs.push(fDef);
//This gets repeated several times, so that at the end you get a body consisting of several convex shapes.
...
var bD:b2BodyDef = new b2BodyDef();
bD.type = b2Body.b2_staticBody;
bD.position.Set(300/Constants.RATIO,200/Constants.RATIO);
var body:b2Body = Constants.world.CreateBody(bD);
...
for each(var fD:b2FixtureDef in fixtureDefs) {
body.CreateFixture(fD);
}
其中vertexArray是一个包含4个b2Vec2顶点的有效数组,构成凸形。
问题是,当我测试时,碰撞不适合那个身体。大多数其他物体 - 敌人,用户控制的角色 - 直接通过,好像身体根本不存在。一些光线投射也通过。
令人生气的是,我所拥有的一种身体(一个自定义的敌人)以某种方式检测到身体并与之发生碰撞。特定类型的敌人尝试做工作的光线投射 - 当你的角色隐藏在多边形后面时,就像他们看不到他一样。
另一个奇怪的事情是:当我尝试使用相同的代码时,只使用SetAsBox而不是SetAsArray,它的工作原理完全正确。
我正在使用自定义的ContactListener类,但我没有进行任何联系过滤(除非有可能在没有意识到的情况下这样做)。
我使用的是Box 9D 2.1a的Flash 9版本。
有什么建议吗?我错过了一些明显的东西,或者我(上帝保佑!)发现了一个错误?谢谢你的帮助!
安德烈
答案 0 :(得分:3)
Heyo Andrey,
2.1a更严格,因此您必须声明几乎所有内容才能正常工作。
AS3 OOP -
private var body:b2Body;
private var bodyDef:b2BodyDef = new b2BodyDef();
private var bodyPoly:b2PolygonShape = new b2PolygonShape();
private var bodyFix:b2FixtureDef = new b2FixtureDef();
private var vertexArray:Array = new Array();
public function Example()
{
//Setting up Vertices in an Array
var ver1:b2Vec2 = new b2Vec2( -1, -1);
var ver2:b2Vec2 = new b2Vec2( 1, -1);
var ver3:b2Vec2 = new b2Vec2( 1, 1);
var ver4:b2Vec2 = new b2Vec2( -1, 1);
//Push in order
vertexArray.push(ver1, ver2, ver3, ver4);
bodyDef.type = b2Body.b2_dynamicBody;
//b2Vec2 Array then Vertex Count
bodyPoly.SetAsArray(vertexArray, vertexArray.length);
bodyFix.shape = bodyPoly;
bodyFix.density = 0.5;
bodyFix.friction = 0.5;
bodyFix.restitution = 0.5;
bodyDef.position.Set(0, 0);
body = m_world.CreateBody(bodyDef);
body.CreateFixture(bodyFix);
}
请记住,每个点必须位于之前的那个点的右边。
var ver1:b2Vec2 = new b2Vec2( -1, -1);//Top Left
var ver2:b2Vec2 = new b2Vec2( 1, -1);//Top Right
var ver3:b2Vec2 = new b2Vec2( 1, 1);//Bottom Right
var ver4:b2Vec2 = new b2Vec2( -1, 1);//Bottom Left
从左到右放置
vertexArray.push(ver1, ver2, ver3, ver4);
我不太擅长解释事情,但我希望这有帮助! -Zero
答案 1 :(得分:0)
Heyo, 由于Box2D的大部分版本都是由不同的人编写的,因此源代码更改,为了更好地适应编程语言,您所看到的文档可能会引用不同的语言,而AS3很可能是C ++。
您的来源应附带一个文件夹,其中包含该版本的文档,应该是名为“文档”的文件夹。