¿Como hacer colisiones mas realistas? (Pygame)

Consulte acerca de programas, técnicas, algoritmos etc.

¿Como hacer colisiones mas realistas? (Pygame)

Notapor endaramiz » Dom Nov 04, 2007 3:21 pm

Hola, me gustaría saber si se podrían hacer colisiones mas complejas. Ya que con lo que he visto solo puedo hacer colisiones con rectángulos y eso limita bastante el realismo. Estaría bien si se pudiese hacer algo así como una máscara para elegir las zonas que pueden colisionar, o si en vez de utilizar rectángulos se pudiesen utilizar circunferencias etc..

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona

Re: ¿Como hacer colisiones mas realistas? (Pygame)

Notapor hugoruscitti » Lun Nov 05, 2007 7:16 pm

dvd escribió:Ya que con lo que he visto solo puedo hacer colisiones con rectángulos y eso limita bastante el realismo...
Las colisiones en pygame pueden ser tan complejas como desees, en principio
los grupos detectan colisiones entre cajas, pero esto no siempre tiene que ser
así. Por ejemplo, en el juego de nombre Shaolin tube que modificar este
aspecto de las colisiones para que los golpes entre personajes sean mas
"realistas":

Imagen

En la imágen puedes observar que el rectángulo de colision del personaje de
pelo azúl es mas pequeño que el rectángulo que representa la imágen. Esta
personalización de las colisiones es solo un ejemplo, se pueden hacer muchas
otras cosas.

Entonces, ¿que puedes hacer para "personalizar" las colisiones de tu juego?.
Hay muchas formas, una podría ser: "crear una nueva función similar a
'spritecollide' pero que verifique colisiones de otra forma'.

Observa el siguiente ejemplo, es la función que utilizo en el juego que mencioné:

Código: Seleccionar todo
def colision_de_grupos(sprite, group):
    crashed = []
    spritecollide = sprite.rect_colision.colliderect

    for s in group:
        if spritecollide(s.rect_colision):
            crashed.append(s)

    return crashed


Esta función es muy similar a "spritecollide", recibe un sprite y un grupo,
evalúa si existen colisiones y devuelve una lista de todos los elementos que
colisionan con el argumento 'sprite'.

Si quieres otro ejemplo puedes observar el proyecto "PixelPerfect" de John
Eriksson:

http://arainyday.se/projects/python/PixelPerfect/

John también escribe una función similar a 'spritecollide', pero agrega una
rutína que verifica colisiones en base a los píxeles de una imagen (en
realidad, usando una máscara de la imagen).

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

Re: ¿Como hacer colisiones mas realistas? (Pygame)

Notapor endaramiz » Jue Nov 08, 2007 4:46 pm

Muchas gracias Hugo. Esto es lo que estaba buscando, me ha sido de gran ayuda.

También dije:
dvd escribió:Estaría bien si [...] en vez de utilizar rectángulos se pudiesen utilizar circunferencias etc..

He encontrado una solución para eso:
El código ese funciona con rectángulos, pero una circunferencia se puede descomponer en rectángulos de una manera mas o menos realista. En esta figura se muestra como sería el rectángulo de la imagen (rojo) y como con solo 3 (verdes) se puede aumentar considerablemente el realismo.
Imagen

Para trabajar mejor con estos 3 rectángulos podemos ponerlos en una lista y alinearlos al centro de la circunferencia. Os muestro mi ejemplo:
(en el def __init__(): del sprite)
Código: Seleccionar todo
startpos = (50,50)
rect1 = pygame.Rect ((0,0,23,11))
rect2 = pygame.Rect ((0,0,19,19))
rect3 = pygame.Rect ((0,0,11,23))
self.rectangulos = [rect1, rect2, rect3]
self.rectangulos[0].center = startpos
self.rectangulos[1].center = startpos
self.rectangulos[2].center = startpos


Y hacer una modificación en la función "colision_de_grupos" para que se compruebe si colisionan los 3 rectángulos:
Código: Seleccionar todo
def colision_de_grupos(sprite, group):
   crashed = []
   
   for sprite_in_group in group:
      for rectangulo in sprite.rectangulos:
         if rectangulo.colliderect(sprite_in_group.rect):
            crashed.append(sprite_in_group)
            break
   return crashed



Igualmente daré un vistazo a "PixelPerfect" que parece interesante para situaciones mas complicadas.

Saludos.
Avatar de Usuario
endaramiz
 
Mensajes: 283
Registrado: Vie Ago 31, 2007 9:25 am
Ubicación: Barcelona


Volver a General

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados

cron