Spritekit - PhysicsBody rebondissement du corps, même avec une restitution à 0

#1

Bonjour tout le monde :sunglasses:

Je suis occupé de faire une sorte de plate-former en Swift avec SpriteKit.
J’ai ajouté un personnage à ma scène, et je suis occupé de travailler sur le saut du personnage. Le saut fonctionne bien, mais lorsque le personnage atterri, il continue de sautiller une ou deux fois. J’aimerai éviter ce comportement.
En cherchant, j’ai vu que c’était la propriété “restitution” du PhysicsBody qu’il fallait que je mette à 0; ce que j’ai fait. Je l’ai également fait pour le sol sur lequel le personnage rebondi.
Mais rien à faire, le personnage continue de faire un ou deux rebond avant de se stabiliser…

Une idée de ce qui pourrait causer ça ?

J’ai essayé de refaire la même chose dans un nouveau projet en allant droit au but, et dans ce projet, tout fonctionne à merveille. Je dois avoir quelque chose dans ce projet-ci qui agit sur la restitution ou vient la perturber, mais je n’ai aucune idée de ce que ca pourrait être.

Sur mes PhysicsBody, les seuls paramètres que j’indique sont les suivants :

Sur le personnage:

node.physicsBody?.isDynamic = true
node.physicsBody?.affectedByGravity = true
node.physicsBody?.pinned = false
node.physicsBody?.allowsRotation = false
node.physicsBody?.restitution = 0.0    
node.physicsBody?.mass = 0.15
    
node.physicsBody?.categoryBitMask = BitmaskCategories.player.rawValue
node.physicsBody?.collisionBitMask = BitmaskCategories.block.rawValue          
node.physicsBody?.contactTestBitMask = BitmaskCategories.block.rawValue 

Sur mes blocks:

self.physicsBody = SKPhysicsBody(rectangleOf: CGSize(width: self.size.width, height: self.size.height))
        
self.physicsBody?.affectedByGravity = false
self.physicsBody?.pinned = true
self.physicsBody?.isDynamic = false
self.physicsBody?.allowsRotation = false
self.physicsBody?.restitution = 0.0
self.physicsBody?.mass = 1.0
        
self.physicsBody?.categoryBitMask = BitmaskCategories.block.rawValue
self.physicsBody?.collisionBitMask = BitmaskCategories.player.rawValue
self.physicsBody?.contactTestBitMask = BitmaskCategories.player.rawValue

Si quelqu’un a une idée, je suis preneur…

Bonne journée :slight_smile:

Alexandre

#2

J’ai déjà affronté ce problème. Un bref rebondissement est normal, même avec une restitution à zéro. Du moins selon les lois de la physique.

rebond = f(masse, restitution, vitesse, angle de déplacement)

L’astuce c’est de tricher avec la masse de l’objet. Tu lui donnes une masse énorme au contact. Les équations physiques s’appliquent toujours, mais le rebond n’est plus perceptible. Une bille de 6 tonnes ne rebondit pas en tombant …

#3

Hello @Draken :slight_smile:

J’ai essayé de suivre ton conseil, j’ai appliqué une masse de 50.000 à mon personnage, mais rien n’y fait, j’ai toujours autant cet effet de rebond…

Je ne comprend pas pourquoi…

EDIT: A moins que tu veuilles dire que je dois donner une masse énorme à mon personnage au contact du sol ? Pas en permanence ?

Merci,
Bonne soirée,

Alexandre

#4

Ah, j’ai déjà un peu mieux !

Si je mets la masse à 500.000 dès que le personnage touche le sol, et que je la rectifie ensuite à 0.15 comme auparavant, j’ai un très léger effet de rebond, mais c’est tout à fait acceptable !

Magnifique :grin:

Merci !

#5

Essaye avec des masses encore plus importantes. Un entier 32 bit peut monter à plus de 2 milliards. Fait-toi plaisir … Passé un certain stade, il ne devrais plus y avoir de rebond du tout …

Je m’étais aperçu du problème en faisant un exercice du MOOC Swift du professeur Kordon, il y a quelques années. J’avais un peu “customisé” le sujet en y ajoutant un Tardis (docteur Who), et des envahisseurs extra-dimensionnels voulant manger (au sens propre) new-york. Le Tardis rebondissais dans tous les sens, au moindre contact. J’ai réglé le problème lui donnant une masse énorme (en permanence). Mais cela gênait le système de déplacement physique du Tardis, alors je l’ai rendu insensible à presque tout, modifiant sa position avec des coordonnées (x,y).

Une fois l’exercice rendu, je me suis dis que j’aurais pu faire la même chose en modifiant la masse juste au moment de l’impact.

#6

Merci @Draken

Je vais essayer de monter cette masse encore un peu plus, pour voir ce que ça donne.
Je te tiens au courant,

Alexandre

#7

Bonsoir,

Je viens de tester en mettant la masse à:

500000000000000

mais rien à faire, toujours le même tout petit rebond.
Ceci dit, ce n’est pas trop dérangeant.

Bonne soirée,

Alexandre