[GAME]: Juego de Naves (YoliPeich)

Proyectos en Desarrollo.

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

Postby shao » Mon Oct 24, 2016 8:08 am

La variable que guarda el canal llamada "sonido" debería ser global ya que al morir ese proceso asteroide, el canal se pierde por que la variable y el valor que guardaba desaparecen, de modo que cuando otro asteroide es creado se encuentra que su variable sonido vale 0 (valor por defecto) y ya no tiene el valor del canal de modo que no detiene ningún sonido.
User avatar
shao
 
Posts: 5971
Joined: Wed Jun 17, 2009 4:51 pm
Location: Alicante

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

Postby CicTec » Mon Oct 24, 2016 8:39 am

Hola Thurderon,

Pues hay algunos errores en el codigo:

El proceso "disparo": tiene la siguiente forma:
Source Code (Gemix) [ Download ] [ Hide ]
  • 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:
Source Code (Gemix) [ Download ] [ Hide ]
  • 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:
Source Code (Gemix) [ Download ] [ Hide ]
  • PROCESS asteroide(codigo)
  •     sonido = 0; // Variable para guardar el canal del sonido de la explosion del asteroide
  •  

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:
Source Code (Gemix) [ Download ] [ Hide ]
  • 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.
User avatar
CicTec
 
Posts: 15955
Joined: Thu Jul 31, 2008 10:18 pm

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

Postby Thurderon » Mon Oct 24, 2016 10:40 pm

No sé qué he hecho, pero ahora el código de ayer no me funciona :O Primero me dice que se esperaba un BEGIN en el proceso asteroide (no me admite la declaración de la variable sonido entre PROCESS.....y BEGIN

Y luego al ejecutarlo, no hace ruido al disparar, ni al explotar los asteroides ni se resproduce la animación de explosíón de los mismos :(

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
    sonido = 0; // Variable para guardar el canal del sonido de la explosion del asteroide   
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)
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)

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

Postby Thurderon » Mon Oct 24, 2016 10:51 pm

Thurderon wrote:No sé qué he hecho, pero ahora el código de ayer no me funciona :O Primero me dice que se esperaba un BEGIN en el proceso asteroide (no me admite la declaración de la variable sonido entre PROCESS.....y BEGIN

Y luego al ejecutarlo, no hace ruido al disparar, ni al explotar los asteroides ni se resproduce la animación de explosíón de los mismos :(

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)
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



Ahora sí....primero, no hacía buen contacto los auriculares y por eso no se reproducían los sonidos....segundo, he puesto la variable sonido como GLOBAL como me habéis comentado, he parado el sonido de explosión en el PROCESS asteroides y pasado el código final del asteroides dentro del segundo LOOP.

Y ahora tiene el funcionamiento deseado, sólo se reproduce un sonido de explosión a la vez :)
User avatar
Thurderon
 
Posts: 144
Joined: Thu Sep 24, 2009 4:47 pm
Location: Alcobendas (Madrid)

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

Postby CicTec » Mon Oct 24, 2016 11:01 pm

Me alegro que te funcione, animo con el proyecto.
User avatar
CicTec
 
Posts: 15955
Joined: Thu Jul 31, 2008 10:18 pm

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

Postby Thurderon » Wed May 09, 2018 11:07 pm

CicTec wrote:Me alegro que te funcione, animo con el proyecto.


Bueno, a ver si adapto éste también al modo Modern :lol:
User avatar
Thurderon
 
Posts: 144
Joined: Thu Sep 24, 2009 4:47 pm
Location: Alcobendas (Madrid)

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

Postby Thurderon » Thu May 10, 2018 9:32 am

Thurderon wrote:
CicTec wrote:Me alegro que te funcione, animo con el proyecto.


Bueno, a ver si adapto éste también al modo Modern :lol:


Adaptado con éxito...a ver si voy poco (muy poco) a poco añadiéndole cosillas aunque no cambie los gráficos, es más que nada para ir cogiendo soltura con Gemix :lol:
User avatar
Thurderon
 
Posts: 144
Joined: Thu Sep 24, 2009 4:47 pm
Location: Alcobendas (Madrid)

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

Postby CicTec » Thu May 10, 2018 9:38 pm

Me parece bien, animo con ello.
User avatar
CicTec
 
Posts: 15955
Joined: Thu Jul 31, 2008 10:18 pm

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

Postby Thurderon » Wed May 16, 2018 1:42 pm

Hola, de momento le he hecho un mínimo cambio:

- Los meteoritos dan diferentes puntos según si son grandes (más) o pequeños (menos).
- Los meteoritos van a diferentes velocidades aleatorias: los grandes más lentos (1-4) y los pequeños más rápidos (5-8).

Poco a poco vamos avanzando, aunque no me ha dado como para subir una nueva versión y la probéis :)
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 May 27, 2018 10:24 pm

Hola Thurderon,

Me parecen bien los avances, a ver si pronto consigue otros y puedes sacar una nueva beta por probar, animo con ello. ;)
User avatar
CicTec
 
Posts: 15955
Joined: Thu Jul 31, 2008 10:18 pm

PreviousNext

Return to Proyectos WIP

Who is online

Users browsing this forum: No registered users and 5 guests