私は基本的に矩形のオブジェクト(槍のようなもの)を持っていて、私は地面を持っています。問題は、槍が地面に当たったときにそれが跳ね返ってこないということです。ここに私の物理学のセットアップ:私はしばらくcocos2dを使用していないBox2D動体が画面外に出る
-(id) init {
if((self=[super init])) {
CGSize winSize = [CCDirector sharedDirector].winSize;
self.isAccelerometerEnabled = YES;
self.isTouchEnabled = YES;
// Create sprite and add it to the layer
_ball = [CCSprite spriteWithFile:@"SPEAR.png" rect:CGRectMake(0, 0, 100, 10)];
_ball.position = ccp(100, 100);
[self addChild:_ball];
// Create a world
b2Vec2 gravity = b2Vec2(0.0f, -20.0f);
bool doSleep = true;
_world = new b2World(gravity, doSleep);
// Create edges around the entire screen
b2BodyDef groundBodyDef;
groundBodyDef.position.Set(0,0);
b2Body *groundBody = _world->CreateBody(&groundBodyDef);
b2PolygonShape groundBox;
b2FixtureDef boxShapeDef;
boxShapeDef.shape = &groundBox;
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(winSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(0,0), b2Vec2(0, winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(0, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO));
groundBody->CreateFixture(&boxShapeDef);
groundBox.SetAsEdge(b2Vec2(winSize.width/PTM_RATIO, winSize.height/PTM_RATIO), b2Vec2(winSize.width/PTM_RATIO, 0));
groundBody->CreateFixture(&boxShapeDef);
// Create ball body and shape
b2BodyDef ballBodyDef;
ballBodyDef.type = b2_dynamicBody;
ballBodyDef.position.Set(100/PTM_RATIO, 100/PTM_RATIO);
ballBodyDef.userData = _ball;
b2Body *_body = _world->CreateBody(&ballBodyDef);
b2PolygonShape spearShape;
spearShape.SetAsBox(100/PTM_RATIO, 10/PTM_RATIO);
b2FixtureDef ballShapeDef;
ballShapeDef.shape = &spearShape;
ballShapeDef.density = 1.0f;
ballShapeDef.friction = 0.9f;
ballShapeDef.restitution = 0.89f;
b2Vec2 force;
force.Set(_body->GetLinearVelocity().x+5.0f, _body->GetLinearVelocity().y+10.0f);
_body->SetLinearVelocity(force);
[self schedule:@selector(tick:)];
}
return self;
}
- (void)tick:(ccTime) dt {
_world->Step(dt, 10, 10);
for(b2Body *b = _world->GetBodyList(); b; b=b->GetNext()) {
if (b->GetUserData() != NULL) {
CCSprite *ballData = (CCSprite *)b->GetUserData();
ballData.position = ccp(b->GetPosition().x * PTM_RATIO,
b->GetPosition().y * PTM_RATIO);
ballData.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle());
}
}
}
返信ありがとうございます。私はこれをした: b2PolygonShape spearShape; spearShape.SetAsBox(100/PTM_RATIO、10/PTM_RATIO); b2FixtureDef ballShapeDef; ballShapeDef.shape =&spearShape; しかし、ダイスはまだありません。 – sumderungHAY
地面と槍が衝突している様子はどうですか?与えられたコードで、少なくともあなたは地面を描いているようには見えません。私はあなたが使用しているフレームワークに精通していないので、あなたは自動的にBox2D本体のユーザーデータとして設定するため、スプライトの位置を自動的に更新していると思いますか?私の推測では、あなたはスプライトと体の位置を別の場所に持っています。 – iforce2d
返信いただきありがとうございます。私はすべてを表示するために自分のコードを更新しました。見てください。 – sumderungHAY