Colisiones Pygame

Agrupa todas las consultas sobre los lenguajes de programacion como C, C++, Python, Java ...

Colisiones Pygame

Notapor henbaku » Jue Abr 08, 2010 4:58 am

Buenas, soy nuevo :P.

Empecé en esto de desarrollo con un toolkit llamado GameMaker (seguro que alguno lo conocerá), el caso es que ahora soy partidario de software libre, y pues vivo en Linux, y decidí adoptar PyGame (amo Python).

Todavía no conozco con profundidad la API; empecé programando un scrollengine que quedó bastante decente (imita muy bien a las viewports de gamemaker). El juego que hago está además basado en tiles (típico).

La cuestión es que quería referenciarme acerca de las colisiones.

El personaje al que sigue la camara, tiene un Rect (del tamaño del sprite que usa); hice una clase llamada "bloque", que se autocrea un Rect con las proporciones y posición de ciertos tiles (las paredes y eso), todos esos bloques los almaceno en una lista.

La cuestión es que, quería saber, sobre las funciones de colisión de PyGame; básicamente lo que deseo saber, es si es posible detectar colisiones con una lista de Rectangulos (Rects) existentes sin tener que verificar uno por uno (vía un bucle o tal). Por el scrollengine no se preocupen (piensen como si fuera un juego plano).

En gamemaker por ejemplo, teniamos "Objetos" (que eran algo así como Clases), en los escenarios, podías crear varios, en los juegos solía crear un objeto para los muros, y el personaje, detectaba las colisiones señalandole la clase y las detectaba con todos los objetos descendientes de esta.

Sé que la metódica es totalmente distinta, pero bueno.

Tengo mis ideas sobre como detectar colisiones, pero quiero saber si la API de pygame tiene ya funciones integradas (si no, estaría reinventando la rueda ¿o no? :P).

Saludos.
henbaku
 
Mensajes: 3
Registrado: Jue Abr 08, 2010 4:21 am

Notapor hugoruscitti » Jue Abr 08, 2010 1:50 pm

Buenas como estas?, te comento que pygame reune
casi todas las funciones para detectar colisiones
en la clase Rect.

Por lo tanto, si quieres verificar colisiones le tienes
que preguntar a tus objetos rect si colisionan o no.

Por ejemplo, lo mas común es que cada sprite tenga
un atributo "rect" indicando su tamaño y posición (como
tú lo estás haciendo). Entonces, para analizar si ese
rectángulo colisiona o no con algo podrías escribir:

Código: Seleccionar todo
ha_colisionado = personaje.rect.collidelist(lista_de_paredes)

if ha_colisionado:
    print "esta en contacto con una pared"


donde "lista_de_paredes" puede ser una lista de objetos rect, por
ejemplo:

Código: Seleccionar todo
pared_1 = pygame.Rect(10, 10, 50, 50)
pared_2 = pygame.Rect(80, 10, 50, 50)

lista_de_paredes = [pared_1, pared_2]



Ten en cuenta que en la siguiente seccion del manual
tienes mas funciones de colisiones para investigar:

http://www.losersjuegos.com.ar/traducciones/pygame/rect


Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor henbaku » Sab Abr 10, 2010 2:10 am

Muchas gracias hugo, me ha servido.

El problema es que hago uso de "collidepoint", el cual me parece que no puedo manejar con listas de rects, sin embargo el problema pude solucionarlo fácilmente; lo que hice fue crear una recta extra (llamada colrect), que es un poco mas grande a los lados y arriba/abajo de la rect principal del personaje; los bloques detectan si colisionan con esta rect (que indica que esta a una muy corta distancia del personaje) y se agregan a una lista, y si no están colisionando se eliminan de esta lista si están allí.

Ya después hago una verificación mediante una iteración a esta lista; puede que sea un método ineficiente, pero al menos parece funcionar bastante bien (originalmente lo había intentado iterando en la lista con todos los bloques, lo cual fue catastrófico para el rendimiento).

También, decidí eliminar todas los rects de bloques (que eran cientos; uno por cada cuadricula de bloque de 24x24), en favor de una menor cantidad de rects largas que abarcan secciones de bloques, lo cual ayuda que la iteración para la detección de colisiones sea usualmente de uno a tres rects; de momento tengo que crear estas rects a mano, sin embargo el trabajo se me facilitará después ya que planeo programar un editor de niveles que me permita señalar los sitios que son paredes, suelos y eso :P.

Saludos, muchas gracias por la nota.
henbaku
 
Mensajes: 3
Registrado: Jue Abr 08, 2010 4:21 am


Volver a Sobre lenguajes de programación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron