1

編集 2: 問題が解決しました! 異なる設定で動作するとは約束できませんが、ブロックのボディ密度を 0 にすることで、新しいブロックが追加されたときにブロックのスタックが落ちなくなりました。

質問のタイトルが悪くて申し訳ありません。ここで問題を詳しく説明します。

そこで、Box2D と cocos2D を使用して、2 つのボックスを積み重ねる単純なプロジェクトをセットアップしました (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);

派手なものはありません。

よろしく。

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 の場合、5 つのブロックのスタックは互いに圧縮されているように見え、最終的には倒れます。 ブロックが始まります

床の復元を 0 に設定すると、ブロックは期待どおりに積み上げられたままになります。 ブロックは積み重ねたまま

于 2015-02-13T11:12:21.410 に答える