domingo, 7 de março de 2010

Desenho de linhas e retorno de funções

Allegro oferece um recurso realmente fascinante no que diz respeito em desenhar uma linha abstrata por disparar uma função de retorno em que presumivelmente, você pode querer desenhar um pixel não especificando uma localização (x, y), embora cabe a você fazer o que quiser com as coordenadas. Para uma função que retorna um valor, você pode usar a função do_line, que se parece com isto:
void do_line(BITMAP *bmp, int x1, y1, x2, y2, int d, void(*proc))
A função de retorno tem o seguinte formato:
void doline_callback(BITMAP *bmp, int x, int y, int d)
Para utilizar a chamada de retorno, que pretende chamar a função do_line como você chamaria a função de linha normal, com a adição do ponteiro retornado como ultimo parâmetro. Para totalmente demonstra como isso pode ser útil, eu escrevi um pequeno programa que desenha linhas aleatoriamente na tela. Mas antes de desenhar cada pixel da linha, uma verificação é realizada da nova posição para determinar se um pixel já está presente. Isso indica uma intersecção ou colisão. Quando isso ocorre a linha está terminada e um pequeno circulo é desenhado para indicar o cruzamento.
// Cabeçalho com a inclusão das bibliotecas
// necessárias para esse programa
#include <conio.h>
#include <stdlib.h>
#include <allegro.h>

int stop = 0;

// doline é a função de retorno para do_line
void doline(BITMAP *bmp, int x, int y, int color)
{
if(!stop){
if(getpixel(bmp, x, y) == 0){
putpixel(bmp, x, y, color);
rest(1);
}
else{
stop = 1;
circle(bmp, x, y, 5, 7);
}
}
}

// Inicio do programa principal
void main(void)
{
int x1, y1, x2, y2;
int red, green, blue, color;
long n;

// Inicializa a Allegro
allegro_init();

install_timer();
srand(time(NULL));

// Inicializa o teclado
install_keyboard();

// Inicializa o modo do video para 640x480
int ret = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640,
480, 0, 0);
if(ret != 0){
allegro_message(allegro_error);
return;
}
// Mostra a resolução da tela
textprintf(screen, font, 0, 0, 15,
"Dolines Program - %dx%d - Pressione ESC para
sair",
SCREEN_W, SCREEN_H);

// Aguarda o pressionamento da tecla ESC
while(!key[KEY_ESC])
{
// Configura uma localização aleatória
x1 = 10 + rand() % (SCREEN_W - 20);
y1 = 10 + rand() % (SCREEN_H - 20);
x2 = 10 + rand() % (SCREEN_W - 20);
y2 = 10 + rand() % (SCREEN_H - 20);

// Configura uma cor aleatória
red = rand() % 255;
green = rand() % 255;
blue = rand() % 255;
color = makecol(red, green, blue);

// Desenha a linha usando a função de retorno
stop = 0;
do_line(screen, x1, y1, x2, y2, color, *doline);
rest(1);
}
// finaliza o programa
allegro_exit();
}
END_OF_MAIN();


Este vídeo mostra a execução do programa:



Para baixar este exemplo clique aki.

Nenhum comentário:

Postar um comentário