Problema con bloques en un arkanoid

Started by ruboslav, March 31, 2011, 11:27:07 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

ruboslav

Invoco al Cónclave para intentar resolver una duda con la que llevo días y que no soy capaz de resolver. Intento hacer un juego tipo arkanoid de sobra conocido por todos. Para ello, he cogido el código del ejemplo que viene en el Bennupack (Breakout) y que es el mismo que vienen en el nunca suficientemente bien ponderado manual de Bennu. ¿Donde aparece el problema? lo explico. Primero el código:

             if(idbloque!=0)//we hit a block

if(abs(idbloque.y-y+vy)>8)//we hit the top or bottom :)

vy=-vy;

end

if(abs(idbloque.x-x+vx)>16)//we hit the left/rgiht

vx=-vx;

end

while(idbloque!=0)//we don't necessarily hit 1 block
if (idbloque.graph==2)   

idbloque.graph=4;

elif (idbloque.graph==3)

idbloque.graph=2;

elif (idbloque.graph!=1)
blocksleft--;//we hit this block

signal(idbloque,s_kill);
                                  end//and remove it

idbloque=COLLISION(type bloque);//and see if there's another block we collide with (every time you call collission, it gives the next item it collides with, and whenever you do a frame;, you start at the first one again)
//end

end


Esta es la parte donde la bola golpea un bloque tal y como vienen en el manual / código de ejemplo exceptuando esto:


               if (idbloque.graph==2)   

idbloque.graph=4;

elif (idbloque.graph==3)

idbloque.graph=2;

elif (idbloque.graph!=1)
blocksleft--;//we hit this block

signal(idbloque,s_kill);


que lo he escrito yo. Lo de los cambios de gráfico de 2 a 4 y de 3 a 2 es porque al golpear un tipo de bloques cambian de aspecto. No dejan de ser bloques a los que hay que darles tres golpes para romperlos. Nada raro ahí. El problema viene con elif (idbloque.graph!=1) esto lo pongo porque el gráfico 1 es un bloque irrompible, la bola rebota en él pero no lo rompe. El problema viene con que si la bola da en una esquina de un bloque o justo en la union de dos bloques, a veces rebota en sentido contrario al que se espera. No sería un problema tan grave si no fuera porque con los bloques que no se rompen se corre el riesgo (y pasa muy a menudo) en que la bola rebote una y otra vez contra (por ejemplo) la pared y el bloque irrompible y del bloque irrompible a la pared quedando en un bucle infinito. Vamos, que la bola queda atascada. Esto también pasa si el mapa tiene una fila de bloques irrompibles, va de izquierda a derecha y de derecha a izquierda y como los bloques no rompen se queda así ad eternum.

No sé si me he explicado, pero la cosa se resolvería con que cuando la bola impacta entre dos bloques rebotara bien y no se fuera al lado contrario. Os lo voy a poner más facil ¿sabeis de algun juego de este tipo escrito en Bennu que no sea tan simple como el del ejemplo? igual en un código así se contempla este problema y como resolverlo con un algoritmo mejorado. Me he acordado del código que venía con el DIV no sé si lo recordais, venía un juego de este palo pero no lo encuentro por ahi.

Un saludo.

Fede

Hola.

No soy bueno leyendo códigos y te respondo en base a lo que has escrito en texto.

Yo añadiría un factor aleatorio al rebote para que los ángulos no sean siempre iguales.

Me explico:

Que la bola rebote en el ángulo que se espera, pero añádeles unos grados de random, de manera que si te sale por ejemplo 90º el random te de un resultado entre 85º y 95º. Con esto debería de salir de los bucles a la larga.

Espero haberte servido de ayuda más que de estorbo. :D

Saludos.
Si quieres ser sabio, aprende a interrogar razonablemente, a escuchar con atención, a responder serenamente y a callar cuando no tengas nada que decir.

ruboslav

#2
Sí, eso ya lo pensé y lo hice, además creo que es esencial poner un random para que las trayectorias no siempre sean iguales pero el caso es que aunque efectivamente al final la bola sale y no se atasca, el tema esencial es que sigue haciendo rebotes "raros" cuando da entre dos bloques o en la esquina de uno. Yo nunca he visto un arkanoid que la bola vaya izquierda,derecha,izquierda,derecha cuando rebota contra bloques irrompibles o contra una pared, si no que va o a la izquierda o a la derecha pero no hace lo que le sale...

EDITO: lo he resuelto (parece) cambiando esto:

                      if(abs(idbloque.y-y+vy)>14)//we hit the top or bottom :)
vy=-vy;
end


if(abs(idbloque.x-x+vx)>25)//we hit the left/rgiht

vx=-vx;
                       end



Ahora no hace cosas caoticas, no obstante si alguien puede decirme de un codigo fuente de este tipo de juegos hecho en DIV/Fenix/Bennu me vendría bien. Gracias.

ruboslav

Pues no  :( sigue dando problemas. Por favor, si alguien me puede decir de un algoritmo más elaborado bien sea porque sabe de algun código que haya por ahí o se le ocurre algo que me lo haga saber.

DCelso

habria que analizar todo el codigo de movimiento de la bola, pero el problema debe de estar en que por algún lado vy se te pone a 0 y esto hace que el rebote sea eterno. Creo que a mi me pasó algo parecido cuando probé el código del arcanoid del tutorial de osk, lo solucioné replanteándome el problema desde cero y creo que lo apliqué al muro de mi apagame, así que bájate mi apagame y vichea mi código a ver si te aclara algo.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

ruboslav

Sí, ya lo hice je,je. Voy a coger tu código y mirar como lo planteaste. Gracias.