Foros - Stratos

Programadores => Programación gráfica => Mensaje iniciado por: pylorca en 03 de Febrero de 2007, 09:57:24 PM

Título: breakout, colision con los ladrillos
Publicado por: pylorca en 03 de Febrero de 2007, 09:57:24 PM
bueno, me estoy iniciando en C++ (vengo de programar en python, en el trabajo lo sigo usando) y SDL

como mi 1er jueguito me decid'i a hacer un clon del breakout.

he creado (en parte) una clase CSprite con un metodo int colision(CSprite* sprite);

el tema es que no se como hacer eficientemente la colision con los ladrillos, ya que si tengo un arrary de 20x10 ladrillos tendria que hacer 200 comprobaciones por cada frame, y creo que se volveria algo "pesadito"

intento manejar los ladrillos como si fueran sprites, ya que algunos para romperse deberian ser golpedados 2 veces...

que me recomendais ustedes?
Título: breakout, colision con los ladrillos
Publicado por: McKrackeN en 03 de Febrero de 2007, 10:12:28 PM
Por empezar podrías dividir la pantalla en zonas. Si la bolita esta dentro de una de ellas, chequeas la colisión solo contra los ladrillos de dicha zona.

Otra optimización que podés hacer es chequear grupos de ladrillos encerrados en un círculo. La colisión por círculos es mucho más rápida (obviamente si simplificás la raiz cuadrada para hacerla desaparecer porque es muy lento).

Por ejemplo:  raizcuadrada(distancia1^2 + distancia2^2) <= radio1+radio2 te quedaría distancia1^2 + distancia2^2 <= (radio1+radio2)^2.

Luego, si colisionan ambos círculos, recién allí chequeas por cajas.
Título: breakout, colision con los ladrillos
Publicado por: pylorca en 03 de Febrero de 2007, 10:47:15 PM
gracias viejo, me parece interesante lo de dividir la pantalla en sectores

pd: yo tambien vivo en .ar
Título: breakout, colision con los ladrillos
Publicado por: McKrackeN en 04 de Febrero de 2007, 02:55:30 AM
de nada! ;) saludos compatriota! :P
Título: breakout, colision con los ladrillos
Publicado por: marcode en 04 de Febrero de 2007, 05:11:54 PM
Yo para sólo 200 ladrillos no me complicaría en dividir en sectores (a menos que quieras aprender a hacerlo). Puedes hacer una comprobación previa de cada uno de ellos más o menos así:
for (i ...
if (Bola.X > Ladrillo[i].X-20  && BolaX < Ladrillo[i].X+20 .... (y con las Y)
{
    VerificarColisionPrecisa(...
}

No creo que tenga apenas penalización el hacer esto. Aunque como estás iniciandote tampoco te vendrá mal que practiques con los quadtrees.
Título: breakout, colision con los ladrillos
Publicado por: zupervaca en 05 de Febrero de 2007, 11:47:06 AM
Tienes el codigo fuente del arkaretro+dib aqui: http://www.codeplex.com/dibMe/Release/ProjectReleases.aspx
El sistema clasico de tiles de toda la vida creo que es la mejor opcion.
El proyecto lo hice para moviles con j2me, pero no creo que tengas problemas en entenderlo sabiendo c++.
Título: breakout, colision con los ladrillos
Publicado por: pylorca en 05 de Febrero de 2007, 11:20:44 PM
gracias por las respuestas.

Estoy tratando de aplicar todo lo que pueda en este breakout, un poco de fisica (algo asi como un poco de aceleracion y desaceleracion cuando se mueve la paleta, etc...), uso de la STL (de C++ ya q como dije estoy aprendiendo), aplico sistema de tiles extendiendo una clase sprite y demas cosas para tratar de abarcar lo mas que pueda...

luego de terminar el breakout seguramente me tirar'e a hacer algun juego de plataformas (el cual mi intencion tambien es tratar de abarcar lo mas posible,  fisica, IA, etc)

y una vez terminado una version jugable del de plataformas me voy a tirar mas a lo 3D, igual todavia me falta mucho por aprender


Saludos y gracias por sus ayudas (seguramente los voy a seguir molestando con mis preguntas :))