Cocos2D + Box2D:不会掉落的堆叠体?

时间:2012-08-24 22:19:39

标签: cocos2d-iphone box2d-iphone

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

我很抱歉这个问题很糟糕,我会在这里解释我的问题:

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

我希望盒子能够使用重力向下移动,但我从未希望它们改变那里的开始x值。 那么,我怎么能防止我的盒子翻倒或阻止我的盒子向x方向移动?

编辑:发布一些代码 这个代码在框中创建,另一个只有一个不同的精灵文件。

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

没什么特别的。

问候。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

我通过调整堆叠块的静态表面的恢复(弹跳)来解决这个问题。例如,如果地板具有.2的恢复,则五个块的堆栈看起来就像是相互压缩,并最终推翻: blocks start to "compress" and then topple

将地板的恢复原状设置为0,并且块保持堆叠的方式符合您的预期: blocks stay stacked