2011-06-12 2 views
0

J'ai une balle qui déclenche une action quand elle entre en collision avec un sprite. Ensuite, une fois l'action terminée, il remet sa position avecRéinitialiser Sprite - Box2d (Cocos2d)

-(void)removeBall 
{ 
    [self stopAllActions]; 
    _ballBody->SetTransform(b2Vec2(10, 2), 0); 
} 

Mais, [auto stopAllActions] ne s'arrête pas l'action. Comment puis-je arrêter l'action? Des idées?

Merci

+0

Et ce que vous effectuez dans stopAllActions? – NIKHIL

Répondre

0

J'utilise

-(void)update:(ccTime)delta 
{ 

} 

de vérifier constamment si le ballBody est entré en collision avec l'autre corps et d'utiliser l'accéléromètre pour déplacer le ballbody. Donc, pour réinitialiser la position de la balle, je viens de remplacer la scène, qui appelle le "dealloc" puis recommence la scène.

[[CCDirector sharedDirector] replaceScene:[HelloWorldLayer scene]]; 
+0

ce n'est pas la façon dont vous supposez faire – NIKHIL

3

==> Vous pouvez faire la façon dont je l'ai fait ci-dessous

==> Détruisez le corps de l'objet et de créer de nouveaux et remis à zéro la position était que vous voulez définir cela va certainement travailler

 _world->DestroyBody(_body); 
    b2BodyDef _playerBodyDef; 
    _playerBodyDef.type=b2_dynamicBody; 
    _playerBodyDef.position.Set(160/PTM_RATIO,240/PTM_RATIO); 
    _playerBodyDef.userData=_ball; 
    _body=_world->CreateBody(&_playerBodyDef); 
    //create the shape for the rounded stick 
    b2CircleShape PlayerShape; 
    PlayerShape.m_radius = 15.0/PTM_RATIO; 

    //fixtureDef specifying the shape to circle 
    b2FixtureDef _playerShapeDef; 
    _playerShapeDef.shape = &PlayerShape; 
    _playerShapeDef.density = 1.0f; 
    _playerShapeDef.friction = 0.5f; 
    _playerShapeDef.restitution = 1.0f; 
    _playerShapeDef.filter.groupIndex =k_largeGroup; 
    _body->CreateFixture(&_playerShapeDef); 

Bonne chance

+0

Oh ok merci, donc je suis simplement en train de retirer complètement le corps de la balle, puis l'ajouter à nouveau? Je dois aller travailler, mais je vais le tester quand je serai de retour. – Jonathan

+0

Cela n'a pas fonctionné. C'est parce que je lance l'action dans une méthode de "mise à jour" (je lance l'action après que le corps entre en collision avec un autre). Donc, je viens de remplacer la scène ([[CCDirector sharedDirector] replaceScene: [scène HelloWorldLayer]] " – Jonathan

+0

vous devez revoir votre code et mettre une méthode dans la méthode tick timer et appelez cette méthode à partir de laquelle vous pouvez détruire l'objet et encore vous pouvez également réinitialiser la position – NIKHIL

2

StopAllActions est Cocos2D, pas Box2D. Ce que je fais pour réutiliser les corps, les sprites, les particules, etc., est visible = NO et body-> SetActive (false).

Ceci est de désactiver l'objet:

CCSprite *sprite = [projectiles objectAtIndex:i]; 

// Just to continue a loop if the sprite is not visible   
if(sprite.visible == NO) continue; 

sprite.visible = NO; 

b2Body *body = projectileBodyTracker[i]; 
body->SetActive(false); 

Ceci est de réactiver l'objet:

CCSprite *sprite = [projectiles objectAtIndex:i]; 

sprite.position = moveToPosition; 

b2Body *body = projectileBodyTracker[i]; 
body->SetTransform(moveToPositionVector, rotation); 
body->SetActive(true); 

J'ai écrit le code supplémentaire du haut de ma tête je ne peux pas complètement Assurez-vous que c'est correct (syntaxiquement), mais c'est comme ça que je le fais.

+0

J'utilise cocos2d pour exécuter l'action requise et j'ai besoin de réinitialiser le sprite si visible = non n'est pas suff icient – Jonathan

+0

Pour simplifier: Cocos2D est compatible avec Box2D, mais Box2D n'est pas entièrement compatible avec Cocos2D. Si vous déplacez un sprite avec Cocos2D, vous cassez la simulation physique. Si vous souhaitez utiliser Box2D uniquement pour la détection de collision (et ne pas simuler de physique du tout), vous définissez vos corps comme des capteurs et utilisez votre écouteur de contact pour vous indiquer quand il y a eu une collision. –

+0

J'utilise Box2d pour mon jeu, mais j'utilise aussi et action juste pour animer le sprite quand il "tombe" d'une plate-forme. Ensuite, j'ai besoin de réinitialiser. – Jonathan