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?
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.
gracias viejo, me parece interesante lo de dividir la pantalla en sectores
pd: yo tambien vivo en .ar
de nada! ;) saludos compatriota! :P
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.
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++.
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 :))