2012-01-03 6 views
0

の配列を作成しています...私は似たタイプの複数のボールを作成したいと、彼らはまた、それらの間の自己衝突しなければならない。..私は、画面の周りBOX2D体と移動でボールを持ってBOX2D本体

コードは現在使用中です

ballcount = [[levelData objectForKey:@"ballcount"]intValue] ; 

ballarray = [[NSMutableArray arrayWithCapacity:ballcount]init] ; 

for (int j=0; j<ballcount; j++) { 
ball = [CCSprite spriteWithFile:@"ball.png"]; 
[ballarray insertObject:ball atIndex:j]; 
[self createBallBoundingBox:(CCSprite *)[ballarray objectAtIndex:j]]; 
[[ballarray objectAtIndex:j]setPosition:ccp(arc4random() % 480 , arc4random() % 320)]; 

[self addChild:[ballarray objectAtIndex:j]]; 
} 

実行時にスプライトが1つしか表示されません。唯一の1つのボールが

おかげ

iが動作するように上記のコードを持っているが、今私はダニの動きに問題が生じていますOKがあるときに任意の提案私が間違って何をやっている...それは完璧に動作します方法... BOX2D形状は動いているが、CCSprite形状は、ここでBOX2Dボディに取り付けたばかりされていないことは、私のcreateBoundingBox定義

world->Step(dt, 10, 10); 
    for(b2Body *b = world->GetBodyList(); b; b=b->GetNext()) { 

     if (b->GetUserData() != NULL) { 

      CCSprite *sprite = (CCSprite *)b->GetUserData(); 


      if ([sprite isKindOfClass:[Ball class]]) 
      { 

       b2Vec2 Vel = b->GetLinearVelocity(); 
       float32 angle = atan2(Vel.y, Vel.x); 
       angle += -M_PI/2; 

       b->SetTransform(b->GetPosition(),angle); 

       sprite.position = ccp(b->GetPosition().x * PTM_RATIO, 
             b->GetPosition().y * PTM_RATIO); 

       sprite.rotation = -1 * CC_RADIANS_TO_DEGREES(b->GetAngle()); 

      } 

[OK]をみんなここに私のコードです

-(void)createBallBoundingBox:(Ball *)ballSprite{ 
b2BodyDef BallBodyDef; 
ballBodyDef.type = b2_dynamicBody; 
ballBodyDef.position.Set(ballSprite.position.x/PTM_RATIO, ballSprite.position.y/PTM_RATIO); 
ballBodyDef.userData = ballSprite; 
ballBody = world->CreateBody(&ballBodyDef); 


/// test circle shape on ballbody 

b2CircleShape BallCircleShape; 

BallCircleShape.m_radius = 10/PTM_RATIO; 

// Create shape 
/* 
b2PolygonShape ballShape; 
int num = 7; 
b2Vec2 verts[] = { 
    b2Vec2(0.0f/PTM_RATIO, 19.2f/PTM_RATIO), 
    b2Vec2(-10.7f/PTM_RATIO, 15.2f/PTM_RATIO), 
    b2Vec2(-6.7f/PTM_RATIO, -3.2f/PTM_RATIO), 
    b2Vec2(-1.7f/PTM_RATIO, -18.0f/PTM_RATIO), 
    b2Vec2(7.7f/PTM_RATIO, 0.5f/PTM_RATIO), 
    b2Vec2(10.5f/PTM_RATIO, 14.7f/PTM_RATIO), 
    b2Vec2(0.2f/PTM_RATIO, 19.0f/PTM_RATIO)  
}; 

ballShape.Set(verts,num); 
*/ 
// Create shape definition and add to body 

b2FixtureDef ballFixtureDef; 
ballFixtureDef.shape = &ballCircleShape; 
ballFixtureDef.density = 1.0f; 
ballFixtureDef.friction = 0.0f; 
ballFixtureDef.restitution = 1.0f; 
ballFixture = ballBody->CreateFixture(&ballFixtureDef); 

b2Vec2 direction(5,2); 
direction.Normalize(); 
float force = 1.0f; 

b2Vec2 position = ballBody->GetPosition(); 

//Apply linear velocity 

ballBody->ApplyLinearImpulse(force*direction,ballBody->GetPosition()); 

b2Vec2 Vel = ballBody->GetLinearVelocity(); 
float32 angle = atan2(Vel.y, Vel.x); 
angle += -M_PI/2; 

ballBody->SetTransform(ballBody->GetPosition(),angle); 

}

私に教えてくれたコードが表示されない場合は、あなたのメソッド内

おかげでたくさんの男

+1

私はまだエラーは見つかりませんでしたが、「ballarray objectAtIndex:j」の代わりに「ball」を3回試してみてください。 – JeanLuc

+0

私はCCSpriteの配列を取得することができました。私の次の問題は、チックでシミュレーションする方法です:方法? –

+0

「ワンボール」問題をどう解決しましたか?あなたは私たちとこれを共有する必要があります。これは将来の読者に役立ちます。 – JeanLuc

答えて

0

[self createBallBoundingBox:(CCSprite *)[ballarray objectAtIndex:j]]; 
//OR NOW 
[self createMiceBoundingBox:tempmice]; 

はあなたb2BodyにUserDataのよう

- (void) createMiceBoundingBox: (Ball*) ball 
{ 
    //... 
    b2Body body = ... 
    body.SetUserData(ball); 
    //.. 
} 

をボールを添付するのを忘れましたメソッドの

編集:ボールの代わりにマウスを使用する場合は、あなたが確認してくださいdate tickメソッドを

if ([sprite isKindOfClass:[Mice class]]) 
+0

私はすでにSetUserDataを持っています...ここに私の関数定義はあります... –

+0

私は自分のメソッド定義を追加しました。ありがとう –

+0

あなたはこのラインで何を達成したいですか? (私もダニでそれを見つけた) ballBody-> SetTransform(ballBody-> GetPosition()、angle); – JeanLuc