2011-07-01 21 views
2

私は基本的に矩形のオブジェクト(槍のようなもの)を持っていて、私は地面を持っています。問題は、槍が地面に当たったときにそれが跳ね返ってこないということです。ここに私の物理学のセットアップ:私はしばらく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()); 
     }   
    } 
} 

答えて

0

(ボールの参照を無視し、それが槍)(長方形と呼ばれるように仮定)が、私はあなたが追加スペースを作成するために必要な覚えていますそれにオブジェクトがあるので、彼らはお互いを認識していました。

0

エッジディメンションはBox2Dで互いに衝突しません。地面または槍のいずれかを多角形にする。

+0

返信ありがとうございます。私はこれをした: b2PolygonShape spearShape; spearShape.SetAsBox(100/PTM_RATIO、10/PTM_RATIO); b2FixtureDef ballShapeDef; ballShapeDef.shape =&spearShape; しかし、ダイスはまだありません。 – sumderungHAY

+0

地面と槍が衝突している様子はどうですか?与えられたコードで、少なくともあなたは地面を描いているようには見えません。私はあなたが使用しているフレームワークに精通していないので、あなたは自動的にBox2D本体のユーザーデータとして設定するため、スプライトの位置を自動的に更新していると思いますか?私の推測では、あなたはスプライトと体の位置を別の場所に持っています。 – iforce2d

+0

返信いただきありがとうございます。私はすべてを表示するために自分のコードを更新しました。見てください。 – sumderungHAY

1

あなたのコードのどこにでもボールが描かれ、槍になることはありません。ボディに形状がない場合、衝突しません。

1

私はボックス2dに灯具だけが衝突していると思います。 しかし、あなたの槍には治具がありません。 フィクスチャ自体は作成しませんが、フィクスチャ自体は作成しません。

fixtureDefあなたに返還を設定した後、次の行を追加します。

_body->CreateFixture(&ballShapeDef); 

すべてはその後、問題ないはずです!

少し遅れて知りました。

関連する問題