J'utilise le moteur physique de SpriteKit pour construire un jeu pour iOS. Fondamentalement, il implique une balle rebondissante qui se déplace par moi-même en réglant manuellement sa vitesse initiale et rebondit en réinitialisant la vélocité dans l'événement de contact avec le sol.SUVAT Les maths ne s'additionnent pas dans le moteur physique de SpriteKit (iOS - Objective C)
Le problème est que les maths réelles de cet environnement ne s'additionnent pas. En utilisant les équations 'SUVAT', il est facile de déterminer jusqu'où doit aller le déplacement de la balle lorsqu'elle atteint le sol après avoir été lancée avec une certaine vélocité (avec une gravité de -9,81), elle déplace à peine quelques pixels. J'ai simplifié le problème en essayant simplement de tirer une balle à une certaine distance vers le haut (dans la direction y) et la même chose s'est produite, elle se déplace de quelques points vers le haut puis tombe juste au sol, au moins 20e de quelle distance il devrait se déplacer.
Voilà comment j'ai mis l'environnement physique jusqu'à:
self.physicsWorld.contactDelegate = self;
self.physicsWorld.gravity = CGVectorMake(0.0, -9.81);
Et puis c'est ma fonction pour générer cette boule (tir vers le haut) par exemple. Mathématiquement, il devrait atteindre la hauteur de la tour:
-(void)generateTestBall {
self.ball = [SKSpriteNode spriteNodeWithImageNamed:@"ball"];
SKSpriteNode * tower = [SKSpriteNode spriteNodeWithImageNamed:@"player"];
self.ball.position = CGPointMake(self.scene.size.width/2,self.scene.size.height/2);
self.ball.size = CGSizeMake(20,20);
self.ball.color = [SKColor redColor];
self.ball.colorBlendFactor = 1;
tower.position = CGPointMake(self.scene.size.width/2 + 20,self.scene.size.height/2+100);
tower.size = CGSizeMake(20,200);
tower.color = [SKColor blueColor];
tower.colorBlendFactor = 1;
[self addChild:tower];
[self addChild:self.ball];
self.ball.physicsBody = [SKPhysicsBody bodyWithCircleOfRadius:10];
self.ball.physicsBody.affectedByGravity = YES;
self.ball.physicsBody.linearDamping = NO;
self.ball.physicsBody.dynamic = YES;
CGFloat ballVel = sqrt(2*9.81*tower.size.height);
NSLog(@"%f",ballVel);
self.ball.physicsBody.velocity = CGVectorMake(0.0f, ballVel);
}
S'il vous plaît quelqu'un peut-il expliquer ce que je fais mal? J'ai vérifié mes maths (je suis un étudiant en maths donc les doigts croisés ce n'est pas le problème)!
Merci! Steve