implement progress bar on loading screen

This commit is contained in:
Sebastian Krzyszkowiak 2012-05-18 18:34:07 +02:00
parent 8bb04f6691
commit 0a17a95383
16 changed files with 116 additions and 32 deletions

View file

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject> <!DOCTYPE QtCreatorProject>
<!-- Written by Qt Creator 2.5.81, 2012-05-18T15:22:23. --> <!-- Written by Qt Creator 2.5.81, 2012-05-18T18:30:51. -->
<qtcreator> <qtcreator>
<data> <data>
<variable>GenericProjectManager.GenericProject.Toolchain</variable> <variable>GenericProjectManager.GenericProject.Toolchain</variable>

View file

@ -63,18 +63,24 @@ int About_Keydown(struct Game *game, ALLEGRO_EVENT *ev) {
return 0; return 0;
} }
void About_Preload(struct Game *game) { void About_Preload(struct Game *game, void (*progress)(struct Game*, float)) {
PROGRESS_INIT(7);
game->about.image =LoadScaledBitmap("table.png", al_get_display_width(game->display), al_get_display_height(game->display)); game->about.image =LoadScaledBitmap("table.png", al_get_display_width(game->display), al_get_display_height(game->display));
PROGRESS;
game->about.letter = LoadScaledBitmap("about/letter.png", al_get_display_width(game->display), al_get_display_height(game->display) ); game->about.letter = LoadScaledBitmap("about/letter.png", al_get_display_width(game->display), al_get_display_height(game->display) );
PROGRESS;
game->about.sample = al_load_sample( "data/about/about.flac" ); game->about.sample = al_load_sample( "data/about/about.flac" );
PROGRESS;
game->about.music = al_create_sample_instance(game->about.sample); game->about.music = al_create_sample_instance(game->about.sample);
al_attach_sample_instance_to_mixer(game->about.music, game->audio.music); al_attach_sample_instance_to_mixer(game->about.music, game->audio.music);
al_set_sample_instance_playmode(game->about.music, ALLEGRO_PLAYMODE_LOOP); al_set_sample_instance_playmode(game->about.music, ALLEGRO_PLAYMODE_LOOP);
al_set_sample_instance_position(game->about.music, game->music ? 420000 : 700000); al_set_sample_instance_position(game->about.music, game->music ? 420000 : 700000);
game->about.font = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.035,0 ); game->about.font = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.035,0 );
PROGRESS;
game->about.x = -0.1; game->about.x = -0.1;
if (!game->about.sample){ if (!game->about.sample){
fprintf(stderr, "Audio clip sample not loaded!\n" ); fprintf(stderr, "Audio clip sample not loaded!\n" );
@ -91,7 +97,8 @@ void About_Preload(struct Game *game) {
al_draw_text(game->about.font, al_map_rgb(255,255,255), 0, y*al_get_bitmap_height(game->about.text_bitmap), ALLEGRO_ALIGN_LEFT, text); al_draw_text(game->about.font, al_map_rgb(255,255,255), 0, y*al_get_bitmap_height(game->about.text_bitmap), ALLEGRO_ALIGN_LEFT, text);
y+=0.0128; y+=0.0128;
} }
PROGRESS;
draw_text("Written by:"); draw_text("Written by:");
draw_text(" - Sebastian Krzyszkowiak"); draw_text(" - Sebastian Krzyszkowiak");
draw_text(" http://dosowisko.net/"); draw_text(" http://dosowisko.net/");
@ -163,6 +170,7 @@ void About_Preload(struct Game *game) {
draw_text("Author of Super Derpy is not"); draw_text("Author of Super Derpy is not");
draw_text("affiliated to Hasbro, The Hub"); draw_text("affiliated to Hasbro, The Hub");
draw_text("or its associates."); draw_text("or its associates.");
PROGRESS;
game->about.fade_bitmap = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display)); game->about.fade_bitmap = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display));
@ -172,6 +180,7 @@ void About_Preload(struct Game *game) {
al_draw_bitmap_region(game->about.text_bitmap, 0, 0, al_get_bitmap_width(game->about.text_bitmap), al_get_display_height(game->display)*0.8, al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.1, 0); al_draw_bitmap_region(game->about.text_bitmap, 0, 0, al_get_bitmap_width(game->about.text_bitmap), al_get_display_height(game->display)*0.8, al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.1, 0);
al_set_target_bitmap(al_get_backbuffer(game->display)); al_set_target_bitmap(al_get_backbuffer(game->display));
PROGRESS;
} }
void About_Unload(struct Game *game) { void About_Unload(struct Game *game) {

View file

@ -21,7 +21,7 @@
#include "main.h" #include "main.h"
void About_Draw(struct Game *game); void About_Draw(struct Game *game);
void About_Preload(struct Game *game); void About_Preload(struct Game *game, void (*progress)(struct Game*, float));
void About_Unload(struct Game *game); void About_Unload(struct Game *game);
void About_Load(struct Game *game); void About_Load(struct Game *game);
int About_Keydown(struct Game *game, ALLEGRO_EVENT *ev); int About_Keydown(struct Game *game, ALLEGRO_EVENT *ev);

View file

@ -201,7 +201,9 @@ int Intro_Keydown(struct Game *game, ALLEGRO_EVENT *ev) {
return 0; return 0;
} }
void Intro_Preload(struct Game *game) { void Intro_Preload(struct Game *game, void (*progress)(struct Game*, float)) {
PROGRESS_INIT(16);
game->intro.audiostream = NULL; game->intro.audiostream = NULL;
game->intro.position = 0; game->intro.position = 0;
game->intro.page = 0; game->intro.page = 0;
@ -209,15 +211,23 @@ void Intro_Preload(struct Game *game) {
game->intro.anim = 0; game->intro.anim = 0;
game->intro.animsprites[0] = LoadScaledBitmap("intro/1.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3); game->intro.animsprites[0] = LoadScaledBitmap("intro/1.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3);
PROGRESS;
game->intro.animsprites[1] = LoadScaledBitmap("levels/derpy/walk.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3); game->intro.animsprites[1] = LoadScaledBitmap("levels/derpy/walk.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3);
PROGRESS;
game->intro.animsprites[2] = LoadScaledBitmap("intro/3.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3); game->intro.animsprites[2] = LoadScaledBitmap("intro/3.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3);
PROGRESS;
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[3] = LoadScaledBitmap("loading.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3);
PROGRESS;
game->intro.animsprites[4] = LoadScaledBitmap("about/letter.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3); game->intro.animsprites[4] = LoadScaledBitmap("about/letter.png", al_get_display_width(game->display)*0.3125*3, al_get_display_height(game->display)*0.63*3);
PROGRESS;
game->intro.table_bitmap =LoadScaledBitmap("intro/paper.png", al_get_display_width(game->display), al_get_display_height(game->display)); game->intro.table_bitmap =LoadScaledBitmap("intro/paper.png", al_get_display_width(game->display), al_get_display_height(game->display));
PROGRESS;
game->intro.frame =LoadScaledBitmap("intro/frame.png", al_get_display_width(game->display), al_get_display_height(game->display)); game->intro.frame =LoadScaledBitmap("intro/frame.png", al_get_display_width(game->display), al_get_display_height(game->display));
PROGRESS;
game->intro.sample = al_load_sample( "data/intro/intro.flac" ); game->intro.sample = al_load_sample( "data/intro/intro.flac" );
PROGRESS;
game->intro.music = al_create_sample_instance(game->intro.sample); game->intro.music = al_create_sample_instance(game->intro.sample);
al_attach_sample_instance_to_mixer(game->intro.music, game->audio.music); al_attach_sample_instance_to_mixer(game->intro.music, game->audio.music);
@ -233,9 +243,15 @@ void Intro_Preload(struct Game *game) {
game->intro.font = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.04,0 ); game->intro.font = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.04,0 );
FillPage(game, 1); FillPage(game, 1);
PROGRESS;
al_set_target_bitmap(al_get_backbuffer(game->display)); al_set_target_bitmap(al_get_backbuffer(game->display));
PrintConsole(game, "Chainpreloading GAMESTATE_MAP..."); PrintConsole(game, "Chainpreloading GAMESTATE_MAP...");
Map_Preload(game); PROGRESS;
void MapProgress(struct Game* game, float p) {
/* if (progress) (*progress)(game, load_p+=1/load_a); */
if (progress) (*progress)(game, 0.625+0.375*p);
}
Map_Preload(game, &MapProgress);
} }
void Intro_Unload(struct Game *game) { void Intro_Unload(struct Game *game) {

View file

@ -21,7 +21,7 @@
#include "main.h" #include "main.h"
void Intro_Draw(struct Game *game); void Intro_Draw(struct Game *game);
void Intro_Preload(struct Game *game); void Intro_Preload(struct Game *game, void (*progress)(struct Game*, float));
void Intro_Unload(struct Game *game); void Intro_Unload(struct Game *game);
void Intro_Load(struct Game *game); void Intro_Load(struct Game *game);
int Intro_Keydown(struct Game *game, ALLEGRO_EVENT *ev); int Intro_Keydown(struct Game *game, ALLEGRO_EVENT *ev);

View file

@ -522,7 +522,7 @@ void Level_ProcessLogic(struct Game *game, ALLEGRO_EVENT *ev) {
} }
void Level_Preload(struct Game *game) { void Level_Preload(struct Game *game, void (*progress)(struct Game*, float)) {
game->level.derpy_sheets = NULL; game->level.derpy_sheets = NULL;
game->level.derpy = NULL; game->level.derpy = NULL;
Pause_Preload(game); Pause_Preload(game);
@ -542,7 +542,7 @@ void Level_Preload(struct Game *game) {
exit(-1); exit(-1);
} }
} }
Level_PreloadBitmaps(game); Level_PreloadBitmaps(game, progress);
} }
void Level_Unload(struct Game *game) { void Level_Unload(struct Game *game) {
@ -591,15 +591,26 @@ void Level_UnloadBitmaps(struct Game *game) {
} }
} }
void Level_PreloadBitmaps(struct Game *game) { void Level_PreloadBitmaps(struct Game *game, void (*progress)(struct Game*, float)) {
PROGRESS_INIT(10);
int x = 0;
struct Spritesheet *tmp = game->level.derpy_sheets; struct Spritesheet *tmp = game->level.derpy_sheets;
while (tmp) {
x++;
tmp = tmp->next;
}
if (game->level.current_level==1) load_a+=x;
else load_a=2+x;
tmp = game->level.derpy_sheets;
while (tmp) { while (tmp) {
char filename[255] = { }; char filename[255] = { };
sprintf(filename, "levels/derpy/%s.png", tmp->name); sprintf(filename, "levels/derpy/%s.png", tmp->name);
tmp->bitmap = LoadScaledBitmap(filename, al_get_display_height(game->display)*0.25*tmp->aspect*tmp->cols*tmp->scale, al_get_display_height(game->display)*0.25*tmp->rows*tmp->scale); tmp->bitmap = LoadScaledBitmap(filename, al_get_display_height(game->display)*0.25*tmp->aspect*tmp->cols*tmp->scale, al_get_display_height(game->display)*0.25*tmp->rows*tmp->scale);
PROGRESS;
tmp = tmp->next; tmp = tmp->next;
} }
PROGRESS;
if (!game->level.derpy) SelectDerpySpritesheet(game, "stand"); if (!game->level.derpy) SelectDerpySpritesheet(game, "stand");
game->level.derpy = al_create_bitmap(al_get_bitmap_width(*(game->level.derpy_sheet))/game->level.sheet_cols, al_get_bitmap_height(*(game->level.derpy_sheet))/game->level.sheet_rows); game->level.derpy = al_create_bitmap(al_get_bitmap_width(*(game->level.derpy_sheet))/game->level.sheet_cols, al_get_bitmap_height(*(game->level.derpy_sheet))/game->level.sheet_rows);
@ -608,19 +619,28 @@ void Level_PreloadBitmaps(struct Game *game) {
else { else {
/* TODO: handle strange display aspects */ /* TODO: handle strange display aspects */
game->level.clouds = LoadScaledBitmap("levels/1/clouds.png", al_get_display_height(game->display)*4.73307291666666666667, al_get_display_height(game->display)); game->level.clouds = LoadScaledBitmap("levels/1/clouds.png", al_get_display_height(game->display)*4.73307291666666666667, al_get_display_height(game->display));
PROGRESS;
game->level.foreground = LoadScaledBitmap("levels/1/foreground.png", al_get_display_height(game->display)*4.73307291666666666667, al_get_display_height(game->display)); game->level.foreground = LoadScaledBitmap("levels/1/foreground.png", al_get_display_height(game->display)*4.73307291666666666667, al_get_display_height(game->display));
PROGRESS;
game->level.background = LoadScaledBitmap("levels/1/background.png", al_get_display_height(game->display)*4.73307291666666666667, al_get_display_height(game->display)); game->level.background = LoadScaledBitmap("levels/1/background.png", al_get_display_height(game->display)*4.73307291666666666667, al_get_display_height(game->display));
PROGRESS;
game->level.stage = LoadScaledBitmap("levels/1/stage.png", al_get_display_height(game->display)*4.73307291666666666667, al_get_display_height(game->display)); game->level.stage = LoadScaledBitmap("levels/1/stage.png", al_get_display_height(game->display)*4.73307291666666666667, al_get_display_height(game->display));
PROGRESS;
game->level.obst_bmps.pie = LoadScaledBitmap("menu/pie.png", al_get_display_width(game->display)*0.1, al_get_display_height(game->display)*0.1); game->level.obst_bmps.pie = LoadScaledBitmap("menu/pie.png", al_get_display_width(game->display)*0.1, al_get_display_height(game->display)*0.1);
PROGRESS;
game->level.welcome = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display)/2); game->level.welcome = al_create_bitmap(al_get_display_width(game->display), al_get_display_height(game->display)/2);
PROGRESS;
al_set_target_bitmap(game->level.welcome); al_set_target_bitmap(game->level.welcome);
al_clear_to_color(al_map_rgba(0,0,0,0)); al_clear_to_color(al_map_rgba(0,0,0,0));
al_draw_text_with_shadow(game->menu.font_title, al_map_rgb(255,255,255), al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.1, ALLEGRO_ALIGN_CENTRE, "Level 1"); al_draw_text_with_shadow(game->menu.font_title, al_map_rgb(255,255,255), al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.1, ALLEGRO_ALIGN_CENTRE, "Level 1");
al_draw_text_with_shadow(game->menu.font_subtitle, al_map_rgb(255,255,255), al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.275, ALLEGRO_ALIGN_CENTRE, "Fluttershy"); al_draw_text_with_shadow(game->menu.font_subtitle, al_map_rgb(255,255,255), al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.275, ALLEGRO_ALIGN_CENTRE, "Fluttershy");
PROGRESS;
game->level.meter_image = LoadScaledBitmap("levels/meter.png", al_get_display_width(game->display)*0.075, al_get_display_width(game->display)*0.075*0.96470588235294117647); game->level.meter_image = LoadScaledBitmap("levels/meter.png", al_get_display_width(game->display)*0.075, al_get_display_width(game->display)*0.075*0.96470588235294117647);
PROGRESS;
game->level.meter_bmp = al_create_bitmap(al_get_display_width(game->display)*0.2+al_get_bitmap_width(game->level.meter_image), al_get_bitmap_height(game->level.meter_image)); game->level.meter_bmp = al_create_bitmap(al_get_display_width(game->display)*0.2+al_get_bitmap_width(game->level.meter_image), al_get_bitmap_height(game->level.meter_image));
al_set_target_bitmap(al_get_backbuffer(game->display)); al_set_target_bitmap(al_get_backbuffer(game->display));
} }
PROGRESS;
} }

View file

@ -23,10 +23,10 @@
void SelectDerpySpritesheet(struct Game *game, char* name); void SelectDerpySpritesheet(struct Game *game, char* name);
void Level_Passed(struct Game *game); void Level_Passed(struct Game *game);
void Level_Draw(struct Game *game); void Level_Draw(struct Game *game);
void Level_Preload(struct Game *game); void Level_Preload(struct Game *game, void (*progress)(struct Game*, float));
void Level_Unload(struct Game *game); void Level_Unload(struct Game *game);
void Level_Load(struct Game *game); void Level_Load(struct Game *game);
void Level_ProcessLogic(struct Game *game, ALLEGRO_EVENT *ev); void Level_ProcessLogic(struct Game *game, ALLEGRO_EVENT *ev);
int Level_Keydown(struct Game *game, ALLEGRO_EVENT *ev); int Level_Keydown(struct Game *game, ALLEGRO_EVENT *ev);
void Level_UnloadBitmaps(struct Game *game); void Level_UnloadBitmaps(struct Game *game);
void Level_PreloadBitmaps(struct Game *game); void Level_PreloadBitmaps(struct Game *game, void (*progress)(struct Game*, float));

View file

@ -18,8 +18,18 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
#include <stdio.h>
#include "loading.h" #include "loading.h"
void Progress(struct Game *game, float p) {
if (game->debug) { printf("%f\n", p); fflush(stdout); }
al_set_target_bitmap(al_get_backbuffer(game->display));
al_draw_bitmap(game->loading.loading_bitmap,0,0,0);
al_draw_filled_rectangle(0, al_get_display_height(game->display)*0.985, p*al_get_display_width(game->display), al_get_display_height(game->display), al_map_rgba(255,255,255,255));
DrawConsole(game);
al_flip_display();
}
void Loading_Draw(struct Game *game) { void Loading_Draw(struct Game *game) {
ALLEGRO_EVENT ev; ALLEGRO_EVENT ev;
float fadeloop; float fadeloop;
@ -34,7 +44,7 @@ void Loading_Draw(struct Game *game) {
al_stop_timer(game->timer); al_stop_timer(game->timer);
PreloadGameState(game); PreloadGameState(game, &Progress);
al_wait_for_vsync(); al_wait_for_vsync();
al_start_timer(game->timer); al_start_timer(game->timer);
@ -42,6 +52,7 @@ void Loading_Draw(struct Game *game) {
for(fadeloop=255; fadeloop>0; fadeloop-=tps(game, 600)){ for(fadeloop=255; fadeloop>0; fadeloop-=tps(game, 600)){
al_wait_for_event(game->event_queue, &ev); al_wait_for_event(game->event_queue, &ev);
al_draw_tinted_bitmap(game->loading.loading_bitmap,al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1),0,0,0); al_draw_tinted_bitmap(game->loading.loading_bitmap,al_map_rgba_f(fadeloop/255.0,fadeloop/255.0,fadeloop/255.0,1),0,0,0);
al_draw_filled_rectangle(0, al_get_display_height(game->display)*0.985, al_get_display_width(game->display), al_get_display_height(game->display), al_map_rgba(fadeloop,fadeloop,fadeloop,255));
DrawConsole(game); DrawConsole(game);
al_flip_display(); al_flip_display();
} }
@ -60,11 +71,12 @@ void Loading_Load(struct Game *game) {
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_bitmap(game->loading.image, 0, 0, 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.84, ALLEGRO_ALIGN_LEFT, "Loading...");
al_draw_filled_rectangle(0, al_get_display_height(game->display)*0.985, al_get_display_width(game->display), al_get_display_height(game->display), al_map_rgba(128,128,128,128));
al_set_target_bitmap(al_get_backbuffer(game->display)); al_set_target_bitmap(al_get_backbuffer(game->display));
al_destroy_bitmap(game->loading.image); al_destroy_bitmap(game->loading.image);
} }
int Loading_Keydown(struct Game *game, ALLEGRO_EVENT *ev) { return 0; } int Loading_Keydown(struct Game *game, ALLEGRO_EVENT *ev) { return 0; }
void Loading_Preload(struct Game *game) {} void Loading_Preload(struct Game *game, void (*progress)(struct Game*, float)) {}
void Loading_Unload(struct Game *game) { al_destroy_bitmap(game->loading.loading_bitmap); } void Loading_Unload(struct Game *game) { al_destroy_bitmap(game->loading.loading_bitmap); }

View file

@ -21,7 +21,7 @@
#include "main.h" #include "main.h"
void Loading_Draw(struct Game *game); void Loading_Draw(struct Game *game);
void Loading_Preload(struct Game *game); void Loading_Preload(struct Game *game, void (*progress)(struct Game*, float));
void Loading_Unload(struct Game *game); void Loading_Unload(struct Game *game);
void Loading_Load(struct Game *game); void Loading_Load(struct Game *game);
int Loading_Keydown(struct Game *game, ALLEGRO_EVENT *ev); int Loading_Keydown(struct Game *game, ALLEGRO_EVENT *ev);

View file

@ -37,7 +37,7 @@
* Preloading of state happens when loading screen is displayed. * Preloading of state happens when loading screen is displayed.
*/ */
#define PRELOAD_STATE(state, name) case state:\ #define PRELOAD_STATE(state, name) case state:\
PrintConsole(game, "Preload %s...", #state); DrawConsole(game); al_flip_display(); name ## _Preload(game); break; PrintConsole(game, "Preload %s...", #state); DrawConsole(game); al_flip_display(); name ## _Preload(game, progress); break;
/*! \brief Macro for unloading gamestate. /*! \brief Macro for unloading gamestate.
* *
* Unloading of state happens after it's fadeout. * Unloading of state happens after it's fadeout.
@ -94,7 +94,7 @@ void DrawConsole(struct Game *game) {
frames_done++; frames_done++;
} }
void PreloadGameState(struct Game *game) { void PreloadGameState(struct Game *game, void (*progress)(struct Game*, float)) {
if ((game->loadstate==GAMESTATE_MENU) && (game->menu.loaded)) { if ((game->loadstate==GAMESTATE_MENU) && (game->menu.loaded)) {
PrintConsole(game, "GAMESTATE_MENU already loaded, skipping..."); PrintConsole(game, "GAMESTATE_MENU already loaded, skipping...");
return; return;
@ -416,7 +416,7 @@ int main(int argc, char **argv){
game.menu.loaded = false; game.menu.loaded = false;
game.restart = false; game.restart = false;
game.loadstate = GAMESTATE_LOADING; game.loadstate = GAMESTATE_LOADING;
PreloadGameState(&game); PreloadGameState(&game, NULL);
LoadGameState(&game); LoadGameState(&game);
game.loadstate = GAMESTATE_MENU; game.loadstate = GAMESTATE_MENU;

View file

@ -31,6 +31,9 @@
#include <allegro5/allegro_ttf.h> #include <allegro5/allegro_ttf.h>
#include "allegro_utils.h" #include "allegro_utils.h"
#define PROGRESS_INIT(a) float load_p = 0, load_a = a;
#define PROGRESS if (progress) (*progress)(game, load_p+=1/load_a);
struct Game; struct Game;
/*! \brief Enum of all available gamestates. */ /*! \brief Enum of all available gamestates. */
@ -249,7 +252,7 @@ struct Game {
void al_draw_text_with_shadow(ALLEGRO_FONT *font, ALLEGRO_COLOR color, float x, float y, int flags, char const *text); void al_draw_text_with_shadow(ALLEGRO_FONT *font, ALLEGRO_COLOR color, float x, float y, int flags, char const *text);
/*! \brief Preloads gamestate set in game->loadstate. */ /*! \brief Preloads gamestate set in game->loadstate. */
void PreloadGameState(struct Game *game); void PreloadGameState(struct Game *game, void (*progress)(struct Game*, float));
/*! \brief Unloads gamestate set in game->gamestate. */ /*! \brief Unloads gamestate set in game->gamestate. */
void UnloadGameState(struct Game *game); void UnloadGameState(struct Game *game);

View file

@ -97,7 +97,9 @@ int Map_Keydown(struct Game *game, ALLEGRO_EVENT *ev) {
return 0; return 0;
} }
void Map_Preload(struct Game *game) { void Map_Preload(struct Game *game, void (*progress)(struct Game*, float)) {
PROGRESS_INIT(7);
game->map.available = atoi(GetConfigOptionDefault("MuffinAttack", "level", "1")); game->map.available = atoi(GetConfigOptionDefault("MuffinAttack", "level", "1"));
if ((game->map.available<1) || (game->map.available>6)) game->map.available=1; if ((game->map.available<1) || (game->map.available>6)) game->map.available=1;
game->map.selected = game->map.available; game->map.selected = game->map.available;
@ -105,14 +107,19 @@ void Map_Preload(struct Game *game) {
game->map.arrowpos = 0; game->map.arrowpos = 0;
game->map.map_bg = LoadScaledBitmap("map/background.png", al_get_display_width(game->display), al_get_display_height(game->display)); game->map.map_bg = LoadScaledBitmap("map/background.png", al_get_display_width(game->display), al_get_display_height(game->display));
PROGRESS;
char filename[30] = { }; char filename[30] = { };
sprintf(filename, "map/highlight%d.png", game->map.available); sprintf(filename, "map/highlight%d.png", game->map.available);
game->map.highlight = LoadScaledBitmap(filename, al_get_display_width(game->display), al_get_display_height(game->display)); game->map.highlight = LoadScaledBitmap(filename, al_get_display_width(game->display), al_get_display_height(game->display));
PROGRESS;
game->map.arrow = al_load_bitmap( "data/map/arrow.png" ); game->map.arrow = al_load_bitmap( "data/map/arrow.png" );
PROGRESS;
game->map.click_sample = al_load_sample( "data/menu/click.flac" ); game->map.click_sample = al_load_sample( "data/menu/click.flac" );
PROGRESS;
game->map.sample = al_load_sample( "data/map/map.flac" ); game->map.sample = al_load_sample( "data/map/map.flac" );
PROGRESS;
game->map.music = al_create_sample_instance(game->map.sample); game->map.music = al_create_sample_instance(game->map.sample);
al_attach_sample_instance_to_mixer(game->map.music, game->audio.music); al_attach_sample_instance_to_mixer(game->map.music, game->audio.music);
@ -132,10 +139,12 @@ void Map_Preload(struct Game *game) {
} }
game->map.map = LoadScaledBitmap("table.png", al_get_display_width(game->display), al_get_display_height(game->display)); game->map.map = LoadScaledBitmap("table.png", al_get_display_width(game->display), al_get_display_height(game->display));
PROGRESS;
al_set_target_bitmap(game->map.map); al_set_target_bitmap(game->map.map);
al_draw_bitmap(game->map.map_bg, 0, 0 ,0); al_draw_bitmap(game->map.map_bg, 0, 0 ,0);
al_draw_bitmap(game->map.highlight, 0, 0 ,0); al_draw_bitmap(game->map.highlight, 0, 0 ,0);
al_set_target_bitmap(al_get_backbuffer(game->display)); al_set_target_bitmap(al_get_backbuffer(game->display));
PROGRESS;
} }
void Map_Unload(struct Game *game) { void Map_Unload(struct Game *game) {

View file

@ -21,7 +21,7 @@
#include "main.h" #include "main.h"
void Map_Draw(struct Game *game); void Map_Draw(struct Game *game);
void Map_Preload(struct Game *game); void Map_Preload(struct Game *game, void (*progress)(struct Game*, float));
void Map_Unload(struct Game *game); void Map_Unload(struct Game *game);
void Map_Load(struct Game *game); void Map_Load(struct Game *game);
int Map_Keydown(struct Game *game, ALLEGRO_EVENT *ev); int Map_Keydown(struct Game *game, ALLEGRO_EVENT *ev);

View file

@ -142,25 +142,37 @@ void Menu_Draw(struct Game *game) {
if (game->menu.cloud2_position<0) { game->menu.cloud2_position=100; PrintConsole(game, "cloud2_position"); } if (game->menu.cloud2_position<0) { game->menu.cloud2_position=100; PrintConsole(game, "cloud2_position"); }
} }
void Menu_Preload(struct Game *game) { void Menu_Preload(struct Game *game, void (*progress)(struct Game*, float)) {
PROGRESS_INIT(13);
game->menu.options.fullscreen = game->fullscreen; game->menu.options.fullscreen = game->fullscreen;
game->menu.options.fps = game->fps; game->menu.options.fps = game->fps;
game->menu.options.width = game->width; game->menu.options.width = game->width;
game->menu.options.height = game->height; game->menu.options.height = game->height;
game->menu.loaded = true; game->menu.loaded = true;
game->menu.image = LoadScaledBitmap( "menu/menu.png", al_get_display_width(game->display), al_get_display_height(game->display)*0.45); game->menu.image = LoadScaledBitmap( "menu/menu.png", al_get_display_width(game->display), al_get_display_height(game->display)*0.45);
PROGRESS;
game->menu.mountain = LoadScaledBitmap( "menu/mountain.png", al_get_display_width(game->display)*0.055, al_get_display_height(game->display)/9 ); game->menu.mountain = LoadScaledBitmap( "menu/mountain.png", al_get_display_width(game->display)*0.055, al_get_display_height(game->display)/9 );
PROGRESS;
game->menu.cloud = LoadScaledBitmap( "menu/cloud.png", al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.25 ); game->menu.cloud = LoadScaledBitmap( "menu/cloud.png", al_get_display_width(game->display)*0.5, al_get_display_height(game->display)*0.25 );
PROGRESS;
game->menu.cloud2 = LoadScaledBitmap( "menu/cloud2.png", al_get_display_width(game->display)*0.2, al_get_display_height(game->display)*0.1 ); game->menu.cloud2 = LoadScaledBitmap( "menu/cloud2.png", al_get_display_width(game->display)*0.2, al_get_display_height(game->display)*0.1 );
PROGRESS;
game->menu.pinkcloud = LoadScaledBitmap( "menu/pinkcloud.png", al_get_display_width(game->display)*0.33125, al_get_display_height(game->display)*0.8122); game->menu.pinkcloud = LoadScaledBitmap( "menu/pinkcloud.png", al_get_display_width(game->display)*0.33125, al_get_display_height(game->display)*0.8122);
PROGRESS;
al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP); al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP);
game->menu.rain = al_load_bitmap( "data/menu/rain.png" ); game->menu.rain = al_load_bitmap( "data/menu/rain.png" );
PROGRESS;
game->menu.pie = al_load_bitmap( "data/menu/pie.png" ); game->menu.pie = al_load_bitmap( "data/menu/pie.png" );
al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR); al_set_new_bitmap_flags(ALLEGRO_MAG_LINEAR | ALLEGRO_MIN_LINEAR);
PROGRESS;
game->menu.sample = al_load_sample( "data/menu/menu.flac" ); game->menu.sample = al_load_sample( "data/menu/menu.flac" );
PROGRESS;
game->menu.rain_sample = al_load_sample( "data/menu/rain.flac" ); game->menu.rain_sample = al_load_sample( "data/menu/rain.flac" );
PROGRESS;
game->menu.click_sample = al_load_sample( "data/menu/click.flac" ); game->menu.click_sample = al_load_sample( "data/menu/click.flac" );
PROGRESS;
game->menu.mountain_position = al_get_display_width(game->display)*0.7; game->menu.mountain_position = al_get_display_width(game->display)*0.7;
game->menu.music = al_create_sample_instance(game->menu.sample); game->menu.music = al_create_sample_instance(game->menu.sample);
@ -179,7 +191,8 @@ void Menu_Preload(struct Game *game) {
game->menu.font_subtitle = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.08,0 ); game->menu.font_subtitle = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.08,0 );
game->menu.font = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.05,0 ); game->menu.font = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.05,0 );
game->menu.font_selected = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.065,0 ); game->menu.font_selected = al_load_ttf_font("data/ShadowsIntoLight.ttf",al_get_display_height(game->display)*0.065,0 );
PROGRESS;
if (!game->menu.sample){ if (!game->menu.sample){
fprintf(stderr, "Audio clip sample not loaded!\n" ); fprintf(stderr, "Audio clip sample not loaded!\n" );
exit(-1); exit(-1);
@ -204,6 +217,7 @@ void Menu_Preload(struct Game *game) {
al_draw_scaled_bitmap(game->menu.pie, 0, 0, al_get_bitmap_width(game->menu.pie), al_get_bitmap_height(game->menu.pie), al_get_bitmap_width(game->menu.pie_bitmap)*0.1, al_get_bitmap_height(game->menu.pie_bitmap)*0.3, al_get_display_width(game->display)*0.09, al_get_display_height(game->display)*0.06, ALLEGRO_FLIP_HORIZONTAL); al_draw_scaled_bitmap(game->menu.pie, 0, 0, al_get_bitmap_width(game->menu.pie), al_get_bitmap_height(game->menu.pie), al_get_bitmap_width(game->menu.pie_bitmap)*0.1, al_get_bitmap_height(game->menu.pie_bitmap)*0.3, al_get_display_width(game->display)*0.09, al_get_display_height(game->display)*0.06, ALLEGRO_FLIP_HORIZONTAL);
al_draw_scaled_bitmap(game->menu.pie, 0, 0, al_get_bitmap_width(game->menu.pie), al_get_bitmap_height(game->menu.pie), al_get_bitmap_width(game->menu.pie_bitmap)*0.3, al_get_bitmap_height(game->menu.pie_bitmap)*0.6, al_get_display_width(game->display)*0.13, al_get_display_height(game->display)*0.1, 0); al_draw_scaled_bitmap(game->menu.pie, 0, 0, al_get_bitmap_width(game->menu.pie), al_get_bitmap_height(game->menu.pie), al_get_bitmap_width(game->menu.pie_bitmap)*0.3, al_get_bitmap_height(game->menu.pie_bitmap)*0.6, al_get_display_width(game->display)*0.13, al_get_display_height(game->display)*0.1, 0);
al_destroy_bitmap(game->menu.pie); al_destroy_bitmap(game->menu.pie);
PROGRESS;
al_set_new_bitmap_flags(ALLEGRO_VIDEO_BITMAP); al_set_new_bitmap_flags(ALLEGRO_VIDEO_BITMAP);
game->menu.rain_bitmap = al_create_bitmap(al_get_bitmap_width(game->menu.pinkcloud_bitmap)*0.5, al_get_bitmap_height(game->menu.pinkcloud_bitmap)*0.1); game->menu.rain_bitmap = al_create_bitmap(al_get_bitmap_width(game->menu.pinkcloud_bitmap)*0.5, al_get_bitmap_height(game->menu.pinkcloud_bitmap)*0.1);
@ -212,6 +226,7 @@ void Menu_Preload(struct Game *game) {
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.rain,0, 0, al_get_bitmap_width(game->menu.rain), al_get_bitmap_height(game->menu.rain), 0, 0, al_get_bitmap_width(game->menu.rain_bitmap), al_get_bitmap_height(game->menu.rain_bitmap),0); al_draw_scaled_bitmap(game->menu.rain,0, 0, al_get_bitmap_width(game->menu.rain), al_get_bitmap_height(game->menu.rain), 0, 0, al_get_bitmap_width(game->menu.rain_bitmap), al_get_bitmap_height(game->menu.rain_bitmap),0);
al_destroy_bitmap(game->menu.rain); al_destroy_bitmap(game->menu.rain);
PROGRESS;
} }
void Menu_Stop(struct Game* game) { void Menu_Stop(struct Game* game) {

View file

@ -22,7 +22,7 @@
void DrawMenuState(struct Game *game); void DrawMenuState(struct Game *game);
void Menu_Draw(struct Game *game); void Menu_Draw(struct Game *game);
void Menu_Preload(struct Game *game); void Menu_Preload(struct Game *game, void (*progress)(struct Game*, float));
void Menu_Stop(struct Game *game); void Menu_Stop(struct Game *game);
void Menu_Unload(struct Game *game); void Menu_Unload(struct Game *game);
void Menu_Load(struct Game *game); void Menu_Load(struct Game *game);

View file

@ -47,9 +47,9 @@ int Pause_Keydown(struct Game *game, ALLEGRO_EVENT *ev) {
Loading_Unload(game); Loading_Unload(game);
Loading_Load(game); Loading_Load(game);
Menu_Unload(game); Menu_Unload(game);
Menu_Preload(game); Menu_Preload(game, NULL);
Level_UnloadBitmaps(game); Level_UnloadBitmaps(game);
Level_PreloadBitmaps(game); Level_PreloadBitmaps(game, NULL);
Pause_Unload_Real(game); Pause_Unload_Real(game);
Pause_Preload(game); Pause_Preload(game);
Pause_Load(game); Pause_Load(game);
@ -64,7 +64,7 @@ void Pause_Preload(struct Game* game) {
PrintConsole(game,"Pause preloaded."); PrintConsole(game,"Pause preloaded.");
if (!game->menu.loaded) { if (!game->menu.loaded) {
PrintConsole(game,"Pause: Preloading GAMESTATE_MENU..."); PrintConsole(game,"Pause: Preloading GAMESTATE_MENU...");
Menu_Preload(game); Menu_Preload(game, NULL);
} }
} }
@ -109,4 +109,4 @@ void Pause_Unload(struct Game* game) {
UnloadGameState(game); UnloadGameState(game);
PrintConsole(game, "Pause: Unloading GAMESTATE_MENU..."); PrintConsole(game, "Pause: Unloading GAMESTATE_MENU...");
Menu_Unload(game); Menu_Unload(game);
} }