Hola Thurderon,
Pues hay algunos errores en el codigo:
El proceso "disparo": tiene la siguiente forma:
PROCESS disparo(x,y,angle)
BEGIN
n_disparos++;
// Hace un avance inicial y define el gráfico a usar
advance(24); graph = 42;
// Mientras el gráfico esté dentro de pantalla
WHILE (NOT out_region(id, 0))
if(collision (type asteroide))
aciertos++;
break;
end
// Hace que avance en el ángulo que tenga predeterminado
advance(16);
FRAME; // Hace que el gráfico aparezca en pantalla
END
signal(id, s_kill);
END
El if de collision es redundante ya que se esta utilizando tambien en el proceso "asteroids" e podria incluso procurar algun problema de conflicto.
La llamada a signal(id, s_kill); es tambien redundante porque despues hay el END del proceso que termina automaticamente la ejecucion del mismo una vez ejecutada.
El codigo correcto del proceso seria lo siguente:
PROCESS disparo(x,y,angle)
BEGIN
n_disparos++;
// Hace un avance inicial y define el gráfico a usar
advance(24); graph = 42;
// Mientras el gráfico esté dentro de pantalla
WHILE (NOT out_region(id, 0))
// Hace que avance en el ángulo que tenga predeterminado
advance(16);
FRAME; // Hace que el gráfico aparezca en pantalla
END
END
La gestion de destruccion del laser y actualizacion de las variables puede ser gestionada dal proceso asteroids.
En el proceso asteroids hay varios errores:
Hay una declaracion de variable sin la seccion PRIVATE o PUBLIC y tecnicamente deberia dar error de compilacion (lo que aparece en la version que tengo yo).
El resto del codigo tiene 2 bucles loop, y la llamada a collision genera un "break" que hace salir solo del primer bucle, no lo habia mirado al principio y por ende la animacion y reproduccion del sonido no se produce
El codigo optimal deberia ser lo siguiente:
PROCESS asteroide(codigo)
PRIVATE
disparo_col = 0;
BEGIN
// Crea el asteroide en la esquina superior izquierda
// (Coordenadas: 0,0) y asigna el c¢digo de gráfico
x = 0; y = 0; graph = codigo;
// Elige un ángulo al azar
angle = rand(-180000, 180000);
LOOP
// Anima el gráfico, sumando uno a su c¢digo
graph = graph + 1;
// Si sobrepasa el limite de la animación, la reinicia
IF (graph == codigo + 20) graph = codigo; END
// Hace avanzar el gráfico en la direccion determinada
advance(4);
// Si colisiona con el gráfico del disparo sale
// del bucle, que de otra manera no tiene final
disparo_col = collision(TYPE disparo);
if(disparo_col != 0)
aciertos++;
puntuacion = puntuacion + 5; // Suma 5 puntos a la puntuación
sound(explosion, 255, 255);
signal(disparo_col, s_kill);
// Pone la animación de la explosion mediante un bucle y reproduce sonido explosión
FROM graph = 43 TO 62; FRAME; END
break;
end
// Corrige las coordenadas para que no desaparezca de
// pantalla, haciendole aparecer por el otro lado
corrige_coordenadas();
FRAME; // Hace que el gráfico salga en pantalla
END
END
- La variable "sonido" desaparece porque no es mas necesaria, asi como la llamada a SOUNDCHANNEL_STOP.
- El bucle mas interno desaparece porque no hace falta, solo es suficiente el primero.
- Las inicializaciones de X, Y, GRAPH y ANGLE van fuera del bucle al principio del codigo, porque solo es necesario inicializarlos una vez.
- Se declara una nueva variable "disparo_col" que guarda el ID devuelto por COLLISION para averiguar la colision entre un laser y el asteroid.
- Una vez que "disparo_col" sea distinto de 0, significa que hay colision entre un laser y el asteroids, entonces:
--- se actualizan las variables.
--- se reproduce el sonido de la explosion
--- se hace una llamada a signal del proceso laser que colisiona para destruirlo (ya que tiene LOOP infinido).
--- se reproduce la animacion de la explosion
--- se hace una llamada a "break" para salir del LOOP infinido del proceso y llegar al END asi da terminar la ejecucion del proceso.
Con esto el juego deberia funcionar segun las aspectativas.