0

我有一个方形屏障,它在运行时根据用户放置我的屏障的位置和旋转来定义边缘。

b2BodyDef barrierBodyDef;
barrierBodyDef.type = b2_staticBody;
barrierBodyDef.position.Set(curBarrier
                            .position.x/PTM_RATIO, curBarrier.position.y/PTM_RATIO);
barrierBodyDef.userData = curBarrier;


b2Body *barrierBody;
barrierBody = _world->CreateBody(&barrierBodyDef);

b2EdgeShape barrierEdge;
b2FixtureDef barrierShapeDef;
barrierShapeDef.shape = &barrierEdge;
barrierShapeDef.friction = 1.0f;

barrierEdge.Set(b2Vec2((x1)/PTM_RATIO, (y1)/PTM_RATIO),
                b2Vec2((x2)/PTM_RATIO, (y2)/PTM_RATIO));
barrierBody->CreateFixture(&barrierShapeDef);
barrierEdge.Set(b2Vec2((x2)/PTM_RATIO, (y2)/PTM_RATIO),
                b2Vec2((x3)/PTM_RATIO, (y3)/PTM_RATIO));
barrierBody->CreateFixture(&barrierShapeDef);
barrierEdge.Set(b2Vec2((x3)/PTM_RATIO, (y3)/PTM_RATIO),
                b2Vec2((x4)/PTM_RATIO, (y4)/PTM_RATIO));
barrierBody->CreateFixture(&barrierShapeDef);
barrierEdge.Set(b2Vec2((x4)/PTM_RATIO, (y4)/PTM_RATIO),
                b2Vec2((x1)/PTM_RATIO, (y1)/PTM_RATIO));
barrierBody->CreateFixture(&barrierShapeDef);

我现在想删除这些边缘,以便用户可以重新定位障碍。

如何去除点 x1,y1,-> x4,y4 之间的边缘,以便它们免受碰撞。

我对 Box2D 有点陌生。

4

1 回答 1

2

创建夹具时保留夹具(例如,此处为本地变量,您应该使用 ivar):

b2Fixture* barrierFixture = barrierBody->CreateFixture(&barrierShapeDef);

然后销毁夹具:

barrierBody->DestroyFixture(barrierFixture);
barrierFixture = nil;

您还可以使用 bodyGetFixtureList()来迭代固定装置。

您不能做的是从夹具中添加或删除形状,或修改形状的顶点。要从身体的形状中删除一个点,您必须破坏固定装置并用新的固定装置替换它。

没有必要重新创建整个身体,事实上这可能会出现问题,因为您可能想要保留身体的当前状态(不仅是位置,还包括线性和角速度,也许还有其他东西)。

于 2013-04-03T09:00:19.907 回答