From 256c21c0f2fd56e6e5ca764fe0b206e5c7649287 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Thu, 1 Mar 2012 13:15:20 +0100 Subject: [PATCH] fill bitmaps as needed in intro view, as opposed to filling big bitmap at loading time --- src/intro.c | 153 ++++++++++++++++++++++++++++++++-------------------- 1 file changed, 95 insertions(+), 58 deletions(-) diff --git a/src/intro.c b/src/intro.c index e96c565..c2d484e 100644 --- a/src/intro.c +++ b/src/intro.c @@ -7,13 +7,88 @@ #include "intro.h" #include "map.h" +void FillPage(struct Game *game, int page) { + + al_set_target_bitmap(game->intro.table); + float y = 0.2; + float oldx = -1; + void draw_text(int page, char* text) { + float x = 0.45; + if (page!=oldx) { y=0.2; oldx=page; } + al_draw_text_with_shadow(game->intro.font, al_map_rgb(255,255,255), al_get_display_width(game->display)*x, al_get_display_height(game->display)*y, ALLEGRO_ALIGN_LEFT, text); + y+=0.07; + } + + void DrawPage(int p) { + switch (p) { + case 1: + al_draw_bitmap(game->intro.table_bitmap, 0, 0, 0); + draw_text(1, "Since Twilight Sparkle and her five best"); + draw_text(1, "friends defeated Discord and imprisoned"); + draw_text(1, "him in a stone using the Elements of"); + draw_text(1, "Harmony, Equestia has been a peaceful"); + draw_text(1, "place for a quite long time."); + break; + case 2: + al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*0, 0, 0); + al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*0.5, 0, 0); + draw_text(2, "Suddenly, one day some reckless pony"); + draw_text(2, "accidentally introduced a tiny little"); + draw_text(2, "bit of chaos near Discords figure."); + break; + case 3: + al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*0, 0, 0); + al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*0.5, 0, 0); + draw_text(3, "A tiny little bit of chaos turned not to"); + draw_text(3, "be enough for Discord to escape from rock,"); + draw_text(3, "but enough to turn nearly dropped muffins"); + draw_text(3, "into muffinzombies, with aim to destroy all"); + draw_text(3, "the harmony in Equestria."); + break; + case 4: + al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*0, 0, 0); + al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*0.5, 0, 0); + draw_text(4, "Discord, who has learned his lession after"); + draw_text(4, "last failure, turned his muffinzombie-gang"); + draw_text(4, "against the same mares who previously"); + draw_text(4, "defeated him, prisoning them in their own"); + draw_text(4, "houses. Thanks to that, he's now able to"); + draw_text(4, "wait until the world is again chaotic enough"); + draw_text(4, "for him to escape and rule Equestria"); + draw_text(4, "once again."); + break; + case 5: + al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*0, 0, 0); + al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*0.5, 0, 0); + draw_text(5, "Who is able to defeat Discord when the"); + draw_text(5, "Elements of Harmony are unavailable?"); + draw_text(5, ""); + draw_text(5, "Well... There is somepony who knows"); + draw_text(5, "everything about muffins..."); + break; + } + } + + DrawPage(page); + ALLEGRO_BITMAP* second = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display)); + al_set_target_bitmap(second); + DrawPage(page+1); + al_set_target_bitmap(game->intro.table); + al_draw_bitmap(second, al_get_display_width(game->display), 0, 0); + al_set_target_bitmap(al_get_backbuffer(game->display)); +} + void Intro_Draw(struct Game *game) { al_clear_to_color(al_map_rgb(0,0,0)); //printf("%f\n", ((-1*((game->intro.position)%al_get_display_width(game->display)))/(float)al_get_display_width(game->display))); - if (game->intro.in_animation) +/* if (game->intro.in_animation) al_draw_bitmap(game->intro.table, -1*(game->intro.page)*al_get_display_width(game->display) + (cos(((-1*((game->intro.position)%al_get_display_width(game->display)))/(float)al_get_display_width(game->display))*(ALLEGRO_PI))/2.0)*al_get_display_width(game->display) + al_get_display_width(game->display)/2.0, 0, 0);//al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); else - al_draw_bitmap(game->intro.table, -1*(game->intro.page)*al_get_display_width(game->display), 0, 0); //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); + al_draw_bitmap(game->intro.table, -1*(game->intro.page)*al_get_display_width(game->display), 0, 0); //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); */ + if (game->intro.in_animation) + al_draw_bitmap(game->intro.table, -1*al_get_display_width(game->display) + (cos(((-1*((game->intro.position)%al_get_display_width(game->display)))/(float)al_get_display_width(game->display))*(ALLEGRO_PI))/2.0)*al_get_display_width(game->display) + al_get_display_width(game->display)/2.0, 0, 0);//al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); + else + al_draw_bitmap(game->intro.table, 0, 0, 0); //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); //al_draw_text(game->font, al_map_rgb(255,255,255), al_get_display_width(game->display)/2, al_get_display_height(game->display)/2, ALLEGRO_ALIGN_CENTRE, "Not implemented yet!"); al_draw_text_with_shadow(game->intro.font, al_map_rgb(255,255,255), al_get_display_width(game->display)/2, al_get_display_height(game->display)*0.90, ALLEGRO_ALIGN_CENTRE, "Press any key to continue or escape to skip..."); //PrintConsole(game, "drawing"); @@ -21,8 +96,15 @@ void Intro_Draw(struct Game *game) { //PrintConsole(game, "animating"); game->intro.position -= tps(game, 600); if (game->intro.position%al_get_display_width(game->display)==0) { + //DrawConsole(game); + //al_flip_display(); game->intro.in_animation = false; + //al_set_target_bitmap(game->intro.table); + //al_draw_bitmap(game->intro.table_whole, (-1)*game->intro.page*al_get_display_width(game->display), 0, 0); + //al_set_target_bitmap(al_get_backbuffer(game->display)); + FillPage(game, game->intro.page+1); PrintConsole(game, "Animation finished."); + //al_draw_bitmap(game->intro.table, 0, 0, 0); } else if (game->intro.position<=-4*al_get_display_width(game->display)) { PrintConsole(game, "This was the last page."); @@ -76,59 +158,16 @@ void Intro_Preload(struct Game *game) { fprintf(stderr, "Audio clip sample not loaded!\n" ); exit(-1); } - game->intro.table = al_create_bitmap(al_get_display_width(game->display)*5, al_get_display_height(game->display)); + //al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP); + //game->intro.table_whole = al_create_bitmap(al_get_display_width(game->display)*5, al_get_display_height(game->display)); + //al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR); + game->intro.table = al_create_bitmap(al_get_display_width(game->display)*2, al_get_display_height(game->display)); + game->intro.font = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.04,0 ); - al_set_target_bitmap(game->intro.table); - al_draw_bitmap(game->intro.table_bitmap, 0, 0, 0); - al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*1, 0, 0); - al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*1.5, 0, 0); - al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*2, 0, 0); - al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*2.5, 0, 0); - al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*3, 0, 0); - al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*3.5, 0, 0); - al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*4, 0, 0); - al_draw_bitmap_region(game->intro.table_bitmap, al_get_bitmap_width(game->intro.table_bitmap)/2, 0, al_get_bitmap_width(game->intro.table_bitmap)/2, al_get_bitmap_height(game->intro.table_bitmap), al_get_display_width(game->display)*4.5, 0, 0); - - float y; - float oldx = -1; - void draw_text(int page, char* text) { - float x = page - 1 + 0.45; - if (x!=oldx) { y=0.2; oldx=x; } - al_draw_text_with_shadow(game->intro.font, al_map_rgb(255,255,255), al_get_display_width(game->display)*x, al_get_display_height(game->display)*y, ALLEGRO_ALIGN_LEFT, text); - y+=0.07; - } - - draw_text(1, "Since Twilight Sparkle and her five best"); - draw_text(1, "friends defeated Discord and imprisoned"); - draw_text(1, "him in a stone using the Elements of"); - draw_text(1, "Harmony, Equestia has been a peaceful"); - draw_text(1, "place for a quite long time."); - - draw_text(2, "Suddenly, one day some reckless pony"); - draw_text(2, "accidentally introduced a tiny little"); - draw_text(2, "bit of chaos near Discords figure."); - - draw_text(3, "A tiny little bit of chaos turned not to"); - draw_text(3, "be enough for Discord to escape from rock,"); - draw_text(3, "but enough to turn nearly dropped muffins"); - draw_text(3, "into muffinzombies, with aim to destroy all"); - draw_text(3, "the harmony in Equestria."); - - draw_text(4, "Discord, who has learned his lession after"); - draw_text(4, "last failure, turned his muffinzombie-gang"); - draw_text(4, "against the same mares who previously"); - draw_text(4, "defeated him, prisoning them in their own"); - draw_text(4, "houses. Thanks to that, he's now able to"); - draw_text(4, "wait until the world is again chaotic enough"); - draw_text(4, "for him to escape and rule Equestria"); - draw_text(4, "once again."); - - draw_text(5, "Who is able to defeat Discord when the"); - draw_text(5, "Elements of Harmony are unavailable?"); - draw_text(5, ""); - draw_text(5, "Well... There is somepony who knows"); - draw_text(5, "everything about muffins..."); + FillPage(game, 1); + //al_set_target_bitmap(game->intro.table); + //al_draw_bitmap(game->intro.table, 0, 0, 0); al_set_target_bitmap(al_get_backbuffer(game->display)); PrintConsole(game, "Chainpreloading GAMESTATE_MAP..."); Map_Preload(game); @@ -140,17 +179,15 @@ void Intro_Unload(struct Game *game) { for(fadeloop=255; fadeloop>=0; fadeloop-=tps(game, 600)){ al_wait_for_event(game->event_queue, &ev); if (game->intro.in_animation) - al_draw_tinted_bitmap(game->intro.table, al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1), -1*(game->intro.page)*al_get_display_width(game->display) + (cos(((-1*((game->intro.position)%al_get_display_width(game->display)))/(float)al_get_display_width(game->display))*(3.1415))/2.0)*al_get_display_width(game->display) + al_get_display_width(game->display)/2.0, 0, 0); //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); + al_draw_tinted_bitmap(game->intro.table, al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1), -1*al_get_display_width(game->display) + (cos(((-1*((game->intro.position)%al_get_display_width(game->display)))/(float)al_get_display_width(game->display))*(3.1415))/2.0)*al_get_display_width(game->display) + al_get_display_width(game->display)/2.0, 0, 0); //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); else - al_draw_tinted_bitmap(game->intro.table, al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1), -1*(game->intro.page)*al_get_display_width(game->display), 0, 0); //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); - + al_draw_tinted_bitmap(game->intro.table, al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1), 0, 0, 0); //al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); //al_draw_tinted_bitmap(game->intro.table_bitmap,al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1),-1*(game->intro.page)*al_get_display_width(game->display), al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)),0); DrawConsole(game); al_flip_display(); } - al_destroy_bitmap(game->intro.table_bitmap); al_destroy_bitmap(game->intro.table); al_destroy_font(game->intro.font); al_destroy_sample(game->intro.sample); - + al_destroy_bitmap(game->intro.table_bitmap); }