Colision con plataformas hechas de Sprites

Colision con plataformas hechas de Sprites

Notapor diego_g_09 » Mar Oct 18, 2011 3:24 am

Buenas, estoy haciendo un juego de plataformas, ahora estoy implementando las colisiones del personaje principal y las diferentes plataformas, estas plataformas son Sprites (no son tiles), debido a que el juego no tendrá scrolling y las plataformas podrán tener distintos movimientos (girar sobre su eje, horizontal, vertical, etc). Si bien he logrado hacer que colisione mi personaje con las plataformas no se si el método a sido el mas optimo, además de que cuando el personaje esta encima de una plataforma, esta hace un efecto raro "como que no sincroniza cuando hace el blit" por lo tanto quería consultar si existe algún ejemplo o alguna manera de hacer esto lo mas optimo posible y sin que ese efecto "raro" aparezca. Además quiciera que mi personaje solo colisione "por los pies" no todo el rectangulo, como puedo hacer esto mediante rect? algún ejemplo o algo?,
Gracias!

Saludos
Diego
diego_g_09
 
Mensajes: 21
Registrado: Sab Ago 07, 2010 11:58 pm

Re: Colision con plataformas hechas de Sprites

Notapor MrBB4 » Mar Oct 18, 2011 5:46 pm

Buenas.
Pues no entendí bien lo del efecto raro. Talves si nos muestras el codigo podamos identificar el problema. En lo que si te puedo ayudar es en que el personaje solo colicione con los pies. A principio de año me habia puesto a hacer un juego del mismo estilo del que nos comentas, lo que hice fue crear una función gravedad(), dentro de la clase de tu personaje, en donde si el personaje no estab tocando nada que cayera, en caso contrario que revisara que eran solo los pies. Te muestro el codigo:
def Gravedad(self):
for obj in Objeto:
if not self.rect.colliderect(obj.rect) and not self.SALTANDO:
self.CAYENDO = True
elif self.rect.bottom >= obj.rect.top and self.rect.bottom <= obj.rect.top+10 and not self.JUMPING:
self.CAYENDO = False
self.recty = obj.rect.top+2
break


Entonces, si te fijas primero revisa que no esté tocando nada y que además no esté saltando, de este modo tu personaje podrá atravesar el objeto y pasar hacia arriba, si las dos condiciones se cumplen el personaje caerá. En caso de que de que haya un impacto el programa verificará si la base del personaje (self.rect.bottom) está por debajo debajo, o a la misma altura, del tope del objeto (obj.rect.top). Para esto se usa el signo de >= ya que self.rect.bottom y obj.rec.top son la cordenada Y de la base y el tope de los objetos rect, correspondientemente; y como sabemos, en programación a diferencia de las matemáticas, en plano carteciano la Y crece hacia abajo. Luego de esto el programa verifica que self.rect.bottom sea menor a obj.rect.top más 10 pixeles. Entonces, lo que estamos haciendo es que estamos haciendo es verificar que la base de nuestro personaje se encuentre dentro de los primeros 11 pixeles del objeto, esto es una medida que tuve que aplicar para evitar que el personaje pasara de largo ya que la velocidad de caida del personaje era de más de un pixel por loop, por lo que si el tope del objeto estaba por ejemplo en (x, 5) y la base de mi personaje se encontraba en (x, 4) y hacia un salto de dos pixeles iva a acabar por debajo de (x, 5) y el personaje simplemente caería al vacio.
Otro pequeño detalle, si te fijas dentro del elif dice self.recty = obj.rect.top+2. Esto hará que el personaje, si se pasó de largo, vuelva arriba y no se note. Pero lo que quería destacar es el +2 (osea dos pixeles dentro del obj). Lo puse así porque se veia más estetico de esta manera con los sprites que yo estaba usando, talves con los tuyos no. Arreglalo a tu gusto.

Espero haber contestado a tu necesidad y que no haya sido muy confuso. Si algo no te quedó claro, pregunta tranquilo que yo te contesto ;)
Avatar de Usuario
MrBB4
 
Mensajes: 49
Registrado: Mar Dic 14, 2010 11:39 pm
Ubicación: Purto Madryn, Chubut, Argentina.

Re: Colision con plataformas hechas de Sprites

Notapor diego_g_09 » Mar Oct 18, 2011 10:52 pm

Buenas, primero que nada estoy trabajando con python, y pygame. Luego contarles que realizando algunas pruebas pude determinar a que se debía el efecto "raro", y es que tenia los sprites plataformas en un group distinto al group que tenia el personaje principal, por lo tanto cuando realizaba el update, clear y draw lo hacia desincronizado y producía ese efecto. Esto se arreglo creándome un group self.grupoAllSprites = pygame.sprite.RenderUpdates () y metiendo todos los sprites en el y en vez de realizar dos update, clear y draw (uno por cada group que tenia) solo realize uno para grupoAllSprites y el efecto desapareció.

Con respecto a la ayuda de MrBB4 que me pareció excelente y muy bien explicada!! y que voy a aplicar cuanto antes, tengo una duda, yo había implementado algo medio parecido pero no lo había hecho en la clase personaje y si en la clase Escenario, la cual realizaba el control de la siguiente manera:

for plataforma in pygame.sprite.spritecollide(personaje, self.grupoPlataformas, False):
if plataforma.rect.y <= personaje.rect.y + personaje.rect.height + 10 and plataforma.rect.y >= personaje.rect.y + personaje.rect.height - 10:


Tengo 3 preguntas,
1: Objeto viene a ser como un group de plataformas??
2: la función colliderect que utilizaste viene a ser mas optima en rendimiento que spritecollide, la pregunta se debe a que estoy realizando el juego
para una pc que tiene unos recursos limitados de hardware y debo ser lo mas optimo posible.
3: Esta se debe también a optimizar, tu controlas la colisión desde la clase personaje, y yo en la clase escenario (mi decisión de crearlo en escenario es porque lo que hice fue modificar el típico método getDistanciaAlSuelo que se utiliza cuando se tienen Tiles, y puse el código que pegue arriba ) la pregunta es si quedaría mas optimo el control en la clase del personaje.

Muchas gracias por la ayuda!!
diego_g_09
 
Mensajes: 21
Registrado: Sab Ago 07, 2010 11:58 pm

Re: Colision con plataformas hechas de Sprites

Notapor MrBB4 » Mié Oct 19, 2011 12:46 am

Pues que bien que te haya servido! =D
En cuanto a tus dudas:
1- Si. El grupo objetos sería equivalente a Plataformas. Era para generalizar.
2- La verdad no se que diferencia hay entre coliderect y spritecollide pero siempre utilizo coliderect porque no me gusta derivar de la clase sprites, me parece innecesario.
3- Originalmente tambien yo había hecho la función fuera del personaje, pero utilizarla dentro del personaje ayudaría a hacerla más personalizada en el caso de los bots, ya que no todos serán iguales, tienen distintas velocidades de caido por lo que los numeros que se utilizan para evitar que se pasen de largo y cosas así serían distintos.

Suerte con tu proyecto ;)
Avatar de Usuario
MrBB4
 
Mensajes: 49
Registrado: Mar Dic 14, 2010 11:39 pm
Ubicación: Purto Madryn, Chubut, Argentina.


Volver a Videojuegos

¿Quién está conectado?

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