Colisiones en disparos y colisiones mejoradas - Curso Pygame - Capítulo 14


En el capítulo anterior, viste la clase disparos, en este vas a ver como crear colisiones con ellos y cómo hacer alguna mejora en las colisiones.

Primero indicamos dos grupos, los cuales van a ser los que colisionen entre ellos.

Si lo recuerdas, en el capítulo anterior utilicé spritecollide en lugar de groupcollide, la diferencia es que en este permite utilizar dos grupos en lugar de un solo sprite y un grupo.

Código

colision = pygame.sprite.groupcollide(enemigos, balas, False, True)

Los dos valores booleanos indican el kill(). Si queremos que el primer grupo desaparezca al colisionar ponemos True, en cambio, si queremos que se mantenga, pondremos un False. Como quiero que la nave enemiga explote al dispararle, no puede eliminarla, por lo tanto primero un False y el segundo valor (True) es para que las balas desaparezcan al colisionar con el enemigo.

Colisiones mejoradas de Pygame

Pygame es bastante completo y trae consigo una mejora para las colisiones.

Los sprites, son rectángulos o cuadrados, siempre es así, aunque tengamos una imagen con transparencia, sigue siendo de esta forma.
El problema de las colisiones con sprites con transparencias (la mayoría), es que si se produce la colisión en una zona transparente del sprite, desencadena el efecto de esta, dejando un juego para nada realista y con una jugabilidad pésima.
En el vídeo de arriba entenderás mucho mejor todo esto.

Para solucionar esto tenemos la técnica "circular bounding box" o cuadratura del círculo en español que permite hacer una colisión redondeada, no perfecta, pero mucho más precisa.

Se trata de añadir en cualquiera de las clases un radio que rodee la mayor parte del sprite o todo, según sus características.
Por ejemplo, en la clase jugador, según el tamaño de mi imagen, le he establecido un radio de 27 px.

Código

self.radius = 27

Deberás hacer lo mismo con los enemigos u otros objetos que quieras que colisionen.

Para añadir este radio a la colisión, lo tendrás que hacer añadiéndole un collide_circle.

Código

colision_nave = pygame.sprite.spritecollide(jugador,enemigos,False,pygame.sprite.collide_circle)

Suscríbete a mi canal de YouTube para apoyarme

Si te ha gustado este curso y crees que el trabajo merece la pena, te agradeceré eternamente que te suscribas a mi canal de YouTube para apoyarme y que pueda seguir haciendo cursos gratuitos.

Además, si te encanta la programación, tienes un montón más de cursos gratuitos para ver.

No solo eso, podrás participar enviándome comentarios con tus sugerencias para temas específicos o cursos completos o incluso las dudas que tengas y las intentaré ir resolviendo en los cursos que estén todavía abiertos.


Comentarios

Si te quedan dudas sobre el temario, sobre Python, o cualquier otra cosa relacionada o simplemente quieres agradecer, aquí tienes tu sitio para dejar tu granito de arena. Gracias por tus comentarios y por darle vida a este sitio web.