From 6583662d9f3835f957777f73e899424312256dc0 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak Date: Wed, 4 Apr 2012 00:06:47 +0200 Subject: [PATCH] implement animations in intro state --- build | 4 +++- src/intro.c | 44 ++++++++++++++++++++++++++++++++++++++++---- src/main.h | 5 ++++- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/build b/build index bdd8d7b..1bf8d0b 100755 --- a/build +++ b/build @@ -1,2 +1,4 @@ #!/bin/sh -make -j10 && bin/superderpy +echo run > gdb.tmp +make -j10 && gdb bin/superderpy -x gdb.tmp +rm gdb.tmp diff --git a/src/intro.c b/src/intro.c index 37aa995..36c8068 100644 --- a/src/intro.c +++ b/src/intro.c @@ -23,6 +23,17 @@ #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)); + + 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)); + game->intro.anim += tps(game, 2); +} + void FillPage(struct Game *game, int page) { char filename[30] = { }; sprintf(filename, "data/intro/%d.flac", page); @@ -105,10 +116,16 @@ 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) + 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_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); - else + 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);//al_get_display_height(game->display)*((game->intro.position/3.0)/(float)al_get_display_width(game->display)), 0); + } + else { + AnimPage(game, game->intro.page+1); 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_bitmap(game->intro.animation, 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_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"); if (game->intro.in_animation) { @@ -141,6 +158,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); DrawConsole(game); al_flip_display(); } @@ -172,6 +190,13 @@ void Intro_Preload(struct Game *game) { game->intro.position = 0; game->intro.page = 0; game->intro.in_animation = false; + game->intro.anim = 0; + + game->intro.animsprites[0] = LoadScaledBitmap("discord.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3); + game->intro.animsprites[1] = LoadScaledBitmap("derpcycle.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3); + game->intro.animsprites[2] = LoadScaledBitmap("zombie.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3); + game->intro.animsprites[3] = LoadScaledBitmap("loading.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3); + game->intro.animsprites[4] = LoadScaledBitmap("letter.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3); game->intro.table_bitmap =LoadScaledBitmap("paper.png", al_get_display_width(game->display), al_get_display_height(game->display)); @@ -186,10 +211,12 @@ 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); @@ -201,14 +228,23 @@ void Intro_Unload(struct Game *game) { int fadeloop; for(fadeloop=255; fadeloop>=0; fadeloop-=tps(game, 600)){ al_wait_for_event(game->event_queue, &ev); - if (game->intro.in_animation) + 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_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.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); //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), 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.animation, 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); + } DrawConsole(game); al_flip_display(); } 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]); + } al_destroy_font(game->intro.font); al_destroy_sample_instance(game->intro.music); al_destroy_sample(game->intro.sample); diff --git a/src/main.h b/src/main.h index 367214e..b9d2d78 100644 --- a/src/main.h +++ b/src/main.h @@ -148,9 +148,12 @@ struct Map { struct Intro { int position; int page; - bool in_animation; + bool in_animation; /*!< Animation as in page transition animation. */ + float anim; ALLEGRO_BITMAP *table; ALLEGRO_BITMAP *table_bitmap; + ALLEGRO_BITMAP *animation; + ALLEGRO_BITMAP *animsprites[5]; ALLEGRO_FONT *font; ALLEGRO_SAMPLE *sample; ALLEGRO_SAMPLE_INSTANCE *music; /*!< Sample instance with background music. */