moar memory bitmaps

This commit is contained in:
Sebastian Krzyszkowiak 2012-03-01 00:37:16 +01:00
parent 7de296ae93
commit cbdb68382c
4 changed files with 74 additions and 10 deletions

View file

@ -42,9 +42,8 @@ void Loading_Load(struct Game *game) {
al_flip_display(); al_flip_display();
game->loading.loading_bitmap = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display)); game->loading.loading_bitmap = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display));
al_set_target_bitmap(game->loading.loading_bitmap);
void GenerateLoadingBitmap() { /* void GenerateLoadingBitmap() {
al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP); al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP);
game->loading.image = al_load_bitmap( "data/loading.png" ); game->loading.image = al_load_bitmap( "data/loading.png" );
al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR); al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR);
@ -79,9 +78,12 @@ void Loading_Load(struct Game *game) {
GenerateLoadingBitmap(); GenerateLoadingBitmap();
else al_draw_bitmap(game->loading.image, 0, 0, 0); else al_draw_bitmap(game->loading.image, 0, 0, 0);
} else GenerateLoadingBitmap(); } else GenerateLoadingBitmap();
*/
game->loading.image = LoadFromCache(game, "loading.png", al_get_display_width(game->display), al_get_display_height(game->display));
// Scale "Loading" bitmap // Scale "Loading" bitmap
al_set_target_bitmap(game->loading.loading_bitmap); al_set_target_bitmap(game->loading.loading_bitmap);
al_draw_bitmap(game->loading.image, 0, 0, 0);
//al_draw_scaled_bitmap(game->loading.image,0, 0, al_get_bitmap_width(game->loading.image), al_get_bitmap_height(game->loading.image), 0, 0, al_get_display_width(game->display), al_get_display_height(game->display),0); //al_draw_scaled_bitmap(game->loading.image,0, 0, al_get_bitmap_width(game->loading.image), al_get_bitmap_height(game->loading.image), 0, 0, al_get_display_width(game->display), al_get_display_height(game->display),0);
al_draw_text_with_shadow(game->font, al_map_rgb(255,255,255), al_get_display_width(game->display)*0.0234, al_get_display_height(game->display)*0.85, ALLEGRO_ALIGN_LEFT, "Loading..."); al_draw_text_with_shadow(game->font, al_map_rgb(255,255,255), al_get_display_width(game->display)*0.0234, al_get_display_height(game->display)*0.85, ALLEGRO_ALIGN_LEFT, "Loading...");
al_set_target_bitmap(al_get_backbuffer(game->display)); al_set_target_bitmap(al_get_backbuffer(game->display));

View file

@ -122,6 +122,58 @@ void LoadGameState(struct Game *game) {
game->loadstate = -1; game->loadstate = -1;
} }
void ScaleBitmap(ALLEGRO_BITMAP* source, int width, int height) {
int x, y;
for (y = 0; y < height; y++) {
float pixy = ((float)y / height) * al_get_bitmap_height(source);
for (x = 0; x < width; x++) {
float pixx = ((float)x / width) * al_get_bitmap_width(source);
ALLEGRO_COLOR a = al_get_pixel(source, pixx-0.25, pixy-0.25);
ALLEGRO_COLOR b = al_get_pixel(source, pixx+0.25, pixy-0.25);
ALLEGRO_COLOR c = al_get_pixel(source, pixx-0.25, pixy+0.25);
ALLEGRO_COLOR d = al_get_pixel(source, pixx+0.25, pixy+0.25);
ALLEGRO_COLOR result = al_map_rgba_f(
(a.r+b.r+c.r+d.r) / 4,
(a.g+b.b+c.g+d.g) / 4,
(a.b+b.g+c.b+d.b) / 4,
(a.a+b.a+c.a+d.a) / 4
);
al_draw_pixel(x, y, result);
}
}
}
ALLEGRO_BITMAP* LoadFromCache(struct Game *game, char* filename, int width, int height) {
ALLEGRO_BITMAP *source, *target = al_create_bitmap(width, height);
al_set_target_bitmap(target);
al_clear_to_color(al_map_rgba(0,0,0,0));
char origfn[255] = "data/";
char cachefn[255] = "data/cache/";
strcat(origfn, filename);
strcat(cachefn, filename);
void GenerateBitmap() {
al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP);
source = al_load_bitmap( origfn );
al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR);
ScaleBitmap(source, width, height);
al_save_bitmap(cachefn, target);
PrintConsole(game, "Cache bitmap %s generated.", filename);
}
source = al_load_bitmap( cachefn );
if (source) {
if ((al_get_bitmap_width(source)!=width) || (al_get_bitmap_height(source)!=height)) {
al_destroy_bitmap(source);
GenerateBitmap();
return target;
}
return source;
} else GenerateBitmap();
return target;
}
int main(int argc, char **argv){ int main(int argc, char **argv){
srand(time(NULL)); srand(time(NULL));
@ -199,6 +251,7 @@ int main(int argc, char **argv){
if (game.fullscreen) al_hide_mouse_cursor(game.display); if (game.fullscreen) al_hide_mouse_cursor(game.display);
al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR); al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR);
al_set_new_bitmap_format(ALLEGRO_PIXEL_FORMAT_ANY_32_WITH_ALPHA);
game.font = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game.display)*0.09,0 ); game.font = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game.display)*0.09,0 );
game.font_console = al_load_ttf_font("data/DejaVuSansMono.ttf",al_get_display_height(game.display)*0.018,0 ); game.font_console = al_load_ttf_font("data/DejaVuSansMono.ttf",al_get_display_height(game.display)*0.018,0 );

View file

@ -168,4 +168,7 @@ void PrintConsole(struct Game *game, char* format, ...);
/*! \brief Draws console bitmap on screen. */ /*! \brief Draws console bitmap on screen. */
void DrawConsole(struct Game *game); void DrawConsole(struct Game *game);
void ScaleBitmap(ALLEGRO_BITMAP* source, int width, int height);
ALLEGRO_BITMAP* LoadFromCache(struct Game *game, char* filename, int width, int height);
#endif #endif

View file

@ -28,7 +28,7 @@ void Menu_Draw(struct Game *game) {
al_draw_tinted_bitmap(game->menu.mountain_bitmap,al_map_rgba_f(tint,tint,tint,tint),game->menu.mountain_position, 0,0); al_draw_tinted_bitmap(game->menu.mountain_bitmap,al_map_rgba_f(tint,tint,tint,tint),game->menu.mountain_position, 0,0);
al_draw_scaled_bitmap(game->menu.cloud_bitmap,0,0,al_get_bitmap_width(game->menu.cloud_bitmap), al_get_bitmap_height(game->menu.cloud_bitmap), al_get_display_width(game->display)*(sin((game->menu.cloud_position/40)-4.5)-0.3), al_get_display_height(game->display)*0.35, al_get_bitmap_width(game->menu.cloud_bitmap)/2, al_get_bitmap_height(game->menu.cloud_bitmap)/2,0); al_draw_scaled_bitmap(game->menu.cloud_bitmap,0,0,al_get_bitmap_width(game->menu.cloud_bitmap), al_get_bitmap_height(game->menu.cloud_bitmap), al_get_display_width(game->display)*(sin((game->menu.cloud_position/40)-4.5)-0.3), al_get_display_height(game->display)*0.35, al_get_bitmap_width(game->menu.cloud_bitmap)/2, al_get_bitmap_height(game->menu.cloud_bitmap)/2,0);
al_draw_bitmap(game->menu.cloud2_bitmap,al_get_display_width(game->display)*(game->menu.cloud2_position/100.0), al_get_display_height(game->display)/1.5,0); al_draw_bitmap(game->menu.cloud2_bitmap,al_get_display_width(game->display)*(game->menu.cloud2_position/100.0), al_get_display_height(game->display)/1.5,0);
al_draw_bitmap(game->menu.menu_bitmap,0, 0,0); al_draw_bitmap(game->menu.menu_bitmap,0, al_get_display_height(game->display)*0.55,0);
al_draw_bitmap(game->menu.pinkcloud_bitmap,(al_get_display_width(game->display)*0.12) + (cos((game->menu.cloud_position/25+80)*1.74444))*40, 0,0); al_draw_bitmap(game->menu.pinkcloud_bitmap,(al_get_display_width(game->display)*0.12) + (cos((game->menu.cloud_position/25+80)*1.74444))*40, 0,0);
al_draw_bitmap(game->menu.cloud_bitmap,al_get_display_width(game->display)*game->menu.cloud_position/100, 30,0); al_draw_bitmap(game->menu.cloud_bitmap,al_get_display_width(game->display)*game->menu.cloud_position/100, 30,0);
@ -71,7 +71,7 @@ void Menu_Preload(struct Game *game) {
game->menu.loaded = true; game->menu.loaded = true;
//game->menu.image = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display)); //game->menu.image = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display));
//al_destroy_bitmap(game->menu.image); // ugh... //al_destroy_bitmap(game->menu.image); // ugh...
al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MEMORY_BITMAP); al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP);
game->menu.image = al_load_bitmap( "data/menu.png" ); game->menu.image = al_load_bitmap( "data/menu.png" );
game->menu.mountain = al_load_bitmap( "data/mountain.png" ); game->menu.mountain = al_load_bitmap( "data/mountain.png" );
game->menu.cloud = al_load_bitmap( "data/cloud.png" ); game->menu.cloud = al_load_bitmap( "data/cloud.png" );
@ -79,7 +79,9 @@ void Menu_Preload(struct Game *game) {
game->menu.rain = al_load_bitmap( "data/rain.png" ); game->menu.rain = al_load_bitmap( "data/rain.png" );
game->menu.pie = al_load_bitmap( "data/pie.png" ); game->menu.pie = al_load_bitmap( "data/pie.png" );
game->menu.pinkcloud = al_load_bitmap( "data/pinkcloud.png" ); game->menu.pinkcloud = al_load_bitmap( "data/pinkcloud.png" );
al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR); al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR);
//game->menu.menu_bitmap = LoadFromCache(game, "menu.png", al_get_display_width(game->display), al_get_display_height(game->display));
game->menu.sample = al_load_sample( "data/menu.flac" ); game->menu.sample = al_load_sample( "data/menu.flac" );
game->menu.rain_sample = al_load_sample( "data/rain.flac" ); game->menu.rain_sample = al_load_sample( "data/rain.flac" );
@ -107,29 +109,33 @@ void Menu_Preload(struct Game *game) {
} }
// Scale menu bitmap // Scale menu bitmap
game->menu.menu_bitmap = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display)); game->menu.menu_bitmap = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display)*0.45);
al_set_target_bitmap(game->menu.menu_bitmap); al_set_target_bitmap(game->menu.menu_bitmap);
al_clear_to_color(al_map_rgba(0,0,0,0)); al_clear_to_color(al_map_rgba(0,0,0,0));
al_draw_scaled_bitmap(game->menu.image,0, 0, al_get_bitmap_width(game->menu.image), al_get_bitmap_height(game->menu.image), 0, 0, al_get_display_width(game->display), al_get_display_height(game->display),0); ScaleBitmap(game->menu.image, al_get_display_width(game->display), al_get_display_height(game->display)*0.45);
//al_draw_scaled_bitmap(game->menu.image,0, 0, al_get_bitmap_width(game->menu.image), al_get_bitmap_height(game->menu.image), 0, 0, al_get_display_width(game->display), al_get_display_height(game->display),0);
al_destroy_bitmap(game->menu.image); al_destroy_bitmap(game->menu.image);
// Cloud menu bitmap // Cloud menu bitmap
game->menu.cloud_bitmap = al_create_bitmap(al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.25); game->menu.cloud_bitmap = al_create_bitmap(al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.25);
al_set_target_bitmap(game->menu.cloud_bitmap); al_set_target_bitmap(game->menu.cloud_bitmap);
al_clear_to_color(al_map_rgba(0,0,0,0)); al_clear_to_color(al_map_rgba(0,0,0,0));
al_draw_scaled_bitmap(game->menu.cloud,0, 0, al_get_bitmap_width(game->menu.cloud), al_get_bitmap_height(game->menu.cloud), 0, 0, al_get_bitmap_width(game->menu.cloud_bitmap), al_get_bitmap_height(game->menu.cloud_bitmap),0); ScaleBitmap(game->menu.cloud, al_get_bitmap_width(game->menu.cloud_bitmap), al_get_bitmap_height(game->menu.cloud_bitmap));
//al_draw_scaled_bitmap(game->menu.cloud,0, 0, al_get_bitmap_width(game->menu.cloud), al_get_bitmap_height(game->menu.cloud), 0, 0, al_get_bitmap_width(game->menu.cloud_bitmap), al_get_bitmap_height(game->menu.cloud_bitmap),0);
al_destroy_bitmap(game->menu.cloud); al_destroy_bitmap(game->menu.cloud);
game->menu.cloud2_bitmap = al_create_bitmap(al_get_display_width(game->display)*0.2, al_get_display_height(game->display)*0.1); game->menu.cloud2_bitmap = al_create_bitmap(al_get_display_width(game->display)*0.2, al_get_display_height(game->display)*0.1);
al_set_target_bitmap(game->menu.cloud2_bitmap); al_set_target_bitmap(game->menu.cloud2_bitmap);
al_clear_to_color(al_map_rgba(0,0,0,0)); al_clear_to_color(al_map_rgba(0,0,0,0));
al_draw_scaled_bitmap(game->menu.cloud2,0, 0, al_get_bitmap_width(game->menu.cloud2), al_get_bitmap_height(game->menu.cloud2), 0, 0, al_get_bitmap_width(game->menu.cloud2_bitmap), al_get_bitmap_height(game->menu.cloud2_bitmap),0); ScaleBitmap(game->menu.cloud2, al_get_bitmap_width(game->menu.cloud2_bitmap), al_get_bitmap_height(game->menu.cloud2_bitmap));
//al_draw_scaled_bitmap(game->menu.cloud2,0, 0, al_get_bitmap_width(game->menu.cloud2), al_get_bitmap_height(game->menu.cloud2), 0, 0, al_get_bitmap_width(game->menu.cloud2_bitmap), al_get_bitmap_height(game->menu.cloud2_bitmap),0);
al_destroy_bitmap(game->menu.cloud2); al_destroy_bitmap(game->menu.cloud2);
game->menu.pinkcloud_bitmap = al_create_bitmap(al_get_display_width(game->display)*0.33125, al_get_display_height(game->display)); //*0.8122); game->menu.pinkcloud_bitmap = al_create_bitmap(al_get_display_width(game->display)*0.33125, al_get_display_height(game->display)); //*0.8122);
game->menu.pinkcloud_scaled = al_create_bitmap(al_get_bitmap_width(game->menu.pinkcloud_bitmap), al_get_bitmap_height(game->menu.pinkcloud_bitmap)*0.8122); game->menu.pinkcloud_scaled = al_create_bitmap(al_get_bitmap_width(game->menu.pinkcloud_bitmap), al_get_bitmap_height(game->menu.pinkcloud_bitmap)*0.8122);
al_set_target_bitmap(game->menu.pinkcloud_scaled); al_set_target_bitmap(game->menu.pinkcloud_scaled);
al_draw_scaled_bitmap(game->menu.pinkcloud,0, 0, al_get_bitmap_width(game->menu.pinkcloud), al_get_bitmap_height(game->menu.pinkcloud), 0, 0, al_get_bitmap_width(game->menu.pinkcloud_scaled), al_get_bitmap_height(game->menu.pinkcloud_scaled),0); ScaleBitmap(game->menu.pinkcloud, al_get_bitmap_width(game->menu.pinkcloud_scaled), al_get_bitmap_height(game->menu.pinkcloud_scaled));
//al_draw_scaled_bitmap(game->menu.pinkcloud,0, 0, al_get_bitmap_width(game->menu.pinkcloud), al_get_bitmap_height(game->menu.pinkcloud), 0, 0, al_get_bitmap_width(game->menu.pinkcloud_scaled), al_get_bitmap_height(game->menu.pinkcloud_scaled),0);
al_destroy_bitmap(game->menu.pinkcloud); al_destroy_bitmap(game->menu.pinkcloud);
game->menu.pie_bitmap = al_create_bitmap(al_get_display_width(game->display)/2, al_get_display_height(game->display)); //*0.8122); game->menu.pie_bitmap = al_create_bitmap(al_get_display_width(game->display)/2, al_get_display_height(game->display)); //*0.8122);