[GAME]: Juego de Naves (YoliPeich)

Proyectos en Desarrollo.

Re: [GAME]: Juego de Naves (YoliPeich)

Postby Thurderon » Wed Oct 05, 2016 11:28 am

shao wrote:El sonido se superpone cuando eliminas varias rocas, yo lo que suelo hacer es detener el que ya existe y reproducir uno nuevo en el momento de la explosión.


Mmmmmm, cierto, si explotas varios a la vez te quedas sordo :D ¿Cómo se podría hacer lo que dices?

¿En el collision stop_sound(); play_sound()?
User avatar
Thurderon
 
Posts: 144
Joined: Thu Sep 24, 2009 4:47 pm
Location: Alcobendas (Madrid)

Re: [GAME]: Juego de Naves (YoliPeich)

Postby shao » Wed Oct 05, 2016 2:18 pm

Thurderon wrote:
shao wrote:El sonido se superpone cuando eliminas varias rocas, yo lo que suelo hacer es detener el que ya existe y reproducir uno nuevo en el momento de la explosión.


Mmmmmm, cierto, si explotas varios a la vez te quedas sordo :D ¿Cómo se podría hacer lo que dices?

¿En el collision stop_sound(); play_sound()?


Cuando reproduces un sonido la misma reproducción se lleva a cabo por uno de los canales de sonido.
Hay que detener la reproducción en ese canal y iniciar una nueva.
El canal es devuelto por la función que se usa para reproducir el sonido así que es necesaria una variable que guarde el canal que devuelve esta función, después habrá que detener el sonido indicando cuál es el canal a detener.
User avatar
shao
 
Posts: 5983
Joined: Wed Jun 17, 2009 4:51 pm
Location: Alicante

Re: [GAME]: Juego de Naves (YoliPeich)

Postby CicTec » Sun Oct 23, 2016 4:09 pm

Thurderon wrote:
CicTec wrote:Creo que con el NP++ no deberia pasar esto, Simulatorone podra indicarte mejor.


Esto ya lo he corregido, ya no tengo problemas poniendo las rutas relativas :)

Pues mejor.

Thurderon wrote:
CicTec wrote:Lo del PRG va a gusto del programador, si quiere liberar el fuente lo libera, sino no.


Ok, éste por ser el primero y basado en tutorial DIV, lo iré poniendo, ya los demás (espero que vengan más...) me lo pensaré :) No por compartir (así todos aprendemos), sino por vaya a ser alguien malintencionado se adueñe del código, le cambie los gráficos y gane dinero a mi costa :P

Si claro, la decision del tipo de licencia del codigo es solo del autor, la razon es comprensible.

Thurderon wrote:
CicTec wrote:Lo he probado, como primer juego no esta mal, obviamente es cogido dal tutorial de DIV, asi que habra que poner grafica propria, audio, etc...
Digamos que va por buen camino, una pregunta, quedara a pantalla fija aumentando la dificuldad, o habra niveles tipo scroll ?
Animo con ello.


Lo de los gráficos no se, ahora mismo no tengo mucho tiempo para hacer los juegos....si además tengo que hacer los gráficos (que además soy mal grafista :P) ufffff.

Lo del fondo fijo o con scroll no lo había pensado...pero creo que lo dejaré fijo aumentando la dificultad simplemente. Ya haré otro con scroll.... 8-)

Bueno como veas, creo lo importante sea dar almenos a los nivels algo de dificuldad creciente y si es posible algo variado.
User avatar
CicTec
 
Posts: 16013
Joined: Thu Jul 31, 2008 10:18 pm

Re: [GAME]: Juego de Naves (YoliPeich)

Postby Thurderon » Sun Oct 23, 2016 7:54 pm

Hola de nuevo....pues no sé cómo hacer que sólo suene una explosión de asteroide a la vez...en el proceso que controla el asteroide tengo puesto lo siguiente:

Code: Select all
//-------------------------------------------------------------------
// 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
        // 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
END


Y siguen sonando a la vez todas las explosiones de asteroides :(
User avatar
Thurderon
 
Posts: 144
Joined: Thu Sep 24, 2009 4:47 pm
Location: Alcobendas (Madrid)

Re: [GAME]: Juego de Naves (YoliPeich)

Postby CicTec » Sun Oct 23, 2016 8:02 pm

Hola Thurderon,

Por lo que veo dal codigo estas utilizando bucles LOOP, esto a cada iteracion reproduce nuevamente una llamada a SOUND para la explision, el siguiente codigo:
Source Code (Gemix) [ Download ] [ Hide ]
  •       sonido = sound(explosion, 255, 255);
  •         FROM graph = 43 TO 62; FRAME; END
  •  

Deberia ir fuera de los bucles, deberian ser las ultimas 2 lineas ante del END del proceso, esto deberia solucionar el problema.
User avatar
CicTec
 
Posts: 16013
Joined: Thu Jul 31, 2008 10:18 pm

Re: [GAME]: Juego de Naves (YoliPeich)

Postby Thurderon » Sun Oct 23, 2016 8:14 pm

He cambiado de sitio el código de sitio y va igual :(

Code: Select all
//-------------------------------------------------------------------
// 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
User avatar
Thurderon
 
Posts: 144
Joined: Thu Sep 24, 2009 4:47 pm
Location: Alcobendas (Madrid)

Re: [GAME]: Juego de Naves (YoliPeich)

Postby CicTec » Sun Oct 23, 2016 8:18 pm

Pues es posible que la llamada a SOUNDCHANNEL_STOP no este funcionando como deberia, necesitaria un ejemplo por probar, ademas la funcion LOAD_SOUND o equivalente, tiene el ultimo parametro con valor 0 o 1 ?
User avatar
CicTec
 
Posts: 16013
Joined: Thu Jul 31, 2008 10:18 pm

Re: [GAME]: Juego de Naves (YoliPeich)

Postby Thurderon » Sun Oct 23, 2016 10:29 pm

CicTec wrote:Pues es posible que la llamada a SOUNDCHANNEL_STOP no este funcionando como deberia, necesitaria un ejemplo por probar, ademas la funcion LOAD_SOUND o equivalente, tiene el ultimo parametro con valor 0 o 1 ?


No entendí....¿qué ejemplo necesitas? El último parámetro de la función LOAD_WAV es 0 (no cíclico). ¿Cuál debería ser? :?:
User avatar
Thurderon
 
Posts: 144
Joined: Thu Sep 24, 2009 4:47 pm
Location: Alcobendas (Madrid)

Re: [GAME]: Juego de Naves (YoliPeich)

Postby CicTec » Sun Oct 23, 2016 10:34 pm

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 ?
User avatar
CicTec
 
Posts: 16013
Joined: Thu Jul 31, 2008 10:18 pm

Re: [GAME]: Juego de Naves (YoliPeich)

Postby Thurderon » Sun Oct 23, 2016 11:04 pm

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

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
User avatar
Thurderon
 
Posts: 144
Joined: Thu Sep 24, 2009 4:47 pm
Location: Alcobendas (Madrid)

PreviousNext

Return to Proyectos WIP

Who is online

Users browsing this forum: No registered users and 12 guests