Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





breakout, colision con los ladrillos

Iniciado por pylorca, 03 de Febrero de 2007, 09:57:24 PM

« anterior - próximo »

pylorca

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?

McKrackeN

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.
aludos,

Juan Pablo (McKrackeN) Bettini
Capital Federal
Argentina

http://www.zakengine.com

pylorca

gracias viejo, me parece interesante lo de dividir la pantalla en sectores

pd: yo tambien vivo en .ar

McKrackeN

aludos,

Juan Pablo (McKrackeN) Bettini
Capital Federal
Argentina

http://www.zakengine.com

marcode

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.
size=9]afortunadamente siempre ha habido alguien dispuesto a reinventar la rueda, de lo contrario seguiríamos usando un disco de piedra con un agujero.[/size]

zupervaca

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++.

pylorca

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 :))






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.