【问题标题】:Drawing custom polygons in Box2D在 Box2D 中绘制自定义多边形
【发布时间】:2011-04-14 16:07:39
【问题描述】:

我正在制作一个 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 类,但我没有进行任何联系人过滤(除非有可能在没有意识到的情况下这样做)。

我使用的是 Box2D 2.1a 的 Flash 9 版本。

有什么建议吗?我错过了一些明显的东西还是我(上帝保佑!)发现了一个错误?感谢您的帮助!

安德烈

【问题讨论】:

    标签: flash actionscript box2d polygons


    【解决方案1】:

    你好安德烈,

    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);
    

    我不太擅长解释事情,但我希望这会有所帮助! -零

    【讨论】:

    • 嘿零,我今天早些时候发现了问题,但由于 24 小时的等待而无法发布。在任何情况下,你几乎都做到了。原来我的问题是以逆时针顺序列出顶点。我试着顺时针输入它们,它奏效了!所有手册都说它是 CCW,但他们也说:“CCW 是相对于右手坐标系,z 轴指向平面外。这可能会在您的屏幕上显示为顺时针方向,具体取决于您的坐标系公约。”有人可以解释一下吗? -安德烈
    【解决方案2】:

    再次嘿嘿, 由于 Box2D 的大多数版本是由不同的人编写的,因此源代码发生了变化,为了更好地适应编程语言,您正在查看的文档可能引用了另一种语言,然后 AS3 很可能是 C++。

    您的源代码应该带有一个包含该版本文档的文件夹,应该是一个名为“Docs”的文件夹。

    【讨论】:

    • 刚刚在网上和我正在使用的下载库中查看了 C++ 和 AS3 的手册。我认为在线 AS3 中有一些不准确之处,但 C++ 是最新的。我想我会尝试在 Box2D 论坛上询问,他们会知道的。谢谢你的帮助! -安德烈
    猜你喜欢
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2016-09-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多