2011-07-01 3 views
2

J'ai fondamentalement un objet rectangulaire (comme une lance) et j'ai un corps au sol. Le problème est que, lorsque la lance frappe le sol, elle ne rebondit pas, elle tombe et disparaît de l'écran. Voici ma configuration de la physique: (Ignorer la référence de la balle, il suppose d'être appelé lance (rectangulaire))Box2D corps dynamique tombant de l'écran

-(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()); 
     }   
    } 
} 

Répondre

0

Je ne l'ai pas utilisé cocos2d dans un certain temps, mais je me souviens que vous aviez besoin de créer un espace d'ajouter objets à lui, de sorte qu'ils étaient au courant les uns des autres.

0

Les boîtiers périphériques n'entrent pas en collision dans Box2D. Faire soit le sol ou la lance un polygone.

+0

Merci pour la réponse. J'ai fait ceci: b2PolygonShape spearShape; spearShape.SetAsBox (100/PTM_RATIO, 10/PTM_RATIO); b2FixtureDef ballShapeDef; ballShapeDef.shape = & spearShape; Mais toujours pas de dés. – sumderungHAY

+0

Comment dites-vous que le sol et la lance entrent en collision. Vous ne semblez pas dessiner le sol, au moins dans le code donné. Je ne suis pas familier avec le framework que vous utilisez, puis-je supposer qu'il met automatiquement à jour la position de l'image-objet simplement parce que vous la définissez comme données utilisateur dans un corps Box2D? Je suppose que vous avez les positions du sprite et du corps dans différents endroits. – iforce2d

+0

Merci encore pour la réponse. J'ai mis à jour mon code pour tout afficher. S'il vous plaît, jetez un oeil. – sumderungHAY

1

Je ne vois nulle part dans votre code attacher les formes à la balle et à la lance. Si le corps n'a pas de forme, il n'entrera pas en collision.

1

Je pense que seuls les appareils sont en collision dans box2d. Mais votre lance n'a pas d'appareil. Vous ne créez que le luminaire def mais pas le luminaire lui-même.

après la mise en restitution pour vous fixtureDef, ajoutez cette ligne:

_body->CreateFixture(&ballShapeDef); 

Tout devrait alors être bien!

Un peu en retard je sais ..

Questions connexes