implement spritesheet managament

This commit is contained in:
Sebastian Krzyszkowiak 2012-05-03 19:42:23 +02:00
parent 9959c1c6fe
commit 8abc4a6763
6 changed files with 100 additions and 20 deletions

2
build
View file

@ -1,4 +1,4 @@
#!/bin/sh
echo run $@ > gdb.tmp
make -j10 && gdb bin/superderpy -x gdb.tmp
make -j12 && gdb bin/superderpy -x gdb.tmp
rm gdb.tmp

View file

@ -25,6 +25,7 @@ void About_Draw(struct Game *game) {
/*PrintConsole(game, "%d", al_get_sample_instance_position(game->about.music));*/
if (al_get_sample_instance_position(game->about.music)<700000) { al_clear_to_color(al_map_rgba(0,0,0,0)); return; }
if (game->about.fadeloop>=0) {
if (game->about.fadeloop==0) PrintConsole(game, "Fade in");
al_draw_tinted_bitmap(game->about.fade_bitmap,al_map_rgba_f(game->about.fadeloop/255.0,game->about.fadeloop/255.0,game->about.fadeloop/255.0,1),0,0,0);
game->about.fadeloop+=tps(game, 300);
if (game->about.fadeloop>=256) {

View file

@ -27,6 +27,44 @@
/* TODO: check if spritesheet speed still depends on FPS */
void SelectDerpySpritesheet(struct Game *game, char* name) {
struct Spritesheet *tmp = game->level.derpy_sheets;
if (!tmp) {
PrintConsole(game, "ERROR: No spritesheets registered for Derpy!");
return;
}
while (tmp) {
if (!strcmp(tmp->name, name)) {
PrintConsole(game, "Selecting Derpy spritesheet: %s", name);
game->level.derpy_sheet = &(tmp->bitmap);
game->level.sheet_rows = tmp->rows;
game->level.sheet_cols = tmp->cols;
game->level.sheet_speed_modifier = tmp->speed;
game->level.sheet_pos = 0;
return;
}
tmp = tmp->next;
}
PrintConsole(game, "ERROR: No spritesheets registered for Derpy with given name: %s", name);
return;
}
void RegisterDerpySpritesheet(struct Game *game, char* name) {
char filename[255] = { };
sprintf(filename, "data/levels/derpy/%s.ini", name);
ALLEGRO_CONFIG *config = al_load_config_file(filename);
struct Spritesheet *s = malloc(sizeof(struct Spritesheet));
s->name = malloc((strlen(name)+1)*sizeof(char));
strcpy(s->name, name);
s->bitmap = NULL;
s->cols = atoi(al_get_config_value(config, "", "cols"));
s->rows = atoi(al_get_config_value(config, "", "rows"));
s->speed = atof(al_get_config_value(config, "", "speed"));
s->next = game->level.derpy_sheets;
game->level.derpy_sheets = s;
al_destroy_config(config);
}
void Level_Passed(struct Game *game) {
if (game->level.current_level<6) {
int available = atoi(GetConfigOptionDefault("MuffinAttack", "level", "1"));
@ -51,7 +89,10 @@ bool Accelerate(struct Game *game, struct TM_Action *action, enum TM_ActionState
}
bool Walk(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state == TM_ACTIONSTATE_INIT) action->arguments = NULL;
if (state != TM_ACTIONSTATE_RUNNING) return false;
if (!(action->arguments)) SelectDerpySpritesheet(game, "walk");
action->arguments++;
game->level.derpy_x+=tps(game, 60*0.001);
if (game->level.derpy_x<0.05) return false;
return true;
@ -65,7 +106,10 @@ bool Move(struct Game *game, struct TM_Action *action, enum TM_ActionState state
}
bool Fly(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state == TM_ACTIONSTATE_INIT) action->arguments = NULL;
if (state != TM_ACTIONSTATE_RUNNING) return false;
if (!(action->arguments)) SelectDerpySpritesheet(game, "fly");
action->arguments++;
game->level.derpy_y-=tps(game, 60*0.004);
if (game->level.derpy_y>0.2) return false;
game->level.handle_input=true;
@ -134,7 +178,8 @@ bool GenerateObstracles(struct Game *game, struct TM_Action *action, enum TM_Act
bool Stop(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state != TM_ACTIONSTATE_RUNNING) return false;
game->level.speed=0;
game->level.sheet_speed = 0;
SelectDerpySpritesheet(game, "stand");
/*game->level.sheet_speed = 0;*/
return true;
}
@ -168,8 +213,8 @@ void Level_Draw(struct Game *game) {
game->level.derpy_y += 0.005;
/*PrintConsole(game, "Derpy Y position: %f", game->level.derpy_y);*/
}
if (game->level.derpy_y > 0.5) game->level.sheet_speed = 0.0020/game->level.speed;
else game->level.sheet_speed=0;
if ((game->level.derpy_y > 0.5) && (!game->level.sheet_speed)) { SelectDerpySpritesheet(game, "run"); game->level.sheet_speed = 0.0020/game->level.speed; }
else if ((game->level.derpy_y <= 0.5) && (game->level.sheet_speed)) { SelectDerpySpritesheet(game, "fly"); game->level.sheet_speed=0; }
if (game->level.derpy_y < 0) game->level.derpy_y=0;
else if (game->level.derpy_y > 0.75) game->level.derpy_y=0.75;
}
@ -219,7 +264,7 @@ void Level_Draw(struct Game *game) {
al_set_target_bitmap(game->level.derpy);
al_clear_to_color(al_map_rgba(0,0,0,0));
al_draw_bitmap_region(game->level.derpy_walkcycle,al_get_bitmap_width(game->level.derpy)*(game->level.sheet_pos%game->level.sheet_cols),al_get_bitmap_height(game->level.derpy)*(game->level.sheet_pos/game->level.sheet_cols),al_get_bitmap_width(game->level.derpy), al_get_bitmap_height(game->level.derpy),0,0,0);
al_draw_bitmap_region(*(game->level.derpy_sheet),al_get_bitmap_width(game->level.derpy)*(game->level.sheet_pos%game->level.sheet_cols),al_get_bitmap_height(game->level.derpy)*(game->level.sheet_pos/game->level.sheet_cols),al_get_bitmap_width(game->level.derpy), al_get_bitmap_height(game->level.derpy),0,0,0);
if (game->level.sheet_speed) {
game->level.sheet_tmp+=tps(game, 60);
if (game->level.sheet_tmp >= game->level.sheet_speed) {
@ -357,9 +402,7 @@ void Level_Load(struct Game *game) {
game->level.speed = 0;
game->level.derpy_x = -0.2;
game->level.derpy_y = 0.6;
game->level.sheet_rows = 4;
game->level.sheet_cols = 6;
game->level.sheet_pos = 0;
SelectDerpySpritesheet(game, "stand");
game->level.sheet_speed = 2.4;
game->level.sheet_tmp = 0;
game->level.handle_input = false;
@ -427,7 +470,12 @@ void Level_ProcessLogic(struct Game *game, ALLEGRO_EVENT *ev) {
}
void Level_Preload(struct Game *game) {
game->level.derpy_sheets = NULL;
Pause_Preload(game);
RegisterDerpySpritesheet(game, "walk");
RegisterDerpySpritesheet(game, "fly");
RegisterDerpySpritesheet(game, "run");
RegisterDerpySpritesheet(game, "stand");
if (game->level.current_level!=1) Moonwalk_Preload(game);
else {
game->level.sample = al_load_sample( "data/levels/1/music.flac" );
@ -451,19 +499,31 @@ void Level_Unload(struct Game *game) {
else {
TM_Destroy();
}
struct Obstracle *tmp, *t = game->level.obstracles;
if (t) tmp = t->prev;
while (t) {
if (tmp) free(tmp);
tmp = t;
t = t->next;
struct Obstracle *t = game->level.obstracles;
if (t) {
while (t->next) {
if (t->prev) free(t->prev);
t = t->next;
}
free(t);
}
Level_UnloadBitmaps(game);
struct Spritesheet *tmp, *s = game->level.derpy_sheets;
tmp = s;
while (s) {
tmp = s;
s = s->next;
free(tmp);
}
}
void Level_UnloadBitmaps(struct Game *game) {
al_destroy_bitmap(game->level.derpy);
al_destroy_bitmap(game->level.derpy_walkcycle);
struct Spritesheet *tmp = game->level.derpy_sheets;
while (tmp) {
al_destroy_bitmap(tmp->bitmap);
tmp = tmp->next;
}
if (game->level.current_level!=1) Moonwalk_UnloadBitmaps(game);
else {
al_destroy_bitmap(game->level.foreground);
@ -476,7 +536,14 @@ void Level_UnloadBitmaps(struct Game *game) {
}
void Level_PreloadBitmaps(struct Game *game) {
game->level.derpy_walkcycle = LoadScaledBitmap("levels/derpcycle.png", al_get_display_width(game->display)*0.1953125*6, al_get_display_height(game->display)*0.25*4);
struct Spritesheet *tmp = game->level.derpy_sheets;
while (tmp) {
char filename[255] = { };
sprintf(filename, "levels/derpy/%s.png", tmp->name);
tmp->bitmap = LoadScaledBitmap(filename, al_get_display_width(game->display)*0.1953125*tmp->cols, al_get_display_height(game->display)*0.25*tmp->rows);
tmp = tmp->next;
}
game->level.derpy = al_create_bitmap(al_get_display_width(game->display)*0.1953125, al_get_display_height(game->display)*0.25);
if (game->level.current_level!=1) Moonwalk_PreloadBitmaps(game);
else {

View file

@ -20,6 +20,7 @@
*/
#include "main.h"
void SelectDerpySpritesheet(struct Game *game, char* name);
void Level_Passed(struct Game *game);
void Level_Draw(struct Game *game);
void Level_Preload(struct Game *game);

View file

@ -61,6 +61,14 @@ struct Obstracle {
struct Obstracle *prev, *next;
};
struct Spritesheet {
char* name;
ALLEGRO_BITMAP* bitmap;
int rows, cols;
float speed;
struct Spritesheet* next;
};
/*! \brief Resources used by Level state. */
struct Level {
int current_level; /*!< Level number. */
@ -69,14 +77,16 @@ struct Level {
float derpy_x, derpy_y;
bool handle_input;
int sheet_rows, sheet_cols, sheet_pos;
float sheet_tmp, sheet_speed;
float sheet_tmp, sheet_speed, sheet_speed_modifier;
ALLEGRO_SAMPLE *sample; /*!< Sample with background music. */
ALLEGRO_SAMPLE_INSTANCE *music; /*!< Sample instance with background music. */
unsigned int music_pos; /*!< Position of sample instance. Used when pausing game. */
ALLEGRO_BITMAP *background, *stage, *foreground, *clouds;
ALLEGRO_BITMAP *welcome;
ALLEGRO_BITMAP *derpy_walkcycle; /*!< Derpy walk cycle spritesheet. */
ALLEGRO_BITMAP **derpy_sheet; /*!< Active Derpy sprite sheet. */
ALLEGRO_BITMAP *derpy; /*!< Derpy sprite. */
struct Spritesheet* derpy_sheets; /*!< List of sprite sheets of Derpy character. */
struct Spritesheet* pony_sheets; /*!< List of sprite sheets of character rescued by Derpy. */
struct {
ALLEGRO_BITMAP *pie;
} obst_bmps;

View file

@ -26,7 +26,7 @@
void Moonwalk_Draw(struct Game *game) {
al_set_target_bitmap(game->level.derpy);
al_clear_to_color(al_map_rgba(0,0,0,0));
al_draw_bitmap_region(game->level.derpy_walkcycle,al_get_bitmap_width(game->level.derpy)*(game->level.moonwalk.derpy_frame%6),al_get_bitmap_height(game->level.derpy)*(game->level.moonwalk.derpy_frame/6),al_get_bitmap_width(game->level.derpy), al_get_bitmap_height(game->level.derpy),0,0,0);
al_draw_bitmap_region(*(game->level.derpy_sheet),al_get_bitmap_width(game->level.derpy)*(game->level.moonwalk.derpy_frame%6),al_get_bitmap_height(game->level.derpy)*(game->level.moonwalk.derpy_frame/6),al_get_bitmap_width(game->level.derpy), al_get_bitmap_height(game->level.derpy),0,0,0);
al_set_target_bitmap(al_get_backbuffer(game->display));
game->level.moonwalk.derpy_pos=game->level.moonwalk.derpy_pos+tps(game, 60*0.00092);
@ -57,6 +57,7 @@ void Moonwalk_Draw(struct Game *game) {
}
void Moonwalk_Load(struct Game *game) {
SelectDerpySpritesheet(game, "walk");
game->level.moonwalk.derpy_frame = 0;
game->level.moonwalk.derpy_frame_tmp = 0;
game->level.moonwalk.derpy_pos = -0.2;
@ -79,7 +80,7 @@ int Moonwalk_Keydown(struct Game *game, ALLEGRO_EVENT *ev) {
void Moonwalk_PreloadBitmaps(struct Game *game) {
game->level.moonwalk.image =LoadScaledBitmap("levels/disco.jpg", al_get_display_width(game->display), al_get_display_height(game->display));
game->level.derpy_walkcycle = LoadScaledBitmap("levels/derpcycle.png", al_get_display_width(game->display)*0.1953125*6, al_get_display_height(game->display)*0.25*4);
/*game->level.derpy_sheet = LoadScaledBitmap("levels/derpcycle.png", al_get_display_width(game->display)*0.1953125*6, al_get_display_height(game->display)*0.25*4);*/
game->level.derpy = al_create_bitmap(al_get_display_width(game->display)*0.1953125, al_get_display_height(game->display)*0.25);