colisiones en pygame

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

colisiones en pygame

Notapor xulubkisin » Vie Jun 19, 2009 3:59 pm

hola, soy nuevo en lo de crear juegos con pyton, y he empezado a crear un laberinto, el cual es una imagen png, y para atravesarlo una bola que es tambien en png, pero aun no se como crear una colision entre la bola y el laberinto, para que no pase derecho, me gustaria que me ayudaran, para aprender a hacerlo.

[img=http://img200.imageshack.us/img200/2229/laberinto.th.png]

esta es la imagen de el laberinto, y hay esta la bola que quiero que lo atraviese, pero no se como hacer la colision para esa imagen del laberinto completa[/img]
xulubkisin
 
Mensajes: 8
Registrado: Vie Jun 19, 2009 3:46 pm

Notapor endaramiz » Sab Jun 20, 2009 4:40 pm

¿El laberinto entero es una sola imagen? Una manera más fácil sería tener una imagen de un cuadradito y una matriz que representaría el laberinto. Por ejemplo:
Código: Seleccionar todo
10111
10001
10101
11101

Y luego, tener una función que le pasas la matriz y te dibuja el mapa.
Si en vez de utilizar una circunferencia como personaje, utilizas un cuadrado, te será más fácil la colisión.

Igualmente, también puedes tener una imagen con todo el mapa y hacer hacer colisión por píxel. Hay un ejemplo sobre esto.

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

Notapor xulubkisin » Dom Jun 21, 2009 2:05 pm

pues es que el laberinto que quiero es una imagen completa.

entonces queda muy dificil hacerlo?
xulubkisin
 
Mensajes: 8
Registrado: Vie Jun 19, 2009 3:46 pm

Notapor Geo » Dom Jun 21, 2009 6:44 pm

Algo muy preciso, fácil de implementar, pero lento, es colisión pixel por pixel.

Recorre la imagen de la pelota pixel por pixel, para cada pixel comparas con su posición correspondiente en la imagen del laberinto, si en algún momento encuentras que los colores del círculo que representa al jugador coinciden con el de las paredes del laberinto, es que ha habido una colisión.

Como dije, es fácil de implementar, pero muy lento para un juego porque se está perdiendo mucho tiempo en hacer la verificación pixel por pixel, pero aún así, podría ser aceptable para tu juego, ya que no es tan complicado :).

Hay varias formas de intentar optimizar esto, una es la que lacabra mencionó, extendiéndola, podrías representar al jugador con un cuadro (solamente para las colisiones), las paredes del laberinto como un conjunto de cuadros, checas si hay colisión entre dichos cuadros y, si la hay, entonces haces la verificación pixel por pixel. Es decir, sigues usando la colisión pixel a pixel (que es necesaria por la diferencia de formas círculo - cuadrado), pero no la ejecutas tantas veces.

En esta página encuentras un poco de información básica sobre colisiones en 2D:
http://www.vb-mundo.com/Deteccion-Colisiones-2D.asp

Suerte.
La imaginación es el límite.
Visita mi blog en inglés o en español.
Geo
 
Mensajes: 244
Registrado: Jue Ago 10, 2006 3:51 am
Ubicación: México

Notapor xulubkisin » Lun Jun 22, 2009 7:37 pm

en otro tema esta publicado el codigo, a ver si asi me ayudan mas facil, por que la verdad no he entendido muy bien, tengan en cuenta que apenas estoy empezando http://www.losersjuegos.com.ar/foro/viewtopic.php?t=578
xulubkisin
 
Mensajes: 8
Registrado: Vie Jun 19, 2009 3:46 pm

Notapor xulubkisin » Mié Jun 24, 2009 4:48 pm

endaramiz escribió:Una manera más fácil sería tener una imagen de un cuadradito y una matriz que representaría el laberinto. Por ejemplo:
Código: Seleccionar todo
10111
10001
10101
11101

Y luego, tener una función que le pasas la matriz y te dibuja el mapa.
Si en vez de utilizar una circunferencia como personaje, utilizas un cuadrado, te será más fácil la colisión.



ya lo intente asi como dijiste y no pude, por que al momento de crear el mapa en el block de notas solo me deja crear un mapa de 1024 caracteres y yo lo necesito mas grande, mas o menos de 5000 * 5000 y que sea en este estilo:
1101111
1000001
1011101
1011101
1111001
1100011
1101111 pero el pygame no me lo lee asi, quien me ayuda?
xulubkisin
 
Mensajes: 8
Registrado: Vie Jun 19, 2009 3:46 pm

Notapor lacabra25 » Mié Jun 24, 2009 10:45 pm

xulubkisin escribió:ya lo intente asi como dijiste y no pude, por que al momento de crear el mapa en el block de notas solo me deja crear un mapa de 1024 caracteres y yo lo necesito mas grande, mas o menos de 5000 * 5000 y que sea en este estilo:
1101111
1000001
1011101
1011101
1111001
1100011
1101111


Ya por lo del blog de notas voy a suponer (corrigeme si me equivoco) que usas windows, no me voy a poner a hablar aqui de gustos suicidas; vale que sea windows, que sea lo peor que uno pueda encontrar bajo el nombre "sistema operativo" y todo eso, pero no creo ke ahora, como novedad, el blog de notas solo pueda trabajar con archivos de 1Kb, si puede ser que al llegar a los 1024 caracteres te siga mostrando los carracteres debajo, por el ajuste automatico del texto, pero se supone que al guardar, aunque el siga en la linea de abajo si tu no has pulsado enter no hay una nueva linea por lo que al leerlo desde pygame deberia de leerse sin final de linea como si estuviera en una sola linea, de todos modos si el problema esta en el final de linea puedes sencillamente ignorar el final de linea al leer el mapa y utilizar otro caracter para separar una linea de otra al leer el mapa, por ejemplo un # que al leerlo desde pygame ya te hara saber que lo que sigue es una nueva linea. Otra opcion es que dejes de lado el bloc de notas (digo el bloc de notas pero si dejas de lado windows por completo mejor) y usar otro editor o programar un editor de mapas.
Esta cuenta ahora a pasado a la cuenta jhg
Avatar de Usuario
lacabra25
 
Mensajes: 222
Registrado: Mié Abr 02, 2008 9:45 pm
Ubicación: Tenerife (España)

Notapor Juanxo » Jue Jun 25, 2009 10:40 am

buenas:

No se como estarás intentando hacerlo, pero la forma más rápida de hacerlo es mapa = archivo.readlines()
Avatar de Usuario
Juanxo
 
Mensajes: 437
Registrado: Sab Ene 31, 2009 2:34 am
Ubicación: Madrid(España)

Notapor endaramiz » Sab Jun 27, 2009 2:38 pm

Si quieres complicarte la vida lo menos posible, lo más fácil es poner la matriz directamente en el código, en vez de leerla de un archivo a parte:
Código: Seleccionar todo
matriz = [[1,0,1,1,1],
          [1,0,0,0,1],
          [1,0,1,0,1],
          [1,1,1,0,1]]



Para hacer las colisiones, puedes pensar en el personaje como 4 puntos (un cuadrado, que se puede representar en un 'rect'). Si uno de estos puntos corresponden a una posición de la matriz que tiene un 1, hay colisión. Esto es cierto si el personaje es más pequeño que un cuadrado del laberinto.

Pistas: para conseguir la posición de los puntos del cuadrado, hace falta saber su posición, la altura y la anchura.
Para saber que posición de la pantalla corresponde a qué posición de la matriz, necesitas saber qué anchura y altura representa cada posición de la matriz en la pantalla.

Si aun así no te sale, ya te pondré la fórmula.

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


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