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.
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.
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.
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.
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.
Sí, ya lo hice je,je. Voy a coger tu código y mirar como lo planteaste. Gracias.