2011-11-08 16 views
0

私はcocos2dを使用していて、スプライトとボディを多数持っています。各スプライトには本体があり、各種類のスプライトにはタグがあります。 (次を参照)。画面から特定のスプライトを消去する

2つのスプライトが互いに接触しているとき、私はそれを発見することができ、それらを消滅させたい。

問題は同じ種類(同じタグを持つ)のスプライトが多いため、スプライトをクリーンにすると、作成された最後のスプライトがきれいになります。

同じ種類のスプライトを作成

私の機能は次のとおりです。

//cotact listener 
    std::vector<MyContact>::iterator pos; 
    for(pos = _contactListener->_contacts.begin(); pos != _contactListener->_contacts.end(); ++pos) 
    { 
     MyContact contact = *pos; 
     b2Body *bodyA=contact.fixtureA->GetBody(); 
     b2Body *bodyB=contact.fixtureB->GetBody(); 

     //check if collision between to bodies 
     if(bodyA->GetUserData() !=NULL && bodyB->GetUserData() !=NULL) //if ((contact.fixtureA == _bottomFixture && contact.fixtureB == _ballFixture) ||(contact.fixtureA == _ballFixture && contact.fixtureB == _bottomFixture)) 
     { 
      CCSprite *actor = (CCSprite*)bodyA->GetUserData(); 
      CCSprite *actorb = (CCSprite*)bodyB->GetUserData(); 


      //touch 
      if ([actorb tag] == 2 && [actor tag]== 1) 
      { 
      [fruit1.parent removeChild:fruit1 cleanup:YES]; 
      NSLog(@"touch1"); 

      } 

今消えスプライト:私はこれとの接触を見たとき 2としてタグ付けされ

-(void)fruit1:(int) randomForCoordinates 
{ 

    //define sprite 
    fruit1=[CCSprite spriteWithFile:@"fruit1.png"]; 
    fruit1.tag=2; 
    fruit1.position=ccp(randomForCoordinates,500); 
    //add fruit 
    b2BodyDef spriteBodyDef; 
    spriteBodyDef.type =b2_dynamicBody; 
    spriteBodyDef.position.Set(fruit1.position.x/PTM_RATIO,fruit1.position.y/PTM_RATIO); 
    spriteBodyDef.userData = fruit1; 
    fruit1body = world->CreateBody(&spriteBodyDef); 

    b2PolygonShape spriteShape; //b2polygon-for box shape 
    spriteShape.SetAsBox(fruit1.contentSize.width/PTM_RATIO/2,fruit1.contentSize.height/PTM_RATIO/2); //for b2polygon 
    b2FixtureDef spriteShapeDef; 
    spriteShapeDef.shape = &spriteShape; 
    spriteShapeDef.density = 10.0; 
    spriteShapeDef.isSensor = false; 
    fruit1body->CreateFixture(&spriteShapeDef); 
    [self addChild:fruit1]; 

} 

ここに触れたものではなく、彼の後に作成されたものです。

どうすれば別のスプライトに触れたのでしょうか? 最後に作成されたものではありませんか?

おかげでたくさん

答えて

1

2つのスプライトが衝突しているあなたは以下のようにいずれかを削除する場合:

if(bodyA->GetUserData() !=NULL && bodyB->GetUserData() !=NULL) //if ((contact.fixtureA == _bottomFixture && contact.fixtureB == _ballFixture) ||(contact.fixtureA == _ballFixture && contact.fixtureB == _bottomFixture)) 
    { 
     CCSprite *actor = (CCSprite*)bodyA->GetUserData(); 
     CCSprite *actorb = (CCSprite*)bodyB->GetUserData(); 


     //touch 
     if ([actorb tag] == 2 && [actor tag]== 1) 
     { 

      [self removeChild:actor cleanup:YES]; 
      //(or) 
      [self removeChild:actorb cleanup:YES]; 


     NSLog(@"touch1"); 

     } 
+0

おかげで、私はこの警告を得る:インスタンスメソッドのremoveChild:withCleanup見つかりません(IDへの戻り値の型のデフォルト) ..それをどうやって修正するのですか? – Curnelious

+0

私は[self removeChild:actorb cleanup:YES]を実行してもOKです。連絡先リスナーをダニ法の外に置いても、私のシミュレーションはクラッシュします。私は間違って何をしていますか? – Curnelious

+1

クラッシュこれは.thisされていないしようとした場合([actorbタグ] == 10 && [アクタータグ] == 11){ \t \t \t \t世界的> DestroyBody(bodyB)。 \t \t \t \t \t \t \t \t [自己のremoveChild:actorbクリーンアップ:YES]。 \t \t \t \t NSLog(@ "touch1"); \t \t \t \t return; \t \t \t \t } – banu

関連する問題