2015-04-16 1 views
2

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

Répondre

1

Donc, j'ai finalement réussi à le comprendre. Juste le cas quelqu'un d'autre éprouve le même problème Je posterai la réponse ici:

Le problème était que, bien que la gravité soit (apparemment) en ms^-2 et la vitesse m2^-1 (pour répliquer la terre), tout les distances dans l'objectif C sont mesurées en POINTS plutôt que sous la forme requise de METERS. Par conséquent, tout calcul effectué avec des valeurs de position/taille x, y extraites de SKSpriteNodes etc. sera un facteur déterminant. Après avoir fait quelques tests, j'ai trouvé que le facteur était d'environ 157. Cela signifie que vous devez multiplier toutes les tailles/distances en POINTS par 157 pour obtenir la valeur relative 'METER' qui fonctionnera avec SUVAT. Les numéros eux-mêmes semblent un peu ridicules car ils sont tous très gros (vitesse, distance, etc.) mais cela ne pose pas vraiment de problème car ils fonctionnent tous les uns par rapport aux autres!

J'espère que cela aidera n'importe qui! Steve