Col·lisions

Segons el diccionari, una col·lisió és un encontre de dos cossos que topen o col·lideixen. Per tal que dos cossos topin, cal que almenys un d’ells es mogui.

Quan desenvolupem videojocs en Pygame, els elements del joc que es mouen, i que poden col·lidir, normalment són sprites. Els sprites són objectes que poden canviar la seva imatge gràfica, o la seva posició a la pantalla, o totes dues coses alhora. A més de la classe Sprite, el mòdul pygame.sprite proporciona la classe Group. Pygame permet detectar col·lisions entre sprites o grups de sprites de diferents maneres:

  • A nivell de rectangle: dos sprites col·lideixen si els seus rectangles (caixes contenidores) no són disjunts. Pygame també admet comprovar la col·lisió amb els rectangles escalats amb un cert ratio.

  • A nivell de cercle (contenidor o no): es comprova si els cercles que contenen els sprites se sobreposen. Pygame també admet comprovar la col·lisió amb els cercles escalats amb un cert ratio.

  • A nivell de píxel: a cada sprite se li associada una màscara de bits; dos sprites col·lideixen si les seves màscares tenen algun bit actiu actiu de la mateixa posició. Val més que els sprites tinguin un atribut mask amb la màscara de bits de pygame precalculada (vegeu el mòdul pygame.mask), per exemple a partir dels seus píxels transparents (vegeu Color, imatges i transparència).

L’efecte tunneling

Com que en un videojoc es calculen el moviment dels objectes de forma discreta, típicament a cada fotograma, pot ocòrrer que no es detectin les col·lisions de forma correcta. Posem per cas que en un fotograma una bala està a la dreta d’una paret, es calcula la seva nova posició per al següent fotograma i resulta estar totalment a l’esquerra, perquè té una velocitat alta (i la paret és prou prima). Aquest efecte es coneix com a tunneling. Hi ha diverses maneres d’evitar-lo (vegeu aquesta pàgina); per exemple, es pot calcular la col·lisió no basant-se en la seva posició sinó en la trajectoria escombrada entre els dos fotogrames. Però potser sigui millor utilitzar un motor de física