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?
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.
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!
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...
necesito un problema de ejemplo para repetir el problema.
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.
(http://www.freeimagehosting.net/t/b1nq5.jpg) (http://www.freeimagehosting.net/b1nq5)
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?
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.
veo que algo raro hay, lo pondre en pendiente.
gracias!
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...
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
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.
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...
SplinterGU, probé a 8 y 16 bits tal y como pedías y sucede el mismo problema:
8Bits --> (http://www.freeimagehosting.net/t/du1to.jpg) (http://www.freeimagehosting.net/du1to)
16bits --> (http://www.freeimagehosting.net/t/c45c4.jpg) (http://www.freeimagehosting.net/c45c4)
Lo del size_y=7 no lo entendí, que tiene que ver una cosa con la otra??
Gracias por la ayuda.
Saludos!
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...
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:
(http://www.freeimagehosting.net/t/5twut.jpg) (http://www.freeimagehosting.net/5twut)
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".
Arcontus, yo no genere binarios del fix... para tener la solucion al problemas, tenes que bajar los fuentes y compilarlos.
Bien, tenemos un problema, no se como hacerlo...
Quote from: Arcontus on March 05, 2012, 10:38:33 PM
Bien, tenemos un problema, no se como hacerlo...
pos como yo xDDD a esperar xDDD
y van a tener que esperar un buen tiempo, porque en opensuse no puedo instalar el crosscompiler para generar los binarios de windows.
Parece que con la nueva versión ya no ocurre este problema. Gracias SplinterGU.
de nada...