On entend beaucoup parler de problèmes de ralentissements pour des jeux utilisant beaucoup les collisions, devant effectuer beaucoup de calculs ce qui fait ramer le jeu.
Après quelques test que j’ai fait, j’ai remarqué, ou plutôt vérifié (j’avais déjà remarqué ce phénomène auparavant mais à échelle réduite ce qui fait que je n’avais pas la certitude de son existence), que les collisions sont vérifiées avec la méthode du Pixel Perfect, qui consiste à comparer la position X;Y de tous les pixels de deux Sprites et annoncer une collision lorsque deux positions dans chacun des deux Sprites coïncident.
Il existe aussi une autre technique de vérification de collision, la méthode par Masque qui nécessite dans la plupart des cas beaucoup moins de calculs.
Elle consiste à appliquer un masque de collision, un rectangle de position X;Y donnée, à chaque sprite sur lesquels seront effectués les tests.
Ce rectangle n’est pas obligé de couvrir l’intégralité du sprite, par exemple dans les maniac-shooters la hitbox est très réduite par rapport au sprite du joueur.
J’ai essayé de recenser toutes les collisions possibles entre deux masques :
J’en ai trouvé 14.
Les calculs, au lieu de vérifier la position de tous les pixels, ce qui reviendrait pour deux Rectangles rouges de taille 64x96 à effectuer jusqu’à (64x96)(64x96)=37 748 736 comparaisons, évidemment on va pas immédiatement comparer tous les pixels autrement le lag serait énorme pour une seule collision, on ferait des tests pour voir si l’objet peut déjà être en collision en fonction de leur taille et position etc…
Bref, alors que pour, par exemple la toute première collision on aurait ça :
[code]
En considérant le point X;Y l’origine en haut à gauche de masque :
A.X = Position X de A
A.Y = Position Y de A
A.L = Largeur de A
A.H = Hauteur de A
B.X = Position X de B
B.Y = Position Y de B
B.L = Largeur de B
B.H = Hauteur de B[/code]
[code]Si :
(A.X) > (B.X)
(A.X) < (B.X)+(B.L)
(A.Y) > (B.Y)
(A.Y) < (B.Y)+(B.H)
Alors :
Collision (Haut-Gauche) entre A et B [/code]
Je pense donc que deux conditions puissent être ajoutées :
[code]Collision par Masque :
Argument 1 : Objet A
Argument 2 : Objet B
Renvoie vrai si une des collisions du schéma au dessus est vraie[/code]
[code]
Couverture par Masque :
Argument 1 : Objet A (recouvert par l’objet B)
Argument 2 : Objet B (recouvrant l’objet A)
Renvoie vrai si l’objet A est totalement recouvert par l’objet B (dernière collision du schéma)[/code]
Voilà, ça n’est pas très difficile à coder amha et je peux si nécessaire fournir les différents calculs nécessaires à la vérification des collisions.
Voilà.
(Ca en fait un paquet de lignes z’avez intérêt à avoir compris …)