mirror of
https://gitlab.com/dosowisko.net/libsuperderpy.git
synced 2025-02-12 16:14:23 +01:00
implement spritesheet managament
This commit is contained in:
parent
9959c1c6fe
commit
8abc4a6763
6 changed files with 100 additions and 20 deletions
2
build
2
build
|
@ -1,4 +1,4 @@
|
||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
echo run $@ > gdb.tmp
|
echo run $@ > gdb.tmp
|
||||||
make -j10 && gdb bin/superderpy -x gdb.tmp
|
make -j12 && gdb bin/superderpy -x gdb.tmp
|
||||||
rm gdb.tmp
|
rm gdb.tmp
|
||||||
|
|
|
@ -25,6 +25,7 @@ void About_Draw(struct Game *game) {
|
||||||
/*PrintConsole(game, "%d", al_get_sample_instance_position(game->about.music));*/
|
/*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 (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) {
|
||||||
|
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);
|
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);
|
game->about.fadeloop+=tps(game, 300);
|
||||||
if (game->about.fadeloop>=256) {
|
if (game->about.fadeloop>=256) {
|
||||||
|
|
95
src/level.c
95
src/level.c
|
@ -27,6 +27,44 @@
|
||||||
|
|
||||||
/* TODO: check if spritesheet speed still depends on FPS */
|
/* 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) {
|
void Level_Passed(struct Game *game) {
|
||||||
if (game->level.current_level<6) {
|
if (game->level.current_level<6) {
|
||||||
int available = atoi(GetConfigOptionDefault("MuffinAttack", "level", "1"));
|
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) {
|
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 (state != TM_ACTIONSTATE_RUNNING) return false;
|
||||||
|
if (!(action->arguments)) SelectDerpySpritesheet(game, "walk");
|
||||||
|
action->arguments++;
|
||||||
game->level.derpy_x+=tps(game, 60*0.001);
|
game->level.derpy_x+=tps(game, 60*0.001);
|
||||||
if (game->level.derpy_x<0.05) return false;
|
if (game->level.derpy_x<0.05) return false;
|
||||||
return true;
|
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) {
|
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 (state != TM_ACTIONSTATE_RUNNING) return false;
|
||||||
|
if (!(action->arguments)) SelectDerpySpritesheet(game, "fly");
|
||||||
|
action->arguments++;
|
||||||
game->level.derpy_y-=tps(game, 60*0.004);
|
game->level.derpy_y-=tps(game, 60*0.004);
|
||||||
if (game->level.derpy_y>0.2) return false;
|
if (game->level.derpy_y>0.2) return false;
|
||||||
game->level.handle_input=true;
|
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) {
|
bool Stop(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
|
||||||
if (state != TM_ACTIONSTATE_RUNNING) return false;
|
if (state != TM_ACTIONSTATE_RUNNING) return false;
|
||||||
game->level.speed=0;
|
game->level.speed=0;
|
||||||
game->level.sheet_speed = 0;
|
SelectDerpySpritesheet(game, "stand");
|
||||||
|
/*game->level.sheet_speed = 0;*/
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,8 +213,8 @@ void Level_Draw(struct Game *game) {
|
||||||
game->level.derpy_y += 0.005;
|
game->level.derpy_y += 0.005;
|
||||||
/*PrintConsole(game, "Derpy Y position: %f", game->level.derpy_y);*/
|
/*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;
|
if ((game->level.derpy_y > 0.5) && (!game->level.sheet_speed)) { SelectDerpySpritesheet(game, "run"); game->level.sheet_speed = 0.0020/game->level.speed; }
|
||||||
else game->level.sheet_speed=0;
|
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;
|
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;
|
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_set_target_bitmap(game->level.derpy);
|
||||||
al_clear_to_color(al_map_rgba(0,0,0,0));
|
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) {
|
if (game->level.sheet_speed) {
|
||||||
game->level.sheet_tmp+=tps(game, 60);
|
game->level.sheet_tmp+=tps(game, 60);
|
||||||
if (game->level.sheet_tmp >= game->level.sheet_speed) {
|
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.speed = 0;
|
||||||
game->level.derpy_x = -0.2;
|
game->level.derpy_x = -0.2;
|
||||||
game->level.derpy_y = 0.6;
|
game->level.derpy_y = 0.6;
|
||||||
game->level.sheet_rows = 4;
|
SelectDerpySpritesheet(game, "stand");
|
||||||
game->level.sheet_cols = 6;
|
|
||||||
game->level.sheet_pos = 0;
|
|
||||||
game->level.sheet_speed = 2.4;
|
game->level.sheet_speed = 2.4;
|
||||||
game->level.sheet_tmp = 0;
|
game->level.sheet_tmp = 0;
|
||||||
game->level.handle_input = false;
|
game->level.handle_input = false;
|
||||||
|
@ -427,7 +470,12 @@ void Level_ProcessLogic(struct Game *game, ALLEGRO_EVENT *ev) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Level_Preload(struct Game *game) {
|
void Level_Preload(struct Game *game) {
|
||||||
|
game->level.derpy_sheets = NULL;
|
||||||
Pause_Preload(game);
|
Pause_Preload(game);
|
||||||
|
RegisterDerpySpritesheet(game, "walk");
|
||||||
|
RegisterDerpySpritesheet(game, "fly");
|
||||||
|
RegisterDerpySpritesheet(game, "run");
|
||||||
|
RegisterDerpySpritesheet(game, "stand");
|
||||||
if (game->level.current_level!=1) Moonwalk_Preload(game);
|
if (game->level.current_level!=1) Moonwalk_Preload(game);
|
||||||
else {
|
else {
|
||||||
game->level.sample = al_load_sample( "data/levels/1/music.flac" );
|
game->level.sample = al_load_sample( "data/levels/1/music.flac" );
|
||||||
|
@ -451,19 +499,31 @@ void Level_Unload(struct Game *game) {
|
||||||
else {
|
else {
|
||||||
TM_Destroy();
|
TM_Destroy();
|
||||||
}
|
}
|
||||||
struct Obstracle *tmp, *t = game->level.obstracles;
|
struct Obstracle *t = game->level.obstracles;
|
||||||
if (t) tmp = t->prev;
|
if (t) {
|
||||||
while (t) {
|
while (t->next) {
|
||||||
if (tmp) free(tmp);
|
if (t->prev) free(t->prev);
|
||||||
tmp = t;
|
|
||||||
t = t->next;
|
t = t->next;
|
||||||
}
|
}
|
||||||
|
free(t);
|
||||||
|
}
|
||||||
Level_UnloadBitmaps(game);
|
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) {
|
void Level_UnloadBitmaps(struct Game *game) {
|
||||||
al_destroy_bitmap(game->level.derpy);
|
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);
|
if (game->level.current_level!=1) Moonwalk_UnloadBitmaps(game);
|
||||||
else {
|
else {
|
||||||
al_destroy_bitmap(game->level.foreground);
|
al_destroy_bitmap(game->level.foreground);
|
||||||
|
@ -476,7 +536,14 @@ void Level_UnloadBitmaps(struct Game *game) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Level_PreloadBitmaps(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);
|
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);
|
if (game->level.current_level!=1) Moonwalk_PreloadBitmaps(game);
|
||||||
else {
|
else {
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
*/
|
*/
|
||||||
#include "main.h"
|
#include "main.h"
|
||||||
|
|
||||||
|
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);
|
||||||
|
|
14
src/main.h
14
src/main.h
|
@ -61,6 +61,14 @@ struct Obstracle {
|
||||||
struct Obstracle *prev, *next;
|
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. */
|
/*! \brief Resources used by Level state. */
|
||||||
struct Level {
|
struct Level {
|
||||||
int current_level; /*!< Level number. */
|
int current_level; /*!< Level number. */
|
||||||
|
@ -69,14 +77,16 @@ struct Level {
|
||||||
float derpy_x, derpy_y;
|
float derpy_x, derpy_y;
|
||||||
bool handle_input;
|
bool handle_input;
|
||||||
int sheet_rows, sheet_cols, sheet_pos;
|
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 *sample; /*!< Sample with background music. */
|
||||||
ALLEGRO_SAMPLE_INSTANCE *music; /*!< Sample instance with background music. */
|
ALLEGRO_SAMPLE_INSTANCE *music; /*!< Sample instance with background music. */
|
||||||
unsigned int music_pos; /*!< Position of sample instance. Used when pausing game. */
|
unsigned int music_pos; /*!< Position of sample instance. Used when pausing game. */
|
||||||
ALLEGRO_BITMAP *background, *stage, *foreground, *clouds;
|
ALLEGRO_BITMAP *background, *stage, *foreground, *clouds;
|
||||||
ALLEGRO_BITMAP *welcome;
|
ALLEGRO_BITMAP *welcome;
|
||||||
ALLEGRO_BITMAP *derpy_walkcycle; /*!< Derpy walk cycle spritesheet. */
|
ALLEGRO_BITMAP **derpy_sheet; /*!< Active Derpy sprite sheet. */
|
||||||
ALLEGRO_BITMAP *derpy; /*!< Derpy sprite. */
|
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 {
|
struct {
|
||||||
ALLEGRO_BITMAP *pie;
|
ALLEGRO_BITMAP *pie;
|
||||||
} obst_bmps;
|
} obst_bmps;
|
||||||
|
|
|
@ -26,7 +26,7 @@
|
||||||
void Moonwalk_Draw(struct Game *game) {
|
void Moonwalk_Draw(struct Game *game) {
|
||||||
al_set_target_bitmap(game->level.derpy);
|
al_set_target_bitmap(game->level.derpy);
|
||||||
al_clear_to_color(al_map_rgba(0,0,0,0));
|
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));
|
al_set_target_bitmap(al_get_backbuffer(game->display));
|
||||||
|
|
||||||
game->level.moonwalk.derpy_pos=game->level.moonwalk.derpy_pos+tps(game, 60*0.00092);
|
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) {
|
void Moonwalk_Load(struct Game *game) {
|
||||||
|
SelectDerpySpritesheet(game, "walk");
|
||||||
game->level.moonwalk.derpy_frame = 0;
|
game->level.moonwalk.derpy_frame = 0;
|
||||||
game->level.moonwalk.derpy_frame_tmp = 0;
|
game->level.moonwalk.derpy_frame_tmp = 0;
|
||||||
game->level.moonwalk.derpy_pos = -0.2;
|
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) {
|
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.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);
|
game->level.derpy = al_create_bitmap(al_get_display_width(game->display)*0.1953125, al_get_display_height(game->display)*0.25);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue