Category Archives: Códigos

Fade In/Out com Allegro

Há um tempinho atrás eu postei um código de Fade in/out com fblend que eu adaptei do código que peguei no Allegro.cc. Mas eu nem pensei, que tem gente que não precisa usar a fblend (ainda), e sempre me perguntam como fazer isso. Então vou postar aqui como usar aquele código.

Acredito que o jeito mais fácil, seja adicionar estas funções no seu arquivo fonte:

void highcolor_fade_in(BITMAP *bmp_orig, int speed)
{
   BITMAP *bmp_buff;

    if ((bmp_buff = create_bitmap(SCREEN_W, SCREEN_H)))
    {
        int a;
        if (speed <= 0) speed = 16;

        for (a = 0; a < 256; a+=speed)
        {
            clear(bmp_buff);
            set_trans_blender(0,0,0,a);
            draw_trans_sprite(bmp_buff, bmp_orig, 0, 0);
            vsync();
            blit(bmp_buff, screen, 0,0, 0,0, SCREEN_W, SCREEN_H);
        }
        destroy_bitmap(bmp_buff);
    }

    blit(bmp_orig, screen, 0,0, 0,0, SCREEN_W, SCREEN_H);
}

void highcolor_fade_out(int speed)
{
    BITMAP *bmp_orig, *bmp_buff;

    if ((bmp_orig = create_bitmap(SCREEN_W, SCREEN_H)))
    {
        if ((bmp_buff = create_bitmap(SCREEN_W, SCREEN_H)))
        {
            int a;
            blit(screen, bmp_orig, 0,0, 0,0, SCREEN_W, SCREEN_H);
            if (speed <= 0) speed = 16;

            for (a = 255-speed; a > 0; a-=speed)
            {
                clear(bmp_buff);
                set_trans_blender(0,0,0,a);
                draw_trans_sprite(bmp_buff, bmp_orig, 0, 0);
                vsync();
                blit(bmp_buff, screen, 0,0, 0,0, SCREEN_W, SCREEN_H);
            }
            destroy_bitmap(bmp_buff);
        }
        destroy_bitmap(bmp_orig);
    }

    rectfill(screen, 0,0, SCREEN_W,SCREEN_H, makecol(0,0,0));
}

E depois só chamar as funções, mas você pode criar um arquivo fonte, colocar estas funções e então criar um arquivo header e colocar as respectivas declarações das funções.

Tá, mas como se usa?

Assim… A função fade_in, vai do pretão para uma imagem, então você tem que ter esta imagem que você quer que apareça (tela inteira) em um BITMAP, então você faz isso:

highcolor_fade_in(bitmap, 16);

Lembrando que quanto maior for o valor dado a velocidade (no caso ), mas rápido vai ser, e este valor vai de 1 a 255.

Já a função de fade_out, que transforma da imagem atual para o preto, é assim:

highcolor_fade_out(16);

E a regra para a velocidade é a mesma do fade_in! ^^

Bom, é isso ae pessoal, artigo simples para iniciantes! :)

Flw

Google Buzz

Fade In/Out com fblend no Allegro

Acho que muita gente já deve ter usado aquele famoso código de fade in/out que tem no site da Allegro.cc, certo? Eu mesmo uso ele bastante! Mas como todo mundo também já deve saber, as rotinas de blend da Allegro são lentas, por isso existe a biblioteca addon fblend, que é bem mais rápida.

Se você estiver utilizando ela no seu projeto e desejar usar fade in/out, você pode utilizar estas funções aqui:

void fade_in(BITMAP *bmp_orig, int speed)
{
   BITMAP *bmp_buff;

    if ((bmp_buff = create_bitmap(SCREEN_W, SCREEN_H)))
    {
        int a;
        if (speed <= 0) speed = 16;

        for (a = 0; a < 256; a+=speed)
        {
            clear(bmp_buff);
            fblend_trans(bmp_orig, bmp_buff, 0, 0, a);
            blit(bmp_buff, screen, 0,0, 0,0, SCREEN_W, SCREEN_H);
        }
        destroy_bitmap(bmp_buff);
    }

    blit(bmp_orig, screen, 0,0, 0,0, SCREEN_W, SCREEN_H);
}

void fade_out(int speed)
{
    BITMAP *bmp_orig, *bmp_buff;

    if ((bmp_orig = create_bitmap(SCREEN_W, SCREEN_H)))
    {
        if ((bmp_buff = create_bitmap(SCREEN_W, SCREEN_H)))
        {
            int a;
            blit(screen, bmp_orig, 0,0, 0,0, SCREEN_W, SCREEN_H);
            if (speed <= 0) speed = 16;

            for (a = 255-speed; a > 0; a-=speed)
            {
                clear(bmp_buff);
                fblend_trans(bmp_orig, bmp_buff, 0, 0, a);
                blit(bmp_buff, screen, 0,0, 0,0, SCREEN_W, SCREEN_H);
            }
            destroy_bitmap(bmp_buff);
        }
        destroy_bitmap(bmp_orig);
    }

    rectfill(screen, 0,0, SCREEN_W,SCREEN_H, makecol(0,0,0));
}

Que nada mais são do que aquelas funções que tem no site da A.cc, só que com o fblend, não com o blend do Allegro.

Se você não sabe o que é a fblend, aguarde mais um pouco que logo eu pretendo fazer um tutorialzinho básico de como instalá-la e usá-la! =D

Bom uso!

Google Buzz

Entrada de Texto no Allegro

Não é de hoje que as pessoas buscam por métodos para fazer entrada de textos no Allegro, que por sua vez, não nos oferece nenhuma opção concreta, apenas algumas funções para entrada de teclas, e indentificação das mesmas.

Há um tempo atrás, eu também precisei disto, então vi que no site da Allegro.cc continha um exmeplo, então adaptei-o para minha necessidade. Muitas pessoas me perguntam como fazer isso, então, hoje só passo a função modificada que fiz desta, e até que ela anda servindo para bastante gente! hehehe

Por isso resolvi postar aqui. Ela ainda está primitiva, com muitos bugs, mas acredito que sirva para muitas coisas, aqui vai ela:

char *getText(int x, int y, BITMAP *buff, int cor)
{
     char    edittext[128];
     BITMAP *fundo = buff;
     BITMAP *buffer = create_bitmap(screen->w, screen->h);

     int     caret  = 0;

     int l = 0;

     memset(edittext, 0, sizeof(edittext));

     while (l == 0)
     {
           clear(buffer);
           draw_sprite(buffer, fundo, 0, 0);
           vline(buffer, ( caret * 8 ) + x, y-2, y+8, cor);
           if(keypressed())
           {
                    int  newkey   = readkey();
                    char ASCII    = newkey & 0xff;
                    char scancode = newkey >> 8;

                    /* a character key was pressed; add it to the string */
                    if(ASCII >= 32 && ASCII <= 126)
                    {
				             if(caret < 128 - 1)
				             {
				    	              edittext[caret] = ASCII;
					                  caret++;
					                  edittext[caret] = '';
                             }
                    }
                    else if(scancode == KEY_BACKSPACE)
                    {
                         if (caret > 0) caret--;
                         edittext[caret] = '';
                    }
                    else if(scancode == KEY_ENTER)
                    {
				         l = 1;
                    }
             }
             textprintf_ex(buffer, font, x, y, cor, -1, "%s", edittext);
             blit(buffer, screen, 0, 0, 0, 0, 320, 240);
      }

      /*destroy_bitmap(buffer);
      destroy_bitmap(fundo);*/

      return edittext;
}

Os parâmetros dela, são respectivamente:
x: posição na coordenada X que vai conter o texto digitado
y: posição na coordenada Y que vai conter o texto digitado
buff: Bitmap de fundo, que vai ser mostrado enquanto você digita
cor: A cor em que vai ser mostrado o texto

Para usá-la, basta criar uma string:

char string[128];
memset(string, 0, sizeof(string));

E então copiar o resultado da função getText para esta string, assim:

strcpy(string, getText(10,10,buffer,0xFFFFFF));

Está simples, mas funciona, né! hehehe

Google Buzz