[Résolu] SpriteKit : poussée étrange de applyImpulse

berfisberfis Membre
janvier 2017 modifié dans Dev. macOS #1

Bonjour,


 


Je dirige latéralement mon vaisseau, qui baigne dans un champ de gravité, à  l'aide de "thrusters" gauche et droit.


 


J'ai factorisé les thrusters, qui poussent toujours dans la direction opposée à  leur orientation. Mais j'obtiens une poussée étrange, qui semble dirigée dans la mauvaise direction.


 


C'est peut-être juste des maths mal utilisées:



[Class Engine: SKSpriteNode]

- (void) setOn
{
self.hidden = NO;
float dir = self.zRotation+M_PI_2;
[self.parent.physicsBody applyImpulse: CGVectorMake(self.force*cosf(dir), self.force*sinf(dir))];

Une petite image pour mieux me faire comprendre.


Réponses

  • CéroceCéroce Membre, Modérateur
    Les maths me semblent bonnes. Ce ne serait pas plutôt la force qui serait mal calibrée ?
  • berfisberfis Membre
    janvier 2017 modifié #3

    Si les maths sont bonnes, je ne vois qu'une explication:


     


    - Mon vaisseau lutte contre la gravité à  l'aide de son moteur principal, qui exerce une poussée vers le haut.


    - Mes thrusters ajoutent (théoriquement) une poussée latérale.


     


    mais tout se passe comme si, dans un cycle, on ne pouvait exercer qu'une seule poussée à  la fois, en d'autres termes, quand les thrusters sont en marche, le moteur principal n'exerce plus de poussée, et le vaisseau part en chute libre.


     


    D'où question: ne peut-on, dans un cycle, n'exercer qu'une seule poussée sur un corps? Est-ce mentionné quelque part? Si oui, dois-je du coup additionner les poussées "manuellement" et n'en effectuer qu'une ?


     


    EDIT: C'est bon, j'ai trouvé. Quand j'appuie sur la touche gauche ou droite pour lancer les thrusters, le keyDown event "bouffe" des cycles update, dans lequel le moteur principal effectue sa poussée. Par contre, la gravité continue de s'appliquer, et donc le vaisseau tombe comme une pierre (mais en diagonale).


     


    J'ai sorti la poussée du moteur principal du cycle update, de façon à  pouvoir l'appeler depuis la routine qui gère les keyDown.


     


    Ce n'était pas la faute de SK, mais une erreur de design de ma part. Désolé.


  • CéroceCéroce Membre, Modérateur
    janvier 2017 modifié #4
    Je ne pense pas que ce soit le problème.

    Que se passe-t-il si tu écris ça:
    [self.parent.physicsBody applyImpulse: CGVectorMake(self.force, 0.0)];
    Et c'est normal que tu prennes self.zRotation mais que tu appliques l'impulsion sur le parent ?
  • berfisberfis Membre
    janvier 2017 modifié #5

    @Céroce: Oui, c'est normal: la poussée agit sur le vaisseau-parent, pas sur le thruster lui-même.


Connectez-vous ou Inscrivez-vous pour répondre.