Cajas de diálogo (Dialog boxes)

Started by Windgate, October 23, 2009, 12:52:51 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Windgate

Quería estrenar la nueva intro de Bennu con un proyecto, así que allí va una beta muy temprana de un módulo para tratamiento de cajas de diálogo móviles, que pueden ir junto con el personaje.

Detalles interesantes:

1) Incluye la intro de Bennu en formato .mpg, con todos los DLL y un .bat para ejecutar libremente.

2) Incluye un personaje que hace uso de una dialog box y puede moverse manteniendo sobre él el diálogo.

3) El 99% del código, incluido variables y comentarios están "in english" para que mis proyectos puedan ser internacionales... Primera vez que lo hago... Siempre he sido de "programar igual que se habla".

Las dialog box son un TYPE con varios valores por defecto, pero configurables en gráfico, fuente, tiempo de muestre, retraso entre líneas de texto, ec.

Le faltan varios detalles:

1) La función que convierte una string a dialog box calculando los saltos de línea.

2) Soportar write_in_map y hacerlo compatible con Bennu 3D ::)

3) Testear, depurar y mejorar todo lo posible...

Todo en 32 bits, la fuente también es posible cargarla en ttf, en la próxima versión incluyo un ejemplo.

DESCARGAR: http://trinit.es/DescargaDirecta/Dialog%20Boxes%200.0.2.zip (10Mb)
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

Prg

jojojo ya lo probé :)

karma++ y gracias amigo :)
en humos puedes mover la camara con los cursores. es necesario para los niveles a partir del dos :)

DCelso

Umn, no está mal
Pero a mi gusto la intro para ser intro es demasiado larga en tiempo yo tenia en mente una intro tipo la antigua de los juegos 3dfx que servía para que supieras que el juego era 3d pero no era nada pesada y muy rápida.
También no me gusta que me obligen a ver la intro completa, normalmente puedes darle a escape y llegar justo al último frame.
En cuanto al sonido queda bastante bien pero no termina justo cuando termina la intro y sigue un rato habría que ajustarlo.
Además faltarían los sonidos de ambiente, un sonido para el movimiento de las alas de bennu (como un zumbido al aire) y el de caída de las letras a la arena (un golpe seco).

Otra intro para ver a lo que me refiero podría ser la del cálico electrónico.
Monstruos Diabólicos

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

DjSonyk

Veo que al final de 70MB lo has dejado en poco mas de 14,realmente muy bueno,es buena idea lo de los TextBox,ya lo hechare un vistacillo...

Windgate

#4
Nueva versión de los Dialog Boxes, ahora hay varios procesos que invocan aleatoriamente diálogos para probarlos, usan una ttf, aunque es posible cambiar la fuente desde dialog.prg


He implementado la división de palabras activa, aunque con un algoritmo "casero" que chequea los espacios y salta de línea si detecta espacio más allá del 70% de la cadena.

Veo que transcurrido un tiempo llegan a haber varios writes activos en pantalla (Y fuera de pantalla) y la cosa empieza a parpadear. La próxima mejora consistirá en no hacer write cuando el proceso se encuentre fuera de pantalla, y hacer que sea compatible tanto con C_SCROLL como con C_SCREEN.

También tengo que controlar las z... Quizás me base en write_in_map y map_block_copy para que los textos tengan la misma profundidad que la caja... Sería lo ideal ::)

Para map_block_copy: Creo recordar que las funciones para obtener la anchura y altura de un texto sólo funcionaban en base a la anchura de la fuente por defecto del sistema, ¿Alguien sabe algo al respecto?, lo comprobaré un día de éstos, por ahora la altura y anchura de caracter se da en una constante.

DESCARGAR v0.0.3: http://trinit.es/DescargaDirecta/Dialog%20Boxes%200.0.3.zip

Son 5Mb, he omitido la intro de Bennu para testear :P
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

TEXT_WIDTH (INT fuente, STRING texto)
TEXT_HEIGHT (INT fuente, STRING texto)
Esa es tu solución.

Por lo demás, muy curioso tu ejemplo de los módulos :)
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

Gracias Drumpi, es que recuerdo que lo probé con unas DLL de hace tiempo y devolvía valores referentes únicamente a la fuente por defecto... Por eso me preocupaba, lo volveré a probar, sería un alivio xD
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

#7
¡¡¡PROBLEMA!!! :o

He implementado una funcionalidad interesante, ahora los textos de cada linea se imprimen sobre un gráfico usando write_in_map y map_block_copy, ganando mucho en eficiencia ya que no hay que redibujar los textos a cada frame. A groso modo es así:

FROM current_print = 0 TO current_line;
lines [ current_print ] = write_in_map ( dial.font ,
dial.line [ current_print ] , 1 );
map_block_copy ( file , graph , 0 , current_print*dial.font_height + _OFFSET_DEFAULT ,
lines [ current_print ] , 0 , 0 ,
graphic_info ( file , lines [ current_print ] , G_WIDTH ) ,
graphic_info ( file , lines [ current_print ] , G_HEIGHT ) ,
0
);
END


El problema es que map_block_copy recibe un último parámetro para indicarle que ignore el color transparente a la hora de copiar, y al ignorar el color transparente los write que usan fuentes ttf no se imprimen bien, lógicamente.

¿Alguien sabe si hay algún flag (O es fácil de implementar) para map_block_copy que le indique que se quieren ignorar sólamente los colores transparentes en 32 bits? Los TOTALMENTE transparentes me refiero...

Hasta encontrar solución a ello las dialog boxes sólo funcionarán con fnt... :-\

En cualquier caso ahora el rendimiento y el control de profundidad roza la perfección:


Incluso con boxes transparentes:

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

SplinterGU

este problema es por los 32 bits?

tengo que revisar el tema del alpha en los 32 bits... estuve pensando, pero tengo que probarlo y hacerlo...

la cosa se resume asi...

pixel destino (RGBA)

pixel source (RGBA)

la cosa es que cuando se hace un put de un pixel sobre otro, se hace una fusion de un RGB sobre el otro, en base a los ALPHA de cada 1... entonces una vez aplicado, el ALPHA ya deja de tener sentido, puesto que si dejaramos alpha sobre los RGB ya con alpha aplicado entonces hariamos cagadas... el pixel seria en cada operacion mas transparente... incluso en el momento de dibujarlo en pantalla...

asi que la idea seria fusionar ambos RGB en base al menor de los 2 ALPHA y guardar este pixel fusionado con el ALPHA mayor... creo que esa podria ser la solucion al manejo de los 32 bits... pero lo pense muy por encima... quizas no sea lo correcto eso...
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

SplinterGU

por otro lado, veo que los boxes son siempre del mismo tamaño, seria bueno que los crees dinamicamente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Windgate

#10
La transparencia puede ser aditiva, sustractiva o simplemente una media de ambas... Podría haber un flag para controlarlo, en map_block_copy ya hay uno, aunque imagino que no es sólo para map_block_copy, el cambio afectaría a todo Bennu.

En el caso que me atañe, copio una fuente ttf (Con alpha) sobre un gráfico. El pixel resultante tiene que mantener el alpha del gráfico en todos los casos, pero dependiendo de los alphas de la fuente debería afectar de alguna forma, por ejemplo:

Se copia un pixel R=255, G=0, B=0, A=30 sobre el gráfico de fondo BLANCO R=255, G=255, B=255, A=255.

El resultado debería ser un pixel R=255, G=255-30, B=255-30...

Lo he comprobado con Gimp y eso es lo que yo deseo, pero harían falta flags porque puede haber muchos otros casos.

En cuanto al tamaño de los boxes, sí, había considerado esa idea, de formarlos por "tiles" o bien usar size_x y size_y, aunque con map_block_copy no es posible ya que afectaría también al texto :P

Gracias por las sugerencias ;D

EDIT: Aquí la versión actual, ahora mismo estoy metiendo una "consola" para que puedas introducir texto por teclado y el guerrero lo hable, usaré PUBLIC y esas cositas lindas.

DESCARGAR: http://trinit.es/DescargaDirecta/Dialog%20Boxes%200.0.4.zip
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

DCelso

Oye muy bueno el test.
Por cierto pepáranos una mini aventurilla del pive este pa entretenernos probándolo, algo del estilo una aldea de un rpg, en el que hables con diferentes tios y te den pistas para conseguir una llave y abrir un cofre o una puerta y encontrarte con el final :D.
Monstruos Diabólicos

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

Windgate

Estaba pensando en darle algo de jugabilidad, no es mala idea eso que propones, no sería nada complicado, pero tendré que rippear más animaciones de modelos md2 para los NPC xD

Ahora mismo ya es posible introducir textos por teclado y el tío los suelta alegremente, me gusta como está quedando. En cuanto tenga versión con alguna novedad interesante os lo subo.
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

SplinterGU

si, hay que pensar bien el tema del alpha en los 32 bits... obviamente que dependeran de los flags seteados... pero el ejemplo que puse era en el caso del modo normal.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

DjSonyk

En las pruebas que estas dejando se ve muy bien...animo