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());
}
}
}
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
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
Merci encore pour la réponse. J'ai mis à jour mon code pour tout afficher. S'il vous plaît, jetez un oeil. – sumderungHAY