1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
/*
* Example program for the Allegro library, by Patrick Hogan
*
* This program demonstrates how to draw gouraud shaded (lit) sprites.
*/
#include <math.h>
#include "allegro.h"
/* RGB -> color mapping table. Not needed, but speeds things up */
RGB_MAP rgb_table;
COLOR_MAP light_table;
int distance(int x1, int y1, int x2, int y2)
{
int dx = x2 - x1;
int dy = y2 - y1;
int temp = sqrt((dx * dx) + (dy * dy));
temp *= 2;
if (temp > 255)
temp = 255;
return (255 - temp);
}
int main(int argc, char *argv[])
{
PALETTE pal;
BITMAP *buffer;
BITMAP *planet;
char buf[256];
allegro_init();
install_keyboard();
install_mouse();
if (set_gfx_mode(GFX_SAFE, 320, 240, 0, 0) != 0) {
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Unable to set any graphic mode\n%s\n", allegro_error);
return 1;
}
text_mode(-1);
replace_filename(buf, argv[0], "planet.pcx", sizeof(buf));
planet = load_bitmap(buf, pal);
if (!planet) {
set_gfx_mode(GFX_TEXT, 0, 0, 0, 0);
allegro_message("Error reading %s\n", buf);
return 1;
}
buffer = create_bitmap(SCREEN_W, SCREEN_H);
clear_bitmap(buffer);
set_palette(pal);
create_rgb_table(&rgb_table, pal, NULL);
rgb_map = &rgb_table;
create_light_table(&light_table, pal, 0, 0, 0, NULL);
color_map = &light_table;
set_trans_blender(0, 0, 0, 128);
do {
poll_mouse();
draw_gouraud_sprite(buffer, planet, SCREEN_W/2, SCREEN_H/2,
distance(SCREEN_W/2, SCREEN_H/2, mouse_x, mouse_y),
distance(SCREEN_W/2 + planet->w, SCREEN_H/2, mouse_x, mouse_y),
distance(SCREEN_W/2 + planet->w, SCREEN_H/2 + planet->h, mouse_x, mouse_y),
distance(SCREEN_W/2, SCREEN_H/2 + planet->h, mouse_x, mouse_y));
textout(buffer, font, "Gouraud Shaded Sprite Demo", 0, 0, palette_color[10]);
show_mouse(buffer);
blit(buffer, screen, 0, 0, 0, 0, SCREEN_W, SCREEN_H);
show_mouse(NULL);
} while (!keypressed());
destroy_bitmap(planet);
destroy_bitmap(buffer);
return 0;
}
END_OF_MAIN();
|