Problemas con el Size_x

Started by Arcontus, February 18, 2012, 10:20:08 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Arcontus

Buenas,

desde que uso la función size_x esta parece darme problemas si le paso un valor por debajo de 5. Para empezar, no se pinta bien, pero lo más curioso es que en determinadas circunstancias me "explota" el programa.
La función que hago servir es esta:


PROCESS GUI_Barras(int color)
PRIVATE
    int contador;
    int *cantidad, *maxi;
BEGIN
    file=interfazFPG;
    graph = color;
    z = Z_INTERFAZ+1;
    switch (color)
        case BARRA_VERDE:
            x = 444;
                y = 630;
                cantidad = &(GUI_CONTROL.barra_verde_actual);
                maxi = &(GUI_CONTROL.barra_verde_max);
        END
        case BARRA_AMARILLA:
            x = 444;
                y = 621;
                cantidad = &(GUI_CONTROL.barra_azul_actual);
                maxi = &(GUI_CONTROL.barra_azul_max);
        END
        case BARRA_AZUL:
            x = 444;
                y = 612;
                cantidad = &(GUI_CONTROL.barra_amarilla_actual);
                maxi = &(GUI_CONTROL.barra_amarilla_max);
        END
    END
    LOOP
        /*
        contador = (*cantidad * 100)/ *maxi;
        if (contador > 5)
            size_x = contador;
        else
            size_x = 5;
        END
        */

        contador = (*cantidad * 100)/ *maxi;
        size_x = contador;

        FRAME;
    END
END


Podéis ver un trozo de código que está comentado, es para limitar que no se haga un size inferior a 5, lo cual evita que el programa "explote".

Es decir si comentamos:

  contador = (*cantidad * 100)/ *maxi;
         size_x = contador;


y descomentamos:

contador = (*cantidad * 100)/ *maxi;
         if (contador > 5)
             size_x = contador;
         else
             size_x = 5;
         END

Entonces funciona perfectamente.

La función que llama a las barras está en el main y es la siguiente:
PROCESS main()
BEGIN
    set_mode(1024,768,32, mode_window);
    GUI_init();                          //Inicializamos la libreria.
    GUI_Barras(BARRA_VERDE);
    GUI_Barras(BARRA_AZUL);
    GUI_Barras(BARRA_AMARILLA);
    while(!key(_esc))
        GUI_CONTROL.barra_amarilla_actual = rand(0,100);
        GUI_CONTROL.barra_azul_actual = rand(0,100);
        GUI_CONTROL.barra_verde_actual = rand(0,100);
        frame;
    END
    exit();
END

FUNCTION GUI_init()
BEGIN
    interfazFPG = load_fpg(".\..\FPG\interfaz32.fpg");
    GUI_hotkeys_default();
    GUI_CONTROL.barra_verde_max = 100;
    GUI_CONTROL.barra_azul_max = 100;
    GUI_CONTROL.barra_amarilla_max = 100;
END


Bien, pues ese codigo me peta si no limito el tamaño de las barras a más de 5.

He tratado de crear un nuevo proyecto replicando los mismos pasos que realizo en el otro, y creando un nuevo FPG solo con las barras, pero en este caso funciona correctamente y no da error de ejecución.
Adjunto fichero DEBUG donde se observa que las lineas no se pintan bien siempre, pero no se porqué aquí no da error de ejecución.

¿Alquien sabe lo que sucede?
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

#1
que version de bennugd estas usando?

cuando dices que revienta el programa? lo estoy corriendo desde hace unos 10 minutos  y no muere.

si estas usando una version antigua de BennuGD, puede ser eso, porque un bug similar se corrigio hace tiempo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

Acabo de actualizar a la última versión, he vuelto a probar y parece que se ha corregido el problema.

Gracias por la ayuda,

Saludos!
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

Arcontus

Pues no se ha correjido el problema completamente.

Si es cierto que ahora sucede con mucha menos frecuencia, es totalmente aleatorio. De 10 veces que se ejecuta fallan 2 o 3, y siempre al principio trás 1 o 2 segundo de ejecución, sino ya no he visto que fallara. Si por contra limito el tamaño para que no se reduzca la barra por debajo de 10 entonces funciona siempre bien. He observado que por debajo de 10 las barras no se pintan correctamente, sino que hace algo extraño incluso cambian de color.

SplinterGU, en el ejemplo que adjunté no conseguí reproducir el problema.  El programa lo adjunté para que vieráis como tengo codificado el tema de barras, por si veiais algo mal.

El problema se vuelve más evidente cuantas más funciones tengas corriendo, como si hubiera algún puntero loco que se activa cuando baja de ese valor en el código.

En fin, que con la funcion "size_x" me huele a algo que no está del todo bien, o sino no entiendo que me sucede...
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

necesito un problema de ejemplo para repetir el problema.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

#5
En el código adjunto aun que no "peta" se observa lo que comento de que no pinta bien las barras cuando el size es inferior a 10. Lo puedes verificar tu mismo.

La 3a barra comenzando por abajo debería ser rosa, no azul y la primera de arriba debería ser amarilla no naranja. Esto les sucede a todas las barras cuando tienen un tamaño reducido y quizás sea un sintoma del problema. Te da eso alguna pista?
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

eso no puede ser problema del size_x, podria ser otra cosa... pero el motor no cambia los colores, y menos parejo... quizas si usas 8 bits puede que las paletas cambien, pero no por size_x, sino por alguna otra cosa.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

veo que algo raro hay, lo pondre en pendiente.

gracias!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

ya veo, en tu caso, a partir de size_x = 8 funciona bien, luego parece como que lee parte del siguiente, por eso, es probable que haga el crash...

te agradeceria si pudieras probar con fpg de 8 y 16 bits... yo ahora tengo que salir, pero si puedes hacer esas pruebas, me adelantarias tiempo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

este codigo sirve para ver el problema


PROCESS GUI_Barras(file,graph,x,y,size_x)
BEGIN
LOOP
FRAME;
END
END

PROCESS main()
PRIVATE
int indice;
int miFPG;
END
BEGIN
set_mode(640,480,32, mode_window);

miFPG = load_fpg("miFPG.fpg");

for(indice = 0; indice < 12; indice++)
GUI_Barras(miFPG,indice+1,320,20+(indice* 20),7);
END

while(!key(_esc))
frame;
END

exit();
END
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

si, se rompe mal...


PROCESS GUI_Barras(file,graph,x,y,size_x)
BEGIN
    LOOP
FRAME;
END
END

PROCESS main()
PRIVATE
int indice;
int mapas[11];
END
BEGIN
set_mode(640,480,32);

    rand_seed(get_timer());

for(indice = 0; indice < 12; indice++)
    mapas[indice]=map_new(100,7,32);
    map_clear(0,mapas[indice],rgb(rand(4,25)*10,rand(4,25)*10,rand(4,25)*10));
    end

for(indice = 0; indice < 12; indice++)
GUI_Barras(0,mapas[indice], 50,10+(indice*30),9);
GUI_Barras(0,mapas[indice],100,10+(indice*30),8);
GUI_Barras(0,mapas[indice],150,10+(indice*30),7);
GUI_Barras(0,mapas[indice],200,10+(indice*30),6);
GUI_Barras(0,mapas[indice],250,10+(indice*30),5);
GUI_Barras(0,mapas[indice],300,10+(indice*30),4);
GUI_Barras(0,mapas[indice],350,10+(indice*30),3);
GUI_Barras(0,mapas[indice],400,10+(indice*30),2);
GUI_Barras(0,mapas[indice],450,10+(indice*30),1);
END

while(!key(_esc))
frame;
END

exit();
END


depende tambien del alto del grafico.

bueno, tengo que ver como solucionarlo...

gracias.

por ahora puedes solucionarlo haciendo las barras de 100 de alto y usando size_y=7 junto al size_x que quieras.

ejemplo


PROCESS GUI_Barras(file,graph,x,y,size_x)
BEGIN
    size_y = 7;
    LOOP
FRAME;
END
END

PROCESS main()
PRIVATE
int indice;
int mapas[11];
END
BEGIN
set_mode(640,480,32);

    rand_seed(get_timer());

for(indice = 0; indice < 12; indice++)
    mapas[indice]=map_new(100,100,32);
    map_clear(0,mapas[indice],rgb(rand(4,25)*10,rand(4,25)*10,rand(4,25)*10));
    end

for(indice = 0; indice < 12; indice++)
GUI_Barras(0,mapas[indice], 50,10+(indice*30),9);
GUI_Barras(0,mapas[indice],100,10+(indice*30),8);
GUI_Barras(0,mapas[indice],150,10+(indice*30),7);
GUI_Barras(0,mapas[indice],200,10+(indice*30),6);
GUI_Barras(0,mapas[indice],250,10+(indice*30),5);
GUI_Barras(0,mapas[indice],300,10+(indice*30),4);
GUI_Barras(0,mapas[indice],350,10+(indice*30),3);
GUI_Barras(0,mapas[indice],400,10+(indice*30),2);
GUI_Barras(0,mapas[indice],450,10+(indice*30),1);
END

while(!key(_esc))
frame;
END

exit();
END


es la unica solucion temporal que tengo de momento, hasta que me siente a analizar el codigo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

bueno, creo que lo solucione... digo creo, porque realmente no tengo idea que toque... pero se ve que ahora dibuja mejor a tamaños chicos.

en fin... a probarlo...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

SplinterGU, probé a 8 y 16 bits tal y como pedías y sucede el mismo problema:

8Bits -->

16bits -->

Lo del size_y=7 no lo entendí, que tiene que ver una cosa con la otra??

Gracias por la ayuda.

Saludos!



5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com

SplinterGU

si, fallaba en todos los modos... era la forma de calcular donde leer las texturas... ya lo corregi (o al menos ahora no se rompe)

perdon si no fui claro en la lluvia de respuestas anteriores.

lo del size_y=7 mira el ejemplo que puse... se debe a que tus graficos son de alto 7...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Arcontus

#14
Hola SplinterGU, por fin he logrado el tiempo para descargar la ultima versión (r270), y de momento, no me peta el proyecto lo cual es muy buena señal. Aun así, en el programilla ese que adjunté más arriba, se siguen viendo en algunos casos un cambio de color en las barras cuando estas son pequeñas, por lo que "puede" que sigamos sin resolver el problema.

Te adjunto un pantallazo que acabo de hacer para que lo veas tu mismo:

Como sabes, la tercera barra por abajo, debería ser de color rosa, no azul. Obviamente no es la única barra que cambia su color cuando se reduce su tamaño.

De momento no ha vuelto a dar problemas de cuelgues en el proyecto, pero está bien que estés al tanto del "mini-bug".
5Leaps, el primer juego comercial desarrollado para BennuGD. http://www.5leaps.com