Diario de desarrollo

Started by josebita, October 26, 2015, 09:32:22 AM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

warrior_rockk

Quote from: josebita on February 08, 2016, 08:00:51 PM
El commit f525ffe añade varios elementos a la estructura scroll:
* BYTE alpha1, alpha2;      <--   Controlan el valor de transparencia con el que se pintan los planos de scroll
* BYTE modr1, modg1, modb1, modr2, modg2, modb2;      <--    Controlan la modulación de color a aplicar a los planos de scroll.

Lo del alpha es necesario porque, como ya comenté,flags=4 ya no funciona.
Con la modulación del color se pueden hacer algunas cosas chulas. A ver si mañana subo un ejemplo con una idea de para qué serviría.


Ya es mañana! a ver, a ver......  ;D ;D

JaViS

Quote from: warrior_rockk on February 10, 2016, 06:28:56 AM
Quote from: josebita on February 08, 2016, 08:00:51 PM
El commit f525ffe añade varios elementos a la estructura scroll:
* BYTE alpha1, alpha2;      <--   Controlan el valor de transparencia con el que se pintan los planos de scroll
* BYTE modr1, modg1, modb1, modr2, modg2, modb2;      <--    Controlan la modulación de color a aplicar a los planos de scroll.

Lo del alpha es necesario porque, como ya comenté,flags=4 ya no funciona.
Con la modulación del color se pueden hacer algunas cosas chulas. A ver si mañana subo un ejemplo con una idea de para qué serviría.


Ya es mañana! a ver, a ver......  ;D ;D


Exacto! que no pude dormir de la expectativa :D
Working on Anarkade. A couch multiplayer 2D shooter.

josebita

#137
Joé, perdonad, que ando con mucho lío de trabajo.
Lo intento subir lo antes posible.

[Edito] Pero vamos, que es una chorradilla...

josebita

Quote from: Drumpi on February 10, 2016, 01:04:35 AM
Es por no reventar la sorpresa, pero ¿Podría tener algo que ver con esto? :D
(Espero que se vea, porque ando con Linux y no sé lo que estoy mandando :P)
Pues también, mira. También se podría hacer algo así, sí :)

josebita

Una cosa para lo que es útil la modulación de color (mediante las variables locales modr, modg y modb) es para hacer "equipos" por colores. Si no me equivoco, Pixel lo usa en el Tiki Brawl para, a partir de un único sprite, conseguir variaciones para el equipo "rojo", el "azul" y demás.

Sobre el ejemplo: como os decía es una tontería. Se me había ocurrido que si uno quiere pasar de una escena diurna a una nocturna, puede añadir un pequeño efecto al scroll para simular un atardecer.
El ejemplo sería el siguiente:
// import modules
import "mod_say"
import "mod_proc"
import "mod_grproc"
import "mod_map"
import "mod_text"
import "mod_key"
import "mod_video"
import "mod_screen"
import "mod_draw"
import "mod_scroll"
import "mod_math"
import "mod_timers"
import "mod_mouse"

GLOBAL
   int graphic;
   int scroll_window;
   int scroll_window2;

Process sunset()
Private
int time=0;
Begin
    time = timer[0];
    LOOP
        // Change to sunset
        scroll[0].modg1 = 255 -  64 * (1.0 - pow(2.71828, -(float)(timer[0]-time)/500.0));
        scroll[0].modb1 = 255 - 114 * (1.0 - pow(2.71828, -(float)(timer[0]-time)/500.0));

        // Background should change to 255, 228, 206
        scroll[0].modr2 = 179 +  76 * (1.0 - pow(2.71828, -(float)(timer[0]-time)/500.0));
        scroll[0].modg2 = 204 +  24 * (1.0 - pow(2.71828, -(float)(timer[0]-time)/500.0));
        scroll[0].modb2 = 205 +   1 * (1.0 - pow(2.71828, -(float)(timer[0]-time)/500.0));
        FRAME;
    End
End

PROCESS prota()
Private
    int time=0;
Begin
    file = fpg_load("png/spidey.fpg");

    graph = 5;

    x = 500;
    y = 1050;
    LOOP
        if(key(_left) || key(_right))
            y = 1040;

            // Set flags
            if(key(_left))
                scroll[0].x0 -= 5;
                flags = B_HMIRROR;
            else
                scroll[0].x0 += 5;
                flags = 0;
            end

            // Animate spidey
            if(timer[0] > time+20 || graph == 5)
                graph += 1;
                if(graph > 4)
                    graph = 1;
                end

                time = timer[0];
            end
        else
            time = timer[0];
            graph = 5;
            y = 1050;
        end

        if(scroll[0].x0 > 1200 && get_id(TYPE sunset) == 0)
            say("Sunset!!");
            sunset();
        end

        FRAME;
    End

    Onexit:
    fpg_unload(file);
End

PROCESS main()
Private
    int time=0;
    int width=1920, height=1080;
    int sky=0;
Begin
    scale_resolution = 10240576;
    set_mode(width, height, MODE_WINDOW);
    set_fps(60, 0);

    // load the PNG file with the graphics
    graphic = png_load("png/bg.png");
    sky = map_new(width, height, 32);
    map_clear(0, sky, rgb(255, 255, 255));

    scroll_window=scroll_start(0, 0, graphic, sky, 0, 3);
    scroll[0].x0 = 500;
    scroll[0].y0 = 560;

    /* This is a light blue for the sky */
    scroll[0].modr2 = 179;
    scroll[0].modg2 = 204;
    scroll[0].modb2 = 205;

    prota();

    write_var(0, 10, 10, 0, fps);

    WHILE (NOT key(_esc))
        FRAME;
    END

    // stop scroll window.
    scroll_stop(0);

    // kill all processes, excect the "main" process.
    let_me_alone();
END

Podéis descargarlo de aquí, pero no se lo digáis a Momia, que le he robado los gráficos. He intentado grabar un vídeo de cómo queda en mi ordenador, pero es un poco viejuno y deslucía un poco.


Como os digo, el efecto no es espectacular, pero creo que queda bien :)


Ya me contáis.

Drumpi

Pues preferiría ver el video, porque a falta de montarme el entorno de compilación, tendría que esperar a una nueva versión binaria (la ¡CINCO!) para poder probarlo.
Pero no termino de entender esto ¿Es una nueva variable local o de scroll? ¿Y cómo funciona exactamente?, porque pensaba que era como lo de FADE, que modificaba el porcentaje de cada componente de color que se muestra del gráfico del scroll.
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)

SplinterGU

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

josebita

#142
Perdonad que no haya subido el vídeo aún, he andado ocupado :D

El commit 2376db6 añade soporte para fuentes en formato TTF basado en FreeType2. NO se trata de haber integrado la mod_ttf que ya existía, sino que es algo más completo.

La siguiente imagen corresponde al ejemplo 19_mod_text_freetype.prg:

En base al ejemplo, os cuento que he añadido un par de funciones:

       
  • int ttf_load(string path): Carga una fuente en un formato soportado por FreeType (TTF, principalmente).
  • ttf_set_size(int fontid, int size_in_pixels): Establece el tamaño de la fuente, en píxeles (el tamaño máximo no será exactamente este valor, pero le andará cerca si el creador de la fuente se ha portado bien).
Por lo demás, se usan igual que cualquier otra fuente en PixTudio, aunque el renderizado se hace mediante FreeType. En particular:

       
  • Podéis tener una fuente cargada y escribir en múltiples colores llamando a set_text_color(rgb(r, g, b)); (si no me equivoco, antes con mod_ttf había que especificar el color al cargar la fuente).
  • Podéis cambiar el tamaño de la fuente. Por criterios de eficiencia, todos los textos que se pintan con una fuente se pintan al mismo tamaño.
  • Un punto de calidad importante lo da que, si la fuente lo soporta, ahora el texto se renderiza con kerning. Fijaos que en la imagen que he adjuntado la "e" de "Text" se mete debajo de la "T". Eso hace que el renderizado se acerque mucho al que uno espera en el escritorio.
  • Los textos se renderizan con hinting, de forma que lo suyo es que no redimensionéislas imágenes creadas, porque se emborronarán.
Cosas que tengo pendientes:

       
  • Arreglar bugs que me podáis encontrar.
  • Agregar una forma de convertir las fuentes "vectoriales" a fuentes tipo FNT. Se perderán los atributos de kerning, pero bueno.
[Edito] No he medido cuánto más lento es pintar fuentes con este método vs el tradicional. Será algo más lento, aunque puede que no demasiado.

Drumpi

¿Entonces no se puede hacer con una fuente TTF lo que se hacía hasta ahora con las FNT? es decir, escribo un texto con write_string por ejemplo, cambio la text_z, y hago otro write_string con otro tamaño de letra diferente. Y luego que se actualicen de forma automática modificando el contenido de la string que le paso como parámetro.

Por cierto: muy chulo lo de las fuentes, con autoajuste y todo. Buen trabajo. ¡ENHORABUENA!
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)

josebita

#144
Quote from: Drumpi on February 16, 2016, 07:34:40 PM
¿Entonces no se puede hacer con una fuente TTF lo que se hacía hasta ahora con las FNT? es decir, escribo un texto con write_string por ejemplo, cambio la text_z, y hago otro write_string con otro tamaño de letra diferente. Y luego que se actualicen de forma automática modificando el contenido de la string que le paso como parámetro.
La limitación que hay ahora mismo es que cuando cargas una fuente (o modificas su tamaño) se precargan los 256 caracteres a memoria, de forma que cada fuente sólo puede tener un tamaño.
Lo que sí que debería funcionar es que cargues dos veces el mismo TTF y le asignes a cada uno un tamaño distinto.

Pero no me queda claro a qué te refieres: las fuentes FNT no tienen tamaños, ¿no?.
Quote from: Drumpi on February 16, 2016, 07:34:40 PM
Por cierto: muy chulo lo de las fuentes, con autoajuste y todo. Buen trabajo. ¡ENHORABUENA!
Gracias :)

[Edito] Otra cosa que puedo meter en el futuro son efectos de fuente como subrayado y tachado.

josebita

Otra cosita: para el renderizado he tenido que crear una tabla de conversión CP850->UTF-8. Puede ser que haya entradas que estén mal. Si es así, por favor decídmelo y lo reviso.

josebita

Y el vídeo del efecto de "atardecer". El efecto en sí es sutil y los colores han perdido saturación al hacer el vídeo, pero creo que se aprecia de qué va la película :)
https://vimeo.com/155582188

JaViS

Muy buenos avances Josebita, felicitaciones :D
Working on Anarkade. A couch multiplayer 2D shooter.

SplinterGU

muy bueno todo joseba! felicitaciones!
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

Drumpi

Quote from: josebita on February 16, 2016, 07:46:10 PM
Quote from: Drumpi on February 16, 2016, 07:34:40 PM
¿Entonces no se puede hacer con una fuente TTF lo que se hacía hasta ahora con las FNT? es decir, escribo un texto con write_string por ejemplo, cambio la text_z, y hago otro write_string con otro tamaño de letra diferente. Y luego que se actualicen de forma automática modificando el contenido de la string que le paso como parámetro.
La limitación que hay ahora mismo es que cuando cargas una fuente (o modificas su tamaño) se precargan los 256 caracteres a memoria, de forma que cada fuente sólo puede tener un tamaño.
Lo que sí que debería funcionar es que cargues dos veces el mismo TTF y le asignes a cada uno un tamaño distinto.

Pero no me queda claro a qué te refieres: las fuentes FNT no tienen tamaños, ¿no?.
Quote from: Drumpi on February 16, 2016, 07:34:40 PM
Por cierto: muy chulo lo de las fuentes, con autoajuste y todo. Buen trabajo. ¡ENHORABUENA!
Gracias :)

[Edito] Otra cosa que puedo meter en el futuro son efectos de fuente como subrayado y tachado.

Ups, vale, se ve que he dormido menos de lo que necesitaba (otra vez). He confundido los efectos de TEXT_Z y SET_TEXT_COLOR con el tamaño de la letra ^^U

Y mola el efecto del atardecer :) Yo quise hacerlo en FenixLand usando paletas, y esperaba hacerlo en un futuro con blendops, pero esta herramienta seguro que es igualmente útil :)

PD: si te planteas renderizar las fuentes en cursiva, piénsate el poder aplicarle ese efecto a los mapas, tanto en el eje x como en el eje y :P
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)