diff --git a/src/loading.c b/src/loading.c index 942c062..0a480d8 100644 --- a/src/loading.c +++ b/src/loading.c @@ -42,9 +42,8 @@ void Loading_Load(struct Game *game) { al_flip_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); game->loading.image = al_load_bitmap( "data/loading.png" ); al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR); @@ -79,9 +78,12 @@ void Loading_Load(struct Game *game) { GenerateLoadingBitmap(); else al_draw_bitmap(game->loading.image, 0, 0, 0); } else GenerateLoadingBitmap(); + */ + game->loading.image = LoadFromCache(game, "loading.png", al_get_display_width(game->display), al_get_display_height(game->display)); // Scale "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_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)); diff --git a/src/main.c b/src/main.c index 3420da6..e950b5f 100644 --- a/src/main.c +++ b/src/main.c @@ -122,6 +122,58 @@ void LoadGameState(struct Game *game) { 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){ srand(time(NULL)); @@ -199,6 +251,7 @@ int main(int argc, char **argv){ if (game.fullscreen) al_hide_mouse_cursor(game.display); 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_console = al_load_ttf_font("data/DejaVuSansMono.ttf",al_get_display_height(game.display)*0.018,0 ); diff --git a/src/main.h b/src/main.h index 29d667e..76da65d 100644 --- a/src/main.h +++ b/src/main.h @@ -168,4 +168,7 @@ void PrintConsole(struct Game *game, char* format, ...); /*! \brief Draws console bitmap on screen. */ 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 diff --git a/src/menu.c b/src/menu.c index 9bccab5..c935d2c 100644 --- a/src/menu.c +++ b/src/menu.c @@ -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_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.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.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.image = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display)); //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.mountain = al_load_bitmap( "data/mountain.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.pie = al_load_bitmap( "data/pie.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.rain_sample = al_load_sample( "data/rain.flac" ); @@ -107,29 +109,33 @@ void Menu_Preload(struct Game *game) { } // 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_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); // 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); al_set_target_bitmap(game->menu.cloud_bitmap); 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); 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_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); 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); 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); game->menu.pie_bitmap = al_create_bitmap(al_get_display_width(game->display)/2, al_get_display_height(game->display)); //*0.8122);