SpriteKit SKPhysicsBody qui s'adapte pour les animations ?

#1

Bonsoir tout le monde,

Je suis occupé de bosser sur mon premier “vrai” jeu iOS, et je rencontre une petite difficulté.
J’ai créé une animation pour mon personnage, et j’aimerai que le SKPhysicsBody de mon personnage soit plus ou moins fidèle à la forme du personnage en lui même. Pour l’instant, j’ai mis un rectangle, mais de fait, les collisions ne sont plus tout à fait exacte.

Voici un exemple de ce que j’ai pour l’instant : (en rouge le PhysicsBody)
37%20PM

Voici ce que j’aimerai avoir : (en rouge le PhysicsBody)
33%20PM

Je précise que je crée le PhysicsBody directement depuis le code et non pas depuis le fichier de la scène.

Aussi, comment faire dans le cas d’une animation ?
Une animation de ce genre-ci par exemple :

08%20PM

Parce que donc, le PhysicsBody n’est pas toujours le même en fonction du moment de l’animation…
Comment est-ce que je dois gérer ce genre de chose ?

Un grand merci,

Bonne soirée,

Alexandre

#2

Tu peux définir le corps physique à partir d’un path, et le modifier en cours de route. Enfin en théorie, je n’ai jamais essayé, mais selon la doc c’est possible.

#3

Hello @Draken :slight_smile:

Définir un PhysicsBody avec un path, d’accord, mais le faire évoluer avec les SKAction.run()?

Bonne journée,

Alexandre

#4

Bonjour tout le monde,

Un moyen de faire que j’ai trouvé, c’est de réinitialiser le SKPhysicsBody à chaque fois que je change d’animation, en utilisant ce constructeur:

SKPhysicsBody(texture: , alphaThreshold: , size: )

Ca a l’air de fonctionner, mais je ne suis pas sur que ce soit la meilleur façon de faire…
Je continue mes recherches.

EDIT: Une autre potentielle solution que j’ai trouvée serait de définir le PhysicsBody avec des formes simples (rectangle et cercle) et de les placer de manière à couvrir une grande partie du personnage (tête et corps par exemple). De cette manière, je peux éventuellement mettre le PhysicsBody à jour lorsque je change d’animation. A voir si cela ne posera pas de problème lorsque le personnage saute par exemple et que sa hitbox se réduit. Je vous tiens au courant.

Bonne journée,

Alexandre

#5

Ta première solution a l’avantage d’utiliser une détection des collisions au pixel prés, mais ça coûte plus cher en temps machine. L’utilisation de formes géométriques simples réduit de beaucoup les calculs.

#6

C’est bien ce que je pensais.

Un bon compromis serait peut-être d’utiliser quelques formes géométriques pour les mouvements qui n’ont pas besoin d’une forte précision de détection, et éventuellement d’utiliser les textures pour les mouvements qui nécessitent une plus forte précision.

Je vais voir ce que ca donne. Il n’y a probablement pas de solution idéale, tout dépend de la situation.

Merci

#7

As-tu regardé le système d’animations par squelette de SpriteKit ? Cela permet de créer des objets graphiques complexes à partir d’éléments de base, liés par des contraintes.

On peut s’en servir notamment pour créer des marionnettes, les bras et les jambes étant liées au corps par des points fixes. Si le corps bouge, les objets liés suivent.

J’ai juste vaguement regardé le truc, mais cela parait puissant.

#8

Ooh, c’est un truc comme ça que je cherche !
Est-ce que tu as un lien ou une référence à me partager ? :o

EDIT: Genre ça: https://www.raywenderlich.com/1158-spritekit-and-inverse-kinematics-with-swift ? :star_struck:

#9

Impressionnant ce tuto. J’avais juste lu une page technique sur le principe, mais là c’est carrément fantastique.

#10

Oui, ça a vraiment l’air complètement fou ce truc !
Je sens que je vais passer un peu de temps à l’apprendre correctement…

Par contre, pas beaucoup de tuto sur le sujet…

En tous cas, un grand merci pour le partage de la ressource :smiley: