1

编辑2:问题解决了!我不能保证它会在不同的设置下工作,但是通过将我的块体密度设置为 0,当添加新块时,块堆栈不会下降。

我很抱歉这个问题的标题很糟糕,我会在这里更详细地解释我的问题:

因此,我使用 Box2D 和 cocos2D 设置了一个简单的项目,其中两个盒子堆叠在一起(我计划扩展到 8-10 个盒子)。现在,在每个盒子上使用 10.0f 的摩擦力,顶部的盒子仍然会移动一点。如果我要添加更多的盒子,“塔”就会倒塌,我不希望这样。

我希望盒子利用重力向下移动,但我从不希望它们从 x 值开始改变。那么,我怎样才能防止我的盒子塔倒塌或防止我的盒子在 x 方向上移动呢?

编辑:发布一些代码 此代码创建一个框,另一个只有一个不同的 sprite 文件。

CCSprite *block = [CCSprite spriteWithFile:@"red.png"];
block.position = ccp(200,380);
[self addChild:block];
//Body definition
b2BodyDef blockDef;
blockDef.type = b2_dynamicBody;
blockDef.position.Set(200/PTM_RATIO, 200/PTM_RATIO);
blockDef.userData = block;
b2Body *blockBody = _world->CreateBody(&blockDef);
//Create the shape
b2PolygonShape blockShape;
blockShape.SetAsBox(block.contentSize.width/PTM_RATIO/2, block.contentSize.height/PTM_RATIO/2);
//Fixture defintion
b2FixtureDef blockFixtureDef;
blockFixtureDef.shape = &blockShape;
blockFixtureDef.restitution = 0.0f;
blockFixtureDef.density = 10.0f;
blockFixtureDef.friction = 10.0f;
_redBlockFixture = blockBody->CreateFixture(&blockFixtureDef);

没有什么花哨。

问候。

4

2 回答 2

0

您可以在 box2D 的左右两侧设置 2 个(1 像素宽)墙。这是左墙的一些示例代码。要创建正确的墙,只需复制并粘贴代码并更改变量名称和 BodyDef 的位置。

// Constant you'll need to define
float wallHeight;

// Create wall body
b2BodyDef wallBodyDef;
wallBodyDef.type = b2_dynamicBody;
wallBodyDef.position.Set(200 - block.contentSize.width/PTM_RATIO/2, 0);
b2Body *wallBody = _world->CreateBody(&wallBodyDef);

// Create wall shape
b2PolygonShape wallShape;
wallShape.SetAsBox(1, wallHeight);

// Create shape definition and add to body
b2FixtureDef wallShapeDef;
wallShapeDef.shape = &wallShape;
wallShapeDef.density = 100.0f;
wallShapeDef.friction = 0.0f;
wallShapeDef.restitution = 0.0f;
b2Fixture *wallFixture = wallBody->CreateFixture(&wallShapeDef);
于 2012-09-25T21:28:22.907 回答
0

我通过调整堆叠块的静态表面的恢复(反弹)解决了这个问题。例如,如果地板的复原力为 0.2,则一叠五个积木看起来像是相互挤压,并最终倒塌: 块开始

将地板的恢复原状设置为 0,积木会按照您期望的方式堆叠: 块保持堆叠

于 2015-02-13T11:12:21.410 回答