CicTec wrote:Un pequeño ejemplo del codigo que has mostrado que ejecute el problema del sonido para analizar si es un bug de Gemix o algun bug del codigo, porque asi parece ser correcto.
Ok, el parametro 0 esta bien.
Acerca el problema, podrias dar algun detalle mas ? cuando el laser colisiona con un asteroid se produce mas de un sonido segun entendi, no ?
Hola @CicTec, el problema es que al ir destruyendo 2 ó más asteroides seguidos, se solapan los sonidos de explosión de cada uno de ellos llegando a ensordecer
Pego aquí el .prg completo y a ver si veis algo...el código que maneja los asteroides es el proceso Asteroides:
- Code: Select all
//-------------------------------------------------------------------
// TITULO: Yolipeich (Tutorial 1 modificado)
// AUTOR: Cobra
// FECHA: --/--/--
//-------------------------------------------------------------------
PROGRAM YoliPeich;
//import "ss1.dll";
GLOBAL
puntuacion = 0; // Variable para guardar la puntuación
vidas = 3; // número de vidas del jugador
id_cancion; // identificador de la canción cargada
disparando = 1; // flag para evitar el disparo continuo
explosion; // id del sonido de explosión de la nave
id_disparo; // id del sonido del disparo
velocidad = 0; // velocidad de la nave
n_disparos = 0; // número de veces que se dispara
aciertos = 0; // número de meteoritos destruidos
porcentaje = 0; // porcentaje de aciertos
nivel = 1; // Variable para guardar el nivel superado
BEGIN
load_fpg("FPG/tutor1.fpg"); // Se carga el fichero de gráficos
load_fnt("FNT/tutor1.fnt"); // Se carga el tipo de letras
id_cancion = load_song("Musica/ADEJESUS.XM", 1); // Se carga la música principal del juego
explosion = load_wav("Sonidos/explosi8.wav", 0);
id_disparo = load_wav("Sonidos/dispar01.wav", 0);
start_fli("Animaciones/help.fli", 0, 0); // Se inicia una animación.
while(frame_fli()) //reproduce la animación anterior
frame;
end
menu();
END
//-------------------------------------------------------------------
// Maneja la nave protagonista
// Entradas: Coordenadas y código del gráfico
//-------------------------------------------------------------------
PROCESS nave(x, y, graph)
BEGIN
velocidad=0;
LOOP
// Comprueba si se pulsan las teclas de izquierda o derecha
// Y modifica el ángulo si están pulsadas
IF (key(_left)) angle = angle + 10000; END
IF (key(_right)) angle = angle - 10000; END
// Si se pulsa la tecla de arriba, la nave avanza
IF (key(_up))
velocidad += 2;
if(velocidad > 16) velocidad = 16;end
advance(velocidad);
else
velocidad -= 1;
if(velocidad < 0) velocidad = 0;end
END
IF (key(_down))
velocidad -= 2;
if(velocidad < 0) velocidad = 0;end
advance(velocidad);
END
// Si se pulsa la tecla control crea un proceso del tipo disparo
IF (key(_control))
if(disparando)
disparando = 0;
sound(id_disparo, 256, 256);
disparo(x, y, angle);
end
else
disparando = 1;
END
if(collision (type asteroide))
sound(explosion, 255, 255);
vidas--;
from graph = 43 to 62;
frame;
end
if(vidas == 0)
signal(type asteroide, s_kill);
break;
end
let_me_alone();
signal(id, s_kill);
nave(400, 300, 41);
from x = 1 to 4; asteroide(1); end // Crea 4 asteroides grandes
from x = 1 to 4; asteroide(21); end // Crea 4 asteroides peque¤os
end
// Corrige las coordenadas, para que la nave no desaparezca de pantalla
corrige_coordenadas();
FRAME; // Hace aparecer el gráfico de la nave en pantalla
END
if(n_disparos == 0)
porcentaje = 0;
else
porcentaje = (aciertos * 100) / n_disparos;
end
write(1, 400, 300, 1, "FIN DEL JUEGO");
write(1, 400, 350, 1, "ACIERTOS:");
write_int(1, 400, 400, 1, offset porcentaje);
write(1, 450, 400, 1, "%");
while(scan_code == 0)
frame;
end
puntuacion = 0;
stop_song();
unload_song(id_cancion);
fade_off();
menu();
END
//-------------------------------------------------------------------
// Proceso disparo
// Crea los disparos de la nave protagonista
// Entradas: Coordenadas y ángulo del gráfico
//-------------------------------------------------------------------
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
//-------------------------------------------------------------------
// Proceso asteroide
// Maneja todos los asteroides del juegos tanto grandes como pequeños
// Entradas: Código del tipo de asteroide que es su gráfico inicial
//-------------------------------------------------------------------
PROCESS asteroide(codigo)
sonido = 0; // Variable para guardar el canal del sonido de la explosion del asteroide
BEGIN
LOOP
// 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
IF (collision (TYPE disparo)) 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
puntuacion = puntuacion + 5; // Suma 5 puntos a la puntuación
END
// Pone la animación de la explosion mediante un bucle y reproduce sonido explosión
soundchannel_stop(sonido);
sonido = sound(explosion, 255, 255);
FROM graph = 43 TO 62; FRAME; END
END
//-------------------------------------------------------------------
// Proceso corrige_coordenadas
// Corrige las coordenadas del proceso que los llama haciendo
// que dichas coordenadas sean cíclicas en pantalla
//-------------------------------------------------------------------
PROCESS corrige_coordenadas()
BEGIN
// Si se sale por la izquierda hace que aparezca por la derecha
// restando para ello el ancho de pantalla
IF (father.x < -20) father.x = father.x + 840; END
// Si se sale por la derecha hace que aparezca por la izquierda
IF (father.x > 820) father.x = father.x - 820; END
// Si se sale por arriba hace que aparezca por abajo
IF (father.y < -20) father.y = father.y + 620; END
// Si se sale por abajo hace que aparezca por arriba
IF (father.y > 600) father.y = father.y - 620; END
END
process inicia_juego()
begin
unload_song(id_cancion);
delete_text(all_text);
id_cancion = load_song("Musica\ADEJESUS.XM", 1);
song(id_cancion);
fade_off();
fade_on();
vidas = 3;
nave(400, 300, 41); // Crea el proceso nave
write(1, 75, 0, 1, "NIVEL:");
write_int(1, 190, 0, 1, OFFSET nivel); // Muestra el nivel actual
write(1, 350, 0, 1, "PUNTOS:");
write_int(1, 500, 0, 1, OFFSET puntuacion); // Muestra la puntuacion
write(1, 670, 0, 1, "VIDAS:");
write_int(1, 770, 0, 1, OFFSET vidas); // Muestra el número de vidas
FROM x = 1 TO 4; asteroide(1); END // Crea 4 asteroides grandes
FROM x = 1 TO 4; asteroide(21); END // Crea 4 asteroides pequeños
end
process menu()
begin
let_me_alone();
id_cancion = load_song("Musica\help.xm", 1); // Se carga la música del menú
song(id_cancion);
aciertos = n_disparos = porcentaje = 0;
delete_text(all_text);
//set_mode(m640x480); // Pone el modo de video 640 x 480
set_mode(m800x600); // Pone el modo de video 640 x 480
load_pal("FPG\tutor1.fpg");
set_fps(24, 0); // Número de imágenes por segundo
fade_on();
put_screen(0, 64); // Pone la pantalla de fondo
write(1, 400, 0, 1,"/*YOLI-PEICH*\");
write(1, 405, 30, 1,"=========");
write(1, 410, 300, 4,"PULSA INTRO PARA JUGAR");
write(1, 410, 390, 4," O ESCAPE PARA SALIR");
repeat
if(key(_esc)) stop_song(); exit("Gracias por jugar a YOLI-PEICH",0); end
frame;
until(key(_enter))
inicia_juego();
end