From bbf0198669366341faa15453d41f031c7b9ec0e9 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Fri, 4 May 2012 01:12:19 +0200 Subject: [PATCH] performance fixes for intro gamestate --- src/intro.c | 46 +++++++++++++++++++++++++++++----------------- src/level.c | 5 +++-- src/main.h | 1 - 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/intro.c b/src/intro.c index 685fb0f..f136bcc 100644 --- a/src/intro.c +++ b/src/intro.c @@ -23,14 +23,13 @@ #include "intro.h" #include "map.h" -void AnimPage(struct Game *game, int page) { - al_set_target_bitmap(game->intro.animation); - al_clear_to_color(al_map_rgba(0,0,0,0)); +void AnimPage(struct Game *game, int page, ALLEGRO_COLOR tint) { + int offset = 0; + if (game->intro.in_animation) offset = -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; - if (page<6) al_draw_bitmap_region(game->intro.animsprites[page-1],al_get_display_width(game->display)*0.3125*(int)fmod(game->intro.anim,3),al_get_display_height(game->display)*0.63*(((int)(game->intro.anim/3))%3),al_get_display_width(game->display)*0.3125, al_get_display_height(game->display)*0.63,al_get_display_width(game->display)*0.08, al_get_display_height(game->display)*0.18,0); - if (page<5) al_draw_bitmap_region(game->intro.animsprites[page],al_get_display_width(game->display)*0.3125*(int)fmod(game->intro.anim,3),al_get_display_height(game->display)*0.63*(((int)(game->intro.anim/3))%3),al_get_display_width(game->display)*0.3125, al_get_display_height(game->display)*0.63,al_get_display_width(game->display)*1.08, al_get_display_height(game->display)*0.18,0); - - al_set_target_bitmap(al_get_backbuffer(game->display)); + if (page<6) al_draw_tinted_bitmap_region(game->intro.animsprites[page-1],tint,al_get_display_width(game->display)*0.3125*(int)fmod(game->intro.anim,3),al_get_display_height(game->display)*0.63*(((int)(game->intro.anim/3))%3),al_get_display_width(game->display)*0.3125, al_get_display_height(game->display)*0.63,offset+al_get_display_width(game->display)*0.08, al_get_display_height(game->display)*0.18,0); + if (page<5) al_draw_tinted_bitmap_region(game->intro.animsprites[page],tint,al_get_display_width(game->display)*0.3125*(int)fmod(game->intro.anim,3),al_get_display_height(game->display)*0.63*(((int)(game->intro.anim/3))%3),al_get_display_width(game->display)*0.3125, al_get_display_height(game->display)*0.63,offset+al_get_display_width(game->display)*1.08, al_get_display_height(game->display)*0.18,0); + game->intro.anim += tps(game, 2); } @@ -56,31 +55,44 @@ void FillPage(struct Game *game, int page) { void DrawPage(int p) { switch (p) { case 1: + al_hold_bitmap_drawing(true); al_draw_bitmap(game->intro.table_bitmap, 0, 0, 0); + al_hold_bitmap_drawing(true); draw_text(1, "Ever since Twilight Sparkle and her"); draw_text(1, "friends imprisoned Discord in stone,"); draw_text(1, "Equestria had been peaceful for"); draw_text(1, "a long time."); + al_hold_bitmap_drawing(false); 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); + al_hold_bitmap_drawing(false); + al_hold_bitmap_drawing(true); draw_text(2, "Until one day a reckless pony caused"); draw_text(2, "a tiny bit of chaos near Discord’s"); draw_text(2, "statue."); + al_hold_bitmap_drawing(false); break; case 3: + al_hold_bitmap_drawing(true); 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); + al_hold_bitmap_drawing(false); + al_hold_bitmap_drawing(true); draw_text(3, "This small amount of chaos was not"); draw_text(3, "enough to free Discord, but enough"); draw_text(3, "to turn discarded muffins into"); draw_text(3, "vicious muffinzombies, with aim to"); draw_text(3, "destroy all harmony in Equestria."); + al_hold_bitmap_drawing(false); break; case 4: + al_hold_bitmap_drawing(true); 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); + al_hold_bitmap_drawing(false); + al_hold_bitmap_drawing(true); draw_text(4, "Discord, learning from his last failure,"); draw_text(4, "turned his muffinzombies against Twilight"); draw_text(4, "and her friends, trapping them in their"); @@ -88,15 +100,20 @@ void FillPage(struct Game *game, int page) { draw_text(4, "Elements out of the way, he now waits until"); draw_text(4, "chaos takes hold of the world, so he can"); draw_text(4, "rule Equestria once again."); + al_hold_bitmap_drawing(false); break; case 5: + al_hold_bitmap_drawing(true); 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); + al_hold_bitmap_drawing(false); + al_hold_bitmap_drawing(true); draw_text(5, "Who can defeat Discord without"); draw_text(5, "the Elements of Harmony?"); draw_text(5, ""); draw_text(5, "Well... There is somepony who knows"); draw_text(5, "all about muffins..."); + al_hold_bitmap_drawing(false); break; } } @@ -114,14 +131,12 @@ void FillPage(struct Game *game, int page) { void Intro_Draw(struct Game *game) { al_clear_to_color(al_map_rgb(0,0,0)); if (game->intro.in_animation) { - AnimPage(game, game->intro.page); 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_draw_bitmap(game->intro.animation, -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); + AnimPage(game, game->intro.page, al_map_rgba_f(1,1,1,1)); } else { - AnimPage(game, game->intro.page+1); al_draw_bitmap(game->intro.table, 0, 0, 0); - al_draw_bitmap(game->intro.animation, 0, 0, 0); + AnimPage(game, game->intro.page+1, al_map_rgba_f(1,1,1,1)); } 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..."); al_draw_bitmap(game->intro.frame, 0, 0, 0); @@ -156,7 +171,7 @@ void Intro_Load(struct Game *game) { for(fadeloop=0; fadeloop<256; fadeloop+=tps(game, 600)){ al_wait_for_event(game->event_queue, &ev); 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_draw_tinted_bitmap(game->intro.animation,al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1),0,0,0); + AnimPage(game, game->intro.page+1, al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1)); al_draw_tinted_bitmap(game->intro.frame,al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1), 0, 0, 0); DrawConsole(game); al_flip_display(); @@ -213,12 +228,10 @@ void Intro_Preload(struct Game *game) { exit(-1); } game->intro.table = al_create_bitmap(al_get_display_width(game->display)*2, al_get_display_height(game->display)); - game->intro.animation = 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 ); FillPage(game, 1); - AnimPage(game, 1); al_set_target_bitmap(al_get_backbuffer(game->display)); PrintConsole(game, "Chainpreloading GAMESTATE_MAP..."); Map_Preload(game); @@ -235,11 +248,11 @@ void Intro_Unload(struct Game *game) { 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*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_draw_tinted_bitmap(game->intro.animation, 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); + AnimPage(game, game->intro.page, al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1)); } else { 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_draw_tinted_bitmap(game->intro.animation, al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1), 0, 0, 0); + AnimPage(game, game->intro.page+1, al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1)); } al_draw_tinted_bitmap(game->intro.frame,al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1), 0, 0, 0); DrawConsole(game); @@ -247,7 +260,6 @@ void Intro_Unload(struct Game *game) { } al_destroy_bitmap(game->intro.frame); al_destroy_bitmap(game->intro.table); - al_destroy_bitmap(game->intro.animation); int i; for (i=0; i<5; i++) { al_destroy_bitmap(game->intro.animsprites[i]); diff --git a/src/level.c b/src/level.c index ce7c7e1..1021b7d 100644 --- a/src/level.c +++ b/src/level.c @@ -226,7 +226,7 @@ void Level_Draw(struct Game *game) { al_draw_bitmap(game->level.background, (1+(-game->level.bg_pos))*al_get_bitmap_width(game->level.background), 0, 0); al_draw_bitmap(game->level.stage, (-game->level.st_pos)*al_get_bitmap_width(game->level.stage), 0 ,0); al_draw_bitmap(game->level.stage, (1+(-game->level.st_pos))*al_get_bitmap_width(game->level.stage), 0 ,0); - + int derpyx = game->level.derpy_x*al_get_display_width(game->display); int derpyy = game->level.derpy_y*al_get_display_height(game->display); int derpyw = al_get_bitmap_width(game->level.derpy); @@ -276,9 +276,10 @@ void Level_Draw(struct Game *game) { al_set_target_bitmap(al_get_backbuffer(game->display)); al_draw_tinted_bitmap(game->level.derpy, al_map_rgba_f(255,255-colision*255,255-colision*255,1), derpyx, derpyy, 0); - + al_draw_bitmap(game->level.foreground, (-game->level.fg_pos)*al_get_bitmap_width(game->level.foreground), 0 ,0); al_draw_bitmap(game->level.foreground, (1+(-game->level.fg_pos))*al_get_bitmap_width(game->level.foreground), 0 ,0); + if (game->level.speed > 0) { game->level.cl_pos += game->level.speed * 0.2; game->level.bg_pos += game->level.speed * 0.6; diff --git a/src/main.h b/src/main.h index 79eb3d4..eea142b 100644 --- a/src/main.h +++ b/src/main.h @@ -191,7 +191,6 @@ struct Intro { ALLEGRO_BITMAP *table; ALLEGRO_BITMAP *table_bitmap; ALLEGRO_BITMAP *frame; - ALLEGRO_BITMAP *animation; ALLEGRO_BITMAP *animsprites[5]; ALLEGRO_FONT *font; ALLEGRO_SAMPLE *sample;