Duda con set_glyph

Started by osk, August 24, 2009, 09:44:34 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

osk

Hola.
Estoy probando un código (lo tenéis más abajo), que pretende mostrar cómo funciona set_glyph(), y resulta que he obtenido un resultado que no me esperaba (y creo que en Fénix no pasaba). La idea es asignar al glyph 65 (es decir, lo que sería la letra "A") de una fuente nueva mía un dibujo (un cuadrado gris). Y muestro por pantalla usando esa fuente mía la letra "A" pero también la "B". En teoría, al no haber definido ningún glyph para "B", no se debería ver nada, pero se ve otro cuadrado gris. Posteriormente sí que defino el glyph para "B" (el mismo cuadrado gris) y vuelvo a escribir "A B", y en ese momento, efectivamente, se me muestran los dos cuadrados.  Lo que quiero decir es que lo que se tendría que ver (si no lo entiendo mal), es primero un cuadrado y luego dos, cuando lo que aparece son dos cuadrados y luego dos. ¿Qué es lo que estoy interpretando mal?

Gracias.

PD: Estoy pesadito, ¿eh?

[code language="bennu"]
import "mod_map";
import "mod_key";
import "mod_draw";
import "mod_text";

process main()
private
    int font,map;
end
begin
//Genero un gráfico (un cuadrado gris)
map=new_map(10,10,32);
drawing_map(0,map);
drawing_color(rgb(100,100,100));
draw_box(0,0,9,9);                 
//Genero la fuente de 32 bits
font=new_fnt(32);
/*Este gráfico (el cuadrado gris) corresponderá al carácter 65 de la nueva fuente (El carácter 65 de la tabla ASCII corresponde a la "A"). SE SUPONE QUE como sólo se asigna este carácter, el resto de letras y símbolos no serán visibles ya que no estarán definidos para esta fuente: habría que hacer 255 set_glyph(), una por cada carácter de la nueva fuente creada*/                   
set_glyph(font,65,0,map);
/*Sólo imprimirá un cuadrado gris correspondiente a "A".  "B" no se escribirá porque no tiene asociado ningún símbolo de la fuente.<--LO QUE NO VA COMO PENSABA!!!*/
write(font,0,0,0, "A B");                       
//Ahora hago que "B" también se escriba como el mismo cuadrado gris                         
set_glyph(font,66,0,map);             
//Ahora se imprimen dos cuadrados grises.Ok             
write(font,0,20,0, "A B");                     
/*Guardo la fuente creada (que está en memoria), en el disco, para poderla utilizar posteriormente en otros programas como cualquier otra fuente.  */                                   
save_fnt(font,"mifuente.fnt");                                       
while(!key(_esc))frame; end
end
[/code]

SplinterGU

me hiciste dudar... a ver si viendo esto te das cuenta como funciona... (pulsa espacio para continuar)


import "mod_map";
import "mod_key";
import "mod_draw";
import "mod_text";
import "mod_video";

process main()
private
   int font,map;
end
begin

set_mode(640,480,32);
//Genero un gráfico (un cuadrado gris)
map=new_map(10,10,32);
drawing_map(0,map);
drawing_color(rgb(100,100,100));
draw_box(0,0,9,9);                 
//Genero la fuente de 32 bits
font=new_fnt(32);
/*Este gráfico (el cuadrado gris) corresponderá al carácter 65 de la nueva fuente (El carácter 65 de la tabla ASCII corresponde a la "A"). SE SUPONE QUE como sólo se asigna este carácter, el resto de letras y símbolos no serán visibles ya que no estarán definidos para esta fuente: habría que hacer 255 set_glyph(), una por cada carácter de la nueva fuente creada*/                   
set_glyph(font,65,0,map);
/*Sólo imprimirá un cuadrado gris correspondiente a "A".  "B" no se escribirá porque no tiene asociado ningún símbolo de la fuente.<--LO QUE NO VA COMO PENSABA!!!*/
write(font,0,0,0, "A B");                     

while (!key(_SPACE)) frame; end

//Ahora hago que "B" también se escriba como el mismo cuadrado gris                       
set_glyph(font,66,0,map);             
//Ahora se imprimen dos cuadrados grises.Ok           
write(font,0,20,0, "A B");                     
/*Guardo la fuente creada (que está en memoria), en el disco, para poderla utilizar posteriormente en otros programas como cualquier otra fuente.  */                                   
save_fnt(font,"mifuente.fnt");                                       
while(!key(_esc))frame; end
end


Funciona bien el set_glyph...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

osk

¡Ostras, qué burro! Me faltaba un frame!
Muchas gracias!
Y perdona por molestar con esta tontería. Mecachis...




splinter_work

no, no es el frame lo que te falto...

los write se actualizan constantemente, en un write simple el texto persiste pero si cambias los fonts, lo mostrado en pantalla se actualiza...

por eso si te texto es "A B", cuando B no este definida no la va a mostrar, pero ni bien la definas, esta se mostrara sin necesidad de hacer un nuevo write.

Drumpi

Pues es una característica muy interesante... sobre todo para animar un scroll tileado :D
Si, ya se, rendimiento... aun tengo que probarlo ;)
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

DCelso

osk, estás a piñón con el tuto eh, se te ve más activo que nunca, diria yo. :D.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

osk

Pues sí, pero voy muy lento.
En verdad lo único que hago es cambiar el formato del texto (hacerlo un poco más legible), modificar para Bennu los ejemplos y probarlos y poco más. Pero claro, 700 páginas...Lo estoy reorganizando un poquitín y voy a quitar cosas (ejemplos extensos de varias páginas que se pueden encontrar en otros sitios)...No sé, por ahora me está gustando, pero no creo que lo tenga listo hasta mediados del mes que viene.

DCelso

Sin prisas. Sigue preguntando todo lo que necesites, te va a quedar de lujo.
A mi el de fenix me encantó, creo, y creo que no creo mal :D, que es el único tutorial de programación completo que he visto hasta ahora, que te enseña totalmente de cero sin saber nada de nada, ni programar ni dibujar, ni animar, es estupendo para newbies y no tanto.
Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

:) fantastico, animo con eso, se necesita un monton!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DCelso

Monstruos Diabólicos

"A PAck of classic GAMEs For BennuGD" en desarrollo
http://code.google.com/p/apagame4be/

SplinterGU

gracias! te ganaste un karma!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

Oh, ahí está osk a la par que yo con el tuto xD

El mío será más corto sin duda (Voy por el tema 19 de 50 y tienen entre 2 y 4 páginas de extensión cada uno). De todas formas tomar el que había en Fénix y "portarlo" es buena idea, sí que estaba muy bien ;D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Windgate

drawing_color(rgb(100,100,100))

Ahora me entero de la existencia de una función rgb() a la que pasar los valores de color :( ... Si os digo que en mi visor 3D, para el dibujado de líneas establecía el valor de color escribiéndolo en binario en la calculadora de Windows y luego pasándolo a decimal... Y si os digo además que escribía 32 bits pensando que eran 8 para R,G,B y otros 8 para el alpha...

Pues bien, reiros de mí y cuando terminéis, quería comentaros un par de dudas, a ver si alguien me las sabe resolver porque he estado experimentando y siempre consigo cualquier color menos el que espero:

1) A rgb() se le pasan valores entre 0 y 100, ¿No? De menor a mayor saturación
2) Si estamos en modo de vídeo de 32 bits, ¿Tiene sentido seguir usando rgb() y se usa de la misma forma?
3) ¿En 32 bits hay alpha para el color de dibujado o ha sido una ilusión mía?

Asias :D
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es

Drumpi

jajajaja ¿suficiente así?
Si cuando yo digo que nadie domina Bennu al completo lo digo por estas cosas. Tranquilo que le pasa a todo el mundo.

1) Si no ha cambiado la cosa, a rgb se le pasan valores entre 0 y 255, pues es el valor, traducido al binario, que se le da luego al color (8bits=256tonalidades por componente).
2) Si, se puede usar, teniendo en cuenta que devuelve un valor entre 0 y 2^16. No se si splinter lo ha modificado y en modo 32 bits devolverá valores de hasta 2^24 (no debería, por si usamos gráficos de 16bits en modos 32bits)
3) Me suena que si, que hay una funcion rgba(). De hecho, en mi vieja (viejísima) version de Bennu la tengo en mod_map: INT RGBA(BYTE, BYTE, BYTE, BYTE), igual que RGBA_GET.
Hala, como con 1001 procesos sólo va a 9 FPS, vamos a meterle 32 veces más, a ver si revienta.
(Drumpi epic moment)

Windgate

rgb() recibe entre 0 y 255??? Pero entonces el color es de 8+8+8 = 24 bits... ¿No? ¿Y si el modo de vídeo es de 16 cómo se come eso?

El tema del color es arduo... De momento voy a modificar el texturizado de mi visor porque toma valores RGB entre 0 y 100 y creo que por eso mi textura de madera parece un mojón con rayitas.
Iván García Subero. Programador, profesor de informática, monitor de actividades culturales y presidente de TRINIT Asociación de Informáticos de Zaragoza. http://trinit.es