Aquest article parla dels algorismes més habituals de detecció de col·lisions, per tant, es pot aplicar a XNA o no, ja que l’algorisme no és particular de cap llenguatge de programació.
Un joc amb una detecció de col·lisions ineficient pot crear una experiència d’usuari nefasta, fent fins i tot que els jugadors abandonin el joc d’aborriment (i de vegades odi)… A més, un sistema de detecció de col·lisions massa potent, mal dissenyat, pot causar greus problemes de performance, amb la qual cosa tornem a tenir al usuari cremat -i nosaltres no volem un usuari cremat, oi que no?-.
La manera més bàsica de detectar les colisions, és a partir de la detecció de la intersecció d’un rectangle que compon els sprites. Amb la imatge es veurà més clar… :
Llavors, per detectar si aquest sprite “xoca” amb un altre, no ho comprovarem a nivell de píxel (mètode anomenat “perfect pixel collision”), ja què té un gran cost de processament. En canvi, comprovariem si el rectangle d’aquest sprite fa intersecció amb el rectangle sobre el qual volem comprovar si hi ha col·lisió.
Aquest mètode, evidentment, té un problema greu… és poc “realista”. Concretament, en el cas del nostre sprite, veiem que hi ha un bon troç d’imatge continguda dins del rectangle de color blanc, és a dir, que si considerem que el troç blanc és una col·lisió, el jugador no n’entendrà el comportament. Així doncs tenim un problema…
El que farem serà “crear més rectangles” a l’hora de considerar la col·lisió, com es mostra en la imatge:
No obstant… seguim tenint un problema. La comprobació de tans rectangles pot suposar costosa a nivell de processament… la qual cosa podria afectar al performance del joc.
Així doncs, en què quedem?
Una manera més eficient de comprobar la colisió, seria crear un rectangle que abarqués tots els que acabem de crear. Primer comprovariem si hi ha colisió entre els rectangles grans, i si hi és, ho mirariem a nivell dels petits, que son els que ens interessen. De nou amb la imatge es veurà més clar (correspondria al rectangle de color verd):
Finalment, perquè la comprobació no sigui tan costosa, i donats els dos sprites que volem comprovar si col·lisionen, podriem dividir la pantalla en una matriu de rectangles, i abans de passar a comprobar si hi ha col·lisió entre els dos sprites, miraríem si estan a la mateixa casella de la matriu. Altre cop, una imatge val més que mil paraules…
En aquest cas, comprovaríem que l’sprite A i l’sprite B no estan dins la mateixa posició de la matriu, per tant ja no procediríem al càlcul més costós de la col·lisió.
Deixa un comentari