MotionBlur com Allegro

Mais uma aplicação com Allegro inútil, feita quando não tinha nada para fazer! hehehe

Tava no msn conversando com meu amigo Bruno (brwnow_w da UniDev), e então me deu vontade de fazer um teste com o Efeito MotionBlur, bom, então aqui está!

Primeiramente peço desculpas pelas gambiarras e pelo código feio, mas é que eu estava com sono e fiz de última hora mesmo, mas acho que dá uma idéia de como é (dá? xD)…

/*
 * by CrociDB
 */ 

#include <allegro.h> 

#define NUM_FX          5
#define EMPTY           0xFDAFEF 

#define MAX_TIME        6 

void Init();
void CreatePlayer();
void doFX(); 

BITMAP *buffer;
BITMAP *pl; 

int tempo; 

double x, y;
double force;
int x2[NUM_FX], y2[NUM_FX]; 

int bullet; 

int flag; 

int main()
{
    Init();
    CreatePlayer(); 

    while(!key[KEY_ESC])
    {
        rest(1);
        clear_to_color(buffer, 0xFFFFFF); 

        doFX(); 

        if (key[KEY_LEFT])
        {
            x-=force;
        }
        else if (key[KEY_RIGHT])
        {
            x+=force;
        } 

        if (key[KEY_UP])
        {
            y-=force;
        }
        else if (key[KEY_DOWN])
        {
            y+=force;
        } 

        if (key[KEY_SPACE])
        {
            if (flag == 0)
            {
                if (bullet == 1)
                {
                    bullet = 0;
                    force = 1.0;
                    int i;
                    for (i = 0; i < NUM_FX; i++)
                    {
                        x2&#91;i&#93; = EMPTY;
                        y2&#91;i&#93; = EMPTY;
                    }
                }
                else
                {
                    bullet = 1;
                    force = 0.6;
                }
                flag = 1;
            }
        }
        else
        {
            flag = 0;
        } 

        textprintf_ex(buffer, font, 10, 465, 0, -1, "Aperte espaco para mudar BulletTime On/Off"); 

        blit(buffer, screen, 0, 0 ,0 ,0, 640, 480); 

    } 

    return 0;
}END_OF_MAIN() 

void Init()
{
    allegro_init(); 

    set_color_depth(32);
    set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0); 

    set_window_title("BulletTime - by CrociDB"); 

    install_keyboard(); 

    buffer = create_bitmap(640, 480); 

    x = 0;
    y = 0; 

    int i;
    for (i = 0; i < NUM_FX; i++)
    {
        x2&#91;i&#93; = EMPTY;
        y2&#91;i&#93; = EMPTY;
    } 

    tempo = 0;
    force = 1.0; 

    bullet = 0; 

    flag = 0; 

} 

void CreatePlayer()
{
    pl = create_bitmap(30, 30);
    clear_to_color(pl, 0xFF00FF);
    circlefill(pl, 15, 15, 8, 0xFF1111);
} 

void doFX()
{
    int i; 

    //allegro_message("Teste"); 

    if (bullet == 1)
    {
        for (i = 0; i < NUM_FX; i++)
        {
            set_trans_blender(255,255,255,255-i*(255/NUM_FX)); 

            if (x2&#91;i&#93; != EMPTY)
            {
                draw_trans_sprite(buffer, pl, x2&#91;i&#93;, y2&#91;i&#93;);
            }
        }
    } 

    draw_sprite(buffer, pl, x, y); 

    if (bullet == 1)
    {
        if (tempo++ > MAX_TIME)
        {
            tempo = 0; 

            x2[0] = x;
            y2[0] = y; 

            for (i = (NUM_FX-1); i > 0; i--)
            {
                x2[i] = x2[i-1];
                y2[i] = y2[i-1]; 

                //textprintf_ex(buffer, font, 10, i*10+10, 0, -1, "X: %i e Y: %i e %i", x2[i], y2[i], i);
            }
        }
    }
}

Não me linchem pelo mau código 😦

Vlw

Anúncios

5 Respostas

  1. Interessante efeito. Já tinha observado em algum jogo, mais ignorava o nome. Com este programa se nota uma coisa que se comenta bastante nos fóruns da Allegro.cc, que as funções transparency do allegro são bem lentas. Pensando um pouco eu vejo como solução usar o fblend, ou simular as transparências com color masks como eles faziam nos jogos antigos (mega drive, snes…).

    Uma coisa, você esta usando de forma incorreta o sistema de tags da WordPress. Acho que você tem que separar os tags por vírgulas, não por espaços. Desse jeito, quando eu faço clic os único artigos relacionados que ele encontra é próprio artigo.

  2. Olá amigo!

    Então, realmente as rotinas de blend do Allegro são bem lentas. A fblend ajuda bastante, mas eu criei esse exemplo sem usá-la por que ia passar para um amigo que não tinha, mas depois crio algum tutorial ou algo assim sobre ela.

    Mas nesse caso, está lerdo por que eu diminuo a velocidade quando é ativado o efeito, pode ver a variável “force”, quando é ativado o efeito eu diminuo o seu valor, e é ela que é incrementada nas variáveis de posição.

    Hehehe, foi mal pelas tags erradas, eu num entendo muito bem disso, mas vo começar a colocar direito! Obrigado pela dica ^^

    Vlw

  3. É realmente não tinha visto a linha “force=0.6”. Eu coloquei um pouco mais de código para ver o número de frames por segundo e realmente o número permaneceu constante nos dois modos.

  4. Sem querer ser flooder, mais eu percebi que no teu código você não libera a memória usado pelo buffer e pelo pl.

    Outra coisa, por que você não usa as constantes SCREEN_W e SCREEN_H que o Allegro te proporciona? Além de que você podia fazer um #define W 640 #define H 480, assim fica melhor porque imagine que você decide que quer mudar o tamanho da janela a 800×600, no método que você usa teríamos que mudar depois o código no blit, mudar a declaração do tamanho do buffer etc…

  5. Nada cara… que é isso, pode postar a vontade! =D

    Então, como eu disse, o código está porco, eu num liberei nada mesmo, mas essa não é a intenção do blog, por favor não aprendam as coisas erradas!!! hehehehe (vlw xD)

    E quanto a usar uma macro, bom, isso eu uso nos meus projetos, em códigos testes eu nem penso nisso, primeiro que é mais fácil digitar 640 do que SCREEN_W, ou sei lá né… Mas eu num custumo usar em testes não, eu sempre uso 640×480 nos testes (num sei pq… lol)! hehehe

    Mas muito obrigado por comentar, e qualquer coisa, esteja a vontade para postar aqui hein! =D

    Valeu!

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: