refactor first level and timeline

This commit is contained in:
Sebastian Krzyszkowiak 2012-09-26 18:48:36 +02:00
parent cae92f0272
commit d6b68a3740
6 changed files with 169 additions and 97 deletions

View file

@ -100,32 +100,24 @@ void Level_Passed(struct Game *game) {
}
void Level_Logic(struct Game *game) {
if (game->level.current_level!=1) Moonwalk_Logic(game);
}
void Level_Draw(struct Game *game) {
if (!al_get_sample_instance_playing(game->level.music) && (game->loadstate==GAMESTATE_LEVEL)) {
al_set_sample_instance_playing(game->level.music, true);
al_set_sample_instance_position(game->level.music, game->level.music_pos);
}
if (game->level.current_level!=1) Moonwalk_Draw(game);
else {
if (game->level.current_level!=1) {
Moonwalk_Logic(game);
} else {
struct ALLEGRO_KEYBOARD_STATE keyboard;
al_get_keyboard_state(&keyboard);
if (game->level.handle_input) {
if (game->level.derpy_angle > 0) { game->level.derpy_angle -= tps(game, 60*0.02); if (game->level.derpy_angle < 0) game->level.derpy_angle = 0; }
if (game->level.derpy_angle < 0) { game->level.derpy_angle += tps(game, 60*0.02); if (game->level.derpy_angle > 0) game->level.derpy_angle = 0; }
if (game->level.derpy_angle > 0) { game->level.derpy_angle -= 0.02; if (game->level.derpy_angle < 0) game->level.derpy_angle = 0; }
if (game->level.derpy_angle < 0) { game->level.derpy_angle += 0.02; if (game->level.derpy_angle > 0) game->level.derpy_angle = 0; }
if (al_key_down(&keyboard, ALLEGRO_KEY_UP)) {
game->level.derpy_y -= tps(game, 60*0.005);
game->level.derpy_angle -= tps(game, 60*0.03);
if (game->level.derpy_angle < tps(game, 60*-0.15)) game->level.derpy_angle = tps(game, 60*-0.15);
game->level.derpy_y -= 0.005;
game->level.derpy_angle -= 0.03;
if (game->level.derpy_angle < -0.15) game->level.derpy_angle = -0.15;
/*PrintConsole(game, "Derpy Y position: %f", game->level.derpy_y);*/
}
if (al_key_down(&keyboard, ALLEGRO_KEY_DOWN)) {
game->level.derpy_y += tps(game, 60*0.005);
game->level.derpy_angle += tps(game, 60*0.03);
if (game->level.derpy_angle > tps(game, 60*0.15)) game->level.derpy_angle = tps(game, 60*0.15);
game->level.derpy_y += 0.005;
game->level.derpy_angle += 0.03;
if (game->level.derpy_angle > 0.15) game->level.derpy_angle = 0.15;
/*PrintConsole(game, "Derpy Y position: %f", game->level.derpy_y);*/
}
/*if ((game->level.derpy_y > 0.6) && (game->level.flying)) {
@ -142,9 +134,107 @@ void Level_Draw(struct Game *game) {
if (game->level.derpy_y < 0) game->level.derpy_y=0;
else if (game->level.derpy_y > 0.8) game->level.derpy_y=0.8;
game->level.derpy_y += tps(game, 60*(game->level.derpy_angle / 30));
game->level.derpy_y += game->level.derpy_angle / 30;
}
int derpyx = game->level.derpy_x*game->viewportWidth;
int derpyy = game->level.derpy_y*game->viewportHeight;
int derpyw = al_get_bitmap_width(game->level.derpy);
int derpyh = al_get_bitmap_height(game->level.derpy);
int derpyo = game->viewportWidth*0.1953125-al_get_bitmap_width(game->level.derpy); /* offset */
struct Obstacle *tmp = game->level.obstacles;
while (tmp) {
/*PrintConsole(game, "DRAWING %f %f", tmp->x, tmp->y);*/
int x = (tmp->x/100.0)*game->viewportWidth;
int y = (tmp->y/100.0)*game->viewportHeight;
int w = 0, h = 0;
if (tmp->bitmap) {
w = al_get_bitmap_width(*(tmp->bitmap))/tmp->cols;
h = al_get_bitmap_height(*(tmp->bitmap))/tmp->rows;
}
if (x > -w) {
/*if (!tmp->hit)*/
if ((((x>=derpyx+0.38*derpyw+derpyo) && (x<=derpyx+0.94*derpyw+derpyo)) || ((x+w>=derpyx+0.38*derpyw+derpyo) && (x+w<=derpyx+0.94*derpyw+derpyo)) || ((x<=derpyx+0.38*derpyw+derpyo) && (x+w>=derpyx+0.94*derpyw+derpyo))) &&
(((y>=derpyy+0.26*derpyh) && (y<=derpyy+0.76*derpyh)) || ((y+h>=derpyy+0.26*derpyh) && (y+h<=derpyy+0.76*derpyh)) || ((y<=derpyy+0.26*derpyh) && (y+h>=derpyy+0.76*derpyh)))) {
tmp->hit=true;
}
if (tmp->anim_speed) {
tmp->tmp_pos+=1;
if (tmp->tmp_pos >= tmp->anim_speed) {
tmp->pos++;
tmp->tmp_pos = 0;
}
if (tmp->pos>=tmp->cols*tmp->rows-tmp->blanks) tmp->pos=0;
}
if (tmp->hit) {
if (tmp->points>=0) tmp->bitmap = NULL;
game->level.hp+=0.0002*tmp->points*(((1-game->level.speed_modifier)/2.0)+1);
if (game->level.hp>1) game->level.hp=1;
//PrintConsole(game, "POINTS: %d, %f", tmp->points, tps(game, 60*0.0002*tmp->points*game->level.speed_modifier));
if ((game->level.hp<=0) && (!game->level.failed)) {
game->level.failed = true;
game->level.handle_input = false;
game->level.speed_modifier = 1;
TM_AddBackgroundAction(&LevelFailed, NULL, 0, "levelfailed");
}
}
tmp->x -= game->level.speed*game->level.speed_modifier*tmp->speed*100*al_get_bitmap_width(game->level.stage)/(float)game->viewportWidth;
if (tmp->callback) tmp->callback(game, tmp);
tmp = tmp->next;
} else {
if (tmp->next)
tmp->next->prev = tmp->prev;
if (tmp->prev)
tmp->prev->next = tmp->next;
else
game->level.obstacles = tmp->next;
struct Obstacle *t = tmp;
tmp = tmp->next;
free(t);
}
}
/*if (colision) game->level.hp-=tps(game, 60*0.002);*/
if ((game->level.sheet_speed) && (game->level.sheet_speed_modifier)) {
game->level.sheet_tmp+=1;
if (game->level.sheet_tmp >= (game->level.sheet_speed/game->level.speed_modifier)/game->level.sheet_speed_modifier) {
game->level.sheet_pos++;
game->level.sheet_tmp = 0;
}
if (game->level.sheet_pos>=game->level.sheet_cols*game->level.sheet_rows-game->level.sheet_blanks) {
game->level.sheet_pos=0;
if (game->level.sheet_successor) {
SelectDerpySpritesheet(game, game->level.sheet_successor);
}
}
}
if (game->level.speed > 0) {
game->level.cl_pos += game->level.speed*game->level.speed_modifier * 0.2;
game->level.bg_pos += game->level.speed*game->level.speed_modifier * 0.6;
game->level.st_pos += game->level.speed*game->level.speed_modifier * 1;
game->level.fg_pos += game->level.speed*game->level.speed_modifier * 1.75;
if (game->level.bg_pos >= 1) game->level.bg_pos=game->level.bg_pos-1;
if (game->level.st_pos >= 1) game->level.st_pos=game->level.st_pos-1;
if (game->level.fg_pos >= 1) game->level.fg_pos=game->level.fg_pos-1;
}
game->level.cl_pos += 0.00005;
if (game->level.cl_pos >= 1) game->level.cl_pos=game->level.cl_pos-1;
TM_Process();
}
}
void Level_Draw(struct Game *game) {
if (!al_get_sample_instance_playing(game->level.music) && (game->loadstate==GAMESTATE_LEVEL)) {
al_set_sample_instance_playing(game->level.music, true);
al_set_sample_instance_position(game->level.music, game->level.music_pos);
}
if (game->level.current_level!=1) Moonwalk_Draw(game);
else {
al_draw_bitmap(game->level.clouds, (-game->level.cl_pos)*al_get_bitmap_width(game->level.clouds), 0, 0);
al_draw_bitmap(game->level.clouds, (1+(-game->level.cl_pos))*al_get_bitmap_width(game->level.clouds), 0, 0);
al_draw_bitmap(game->level.background, (-game->level.bg_pos)*al_get_bitmap_width(game->level.background), 0, 0);
@ -169,10 +259,8 @@ void Level_Draw(struct Game *game) {
h = al_get_bitmap_height(*(tmp->bitmap))/tmp->rows;
}
if (x > -w) {
/*if (!tmp->hit)*/
if ((((x>=derpyx+0.38*derpyw+derpyo) && (x<=derpyx+0.94*derpyw+derpyo)) || ((x+w>=derpyx+0.38*derpyw+derpyo) && (x+w<=derpyx+0.94*derpyw+derpyo)) || ((x<=derpyx+0.38*derpyw+derpyo) && (x+w>=derpyx+0.94*derpyw+derpyo))) &&
(((y>=derpyy+0.26*derpyh) && (y<=derpyy+0.76*derpyh)) || ((y+h>=derpyy+0.26*derpyh) && (y+h<=derpyy+0.76*derpyh)) || ((y<=derpyy+0.26*derpyh) && (y+h>=derpyy+0.76*derpyh)))) {
tmp->hit=true;
if ((tmp->hit) && (tmp->points<0)) {
colision = true;
}
if (tmp->bitmap) {
@ -181,33 +269,9 @@ void Level_Draw(struct Game *game) {
al_destroy_bitmap(subbitmap);
}
if (tmp->anim_speed) {
tmp->tmp_pos+=tps(game, 60);
if (tmp->tmp_pos >= tmp->anim_speed) {
tmp->pos++;
tmp->tmp_pos = 0;
}
if (tmp->pos>=tmp->cols*tmp->rows-tmp->blanks) tmp->pos=0;
}
/*al_draw_bitmap(*(tmp->bitmap), x, y, 0);*/
if (game->level.debug_show_sprite_frames) al_draw_rectangle(x, y, x+w, y+h, al_map_rgba(255,0,0,255), 3);
if (tmp->hit) {
if (tmp->points<0) colision = true;
else tmp->bitmap = NULL;
game->level.hp+=tps(game, 60*0.0002*tmp->points*(((1-game->level.speed_modifier)/2.0)+1));
if (game->level.hp>1) game->level.hp=1;
PrintConsole(game, "POINTS: %d, %f", tmp->points, tps(game, 60*0.0002*tmp->points*game->level.speed_modifier));
if ((game->level.hp<=0) && (!game->level.failed)) {
game->level.failed = true;
game->level.handle_input = false;
game->level.speed_modifier = 1;
TM_AddBackgroundAction(&LevelFailed, NULL, 0, "levelfailed");
}
}
tmp->x -= tps(game, game->level.speed*game->level.speed_modifier*60*tmp->speed)*100*al_get_bitmap_width(game->level.stage)/(float)game->viewportWidth;
if (tmp->callback) tmp->callback(game, tmp);
tmp = tmp->next;
} else {
if (tmp->next)
@ -226,19 +290,6 @@ 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_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_speed_modifier)) {
game->level.sheet_tmp+=tps(game, 60);
if (game->level.sheet_tmp >= (game->level.sheet_speed/game->level.speed_modifier)/game->level.sheet_speed_modifier) {
game->level.sheet_pos++;
game->level.sheet_tmp = 0;
}
if (game->level.sheet_pos>=game->level.sheet_cols*game->level.sheet_rows-game->level.sheet_blanks) {
game->level.sheet_pos=0;
if (game->level.sheet_successor) {
SelectDerpySpritesheet(game, game->level.sheet_successor);
}
}
}
al_set_target_bitmap(al_get_backbuffer(game->display));
al_draw_tinted_rotated_bitmap(game->level.derpy, al_map_rgba(255,255-colision*255,255-colision*255,255), al_get_bitmap_width(game->level.derpy), al_get_bitmap_height(game->level.derpy)/2, derpyx+game->viewportWidth*0.1953125, derpyy + al_get_bitmap_height(game->level.derpy)/2, game->level.derpy_angle, 0);
@ -254,17 +305,6 @@ void Level_Draw(struct Game *game) {
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 += tps(game, 60*game->level.speed*game->level.speed_modifier) * 0.2;
game->level.bg_pos += tps(game, 60*game->level.speed*game->level.speed_modifier) * 0.6;
game->level.st_pos += tps(game, 60*game->level.speed*game->level.speed_modifier) * 1;
game->level.fg_pos += tps(game, 60*game->level.speed*game->level.speed_modifier) * 1.75;
if (game->level.bg_pos >= 1) game->level.bg_pos=game->level.bg_pos-1;
if (game->level.st_pos >= 1) game->level.st_pos=game->level.st_pos-1;
if (game->level.fg_pos >= 1) game->level.fg_pos=game->level.fg_pos-1;
}
game->level.cl_pos += tps(game, 60*0.00005);
if (game->level.cl_pos >= 1) game->level.cl_pos=game->level.cl_pos-1;
al_set_target_bitmap(game->level.meter_bmp);
al_clear_to_color(al_map_rgba(0,0,0,0));
@ -277,7 +317,7 @@ void Level_Draw(struct Game *game) {
al_draw_tinted_bitmap(game->level.meter_bmp, al_map_rgba(game->level.meter_alpha,game->level.meter_alpha,game->level.meter_alpha,game->level.meter_alpha), game->viewportWidth*0.95-al_get_bitmap_width(game->level.meter_bmp), game->viewportHeight*0.975-al_get_bitmap_height(game->level.meter_bmp), 0);
TM_Process();
TM_Draw();
}
}

View file

@ -26,9 +26,10 @@
bool LevelFailed(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state == TM_ACTIONSTATE_INIT) {
TM_AddBackgroundAction(&FadeOut, NULL, 3000, "fadeout");
} else if (state == TM_ACTIONSTATE_RUNNING) {
} else if (state == TM_ACTIONSTATE_DRAW) {
al_draw_filled_rectangle(0, 0, game->viewportWidth, game->viewportHeight, al_map_rgba(0,0,0,100));
al_draw_text_with_shadow(game->menu.font_title, al_map_rgb(255,255,255), game->viewportWidth*0.5, game->viewportHeight*0.4, ALLEGRO_ALIGN_CENTRE, "Failed!");
} else if (state == TM_ACTIONSTATE_RUNNING) {
game->level.speed-=0.00001;
return false;
}
@ -47,7 +48,7 @@ bool Walk(struct Game *game, struct TM_Action *action, enum TM_ActionState state
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+=0.001;
if (game->level.derpy_x<0.05) return false;
return true;
}
@ -61,7 +62,7 @@ bool Move(struct Game *game, struct TM_Action *action, enum TM_ActionState state
bool ShowMeter(struct Game *game, struct TM_Action *action, enum TM_ActionState state) {
if (state != TM_ACTIONSTATE_RUNNING) return false;
game->level.meter_alpha+=tps(game, 60*4);
game->level.meter_alpha+=4;
if (game->level.meter_alpha>=255) {
game->level.meter_alpha=255;
return true;
@ -74,12 +75,12 @@ bool Fly(struct Game *game, struct TM_Action *action, enum TM_ActionState state)
if (state != TM_ACTIONSTATE_RUNNING) return false;
if (!(action->arguments)) {
SelectDerpySpritesheet(game, "fly");
game->level.derpy_angle = tps(game, 60*-0.15);
game->level.derpy_angle = -0.15;
/*game->level.gg = true;*/
TM_AddBackgroundAction(&ShowMeter, NULL, 0, "showmeter");
action->arguments++;
}
game->level.derpy_y-=tps(game, 60*0.004);
game->level.derpy_y-=0.004;
if (game->level.derpy_y>0.2) return false;
game->level.handle_input=true;
return true;
@ -93,9 +94,9 @@ bool Run(struct Game *game, struct TM_Action *action, enum TM_ActionState state)
game->level.speed_modifier=1;
action->arguments++;
}
game->level.derpy_y+=tps(game, 60*0.0042);
if (game->level.derpy_angle > 0) { game->level.derpy_angle -= tps(game, 60*0.02); if (game->level.derpy_angle < 0) game->level.derpy_angle = 0; }
if (game->level.derpy_angle < 0) { game->level.derpy_angle += tps(game, 60*0.02); if (game->level.derpy_angle > 0) game->level.derpy_angle = 0; }
game->level.derpy_y+=0.0042;
if (game->level.derpy_angle > 0) { game->level.derpy_angle -= 0.02; if (game->level.derpy_angle < 0) game->level.derpy_angle = 0; }
if (game->level.derpy_angle < 0) { game->level.derpy_angle += 0.02; if (game->level.derpy_angle > 0) game->level.derpy_angle = 0; }
if (game->level.derpy_y<0.65) return false;
game->level.derpy_angle = 0;
SelectDerpySpritesheet(game, "run");
@ -118,7 +119,7 @@ bool GenerateObstacles(struct Game *game, struct TM_Action *action, enum TM_Acti
*in = true;*/
}
else if (state == TM_ACTIONSTATE_RUNNING) {
if (rand()%(10000/(int)tps(game, 60*85*game->level.speed_modifier))<=3) {
if (rand()%(10000/(int)(85*game->level.speed_modifier))<=3) {
PrintConsole(game, "OBSTACLE %d", *count);
(*count)++;
struct Obstacle *obst = malloc(sizeof(struct Obstacle));
@ -192,7 +193,7 @@ bool GenerateObstacles(struct Game *game, struct TM_Action *action, enum TM_Acti
game->level.obstacles = obst;
if (*count > 128) return true;
}
} else {
} else if (state == TM_ACTIONSTATE_DESTROY) {
free(action->arguments->value);
TM_DestroyArgs(action->arguments);
action->arguments = NULL;
@ -217,6 +218,11 @@ bool Letter(struct Game *game, struct TM_Action *action, enum TM_ActionState sta
free(action->arguments->value);
TM_DestroyArgs(action->arguments);
}
if (state == TM_ACTIONSTATE_DRAW) {
float* f = (float*)action->arguments->value;
al_draw_tinted_bitmap(game->level.letter, al_map_rgba(*f,*f,*f,*f), (game->viewportWidth-al_get_bitmap_width(game->level.letter))/2.0, al_get_bitmap_height(game->level.letter)*-0.05, 0);
return false;
}
if (state != TM_ACTIONSTATE_RUNNING) return false;
if (!action->arguments) {
action->arguments = TM_AddToArgs(action->arguments, malloc(sizeof(float)));
@ -231,7 +237,7 @@ bool Letter(struct Game *game, struct TM_Action *action, enum TM_ActionState sta
action->arguments->next->next = NULL;
}
float* f = (float*)action->arguments->value;
*f+=tps(game,350);
*f+=5;
if (*f>255) *f=255;
al_draw_tinted_bitmap(game->level.letter, al_map_rgba(*f,*f,*f,*f), (game->viewportWidth-al_get_bitmap_width(game->level.letter))/2.0, al_get_bitmap_height(game->level.letter)*-0.05, 0);
struct ALLEGRO_KEYBOARD_STATE keyboard;
@ -257,10 +263,11 @@ bool FadeIn(struct Game *game, struct TM_Action *action, enum TM_ActionState sta
al_clear_to_color(al_map_rgb(0,0,0));
al_set_target_bitmap(al_get_backbuffer(game->display));
} else if (state == TM_ACTIONSTATE_RUNNING) {
al_draw_tinted_bitmap(fade_bitmap,al_map_rgba_f(1,1,1,*fadeloop/255.0),0,0,0);
*fadeloop-=tps(game, 600);
*fadeloop-=10;
if (*fadeloop<=0) return true;
} else {
} else if (state == TM_ACTIONSTATE_DRAW) {
al_draw_tinted_bitmap(fade_bitmap,al_map_rgba_f(1,1,1,*fadeloop/255.0),0,0,0);
} else if (state == TM_ACTIONSTATE_DESTROY) {
al_destroy_bitmap(fade_bitmap);
free(fadeloop);
TM_DestroyArgs(action->arguments);
@ -285,10 +292,11 @@ bool FadeOut(struct Game *game, struct TM_Action *action, enum TM_ActionState st
al_clear_to_color(al_map_rgb(0,0,0));
al_set_target_bitmap(al_get_backbuffer(game->display));
} else if (state == TM_ACTIONSTATE_RUNNING) {
al_draw_tinted_bitmap(fade_bitmap,al_map_rgba_f(1,1,1,*fadeloop/255.0),0,0,0);
*fadeloop+=tps(game, 600);
*fadeloop+=10;
if (*fadeloop>=256) return true;
} else {
} else if (state == TM_ACTIONSTATE_DRAW) {
al_draw_tinted_bitmap(fade_bitmap,al_map_rgba_f(1,1,1,*fadeloop/255.0),0,0,0);
} else if (state == TM_ACTIONSTATE_DESTROY) {
PrintConsole(game, "Leaving level with %d HP", (int)(game->level.hp*100));
al_destroy_bitmap(fade_bitmap);
free(fadeloop);
@ -319,14 +327,15 @@ bool Welcome(struct Game *game, struct TM_Action *action, enum TM_ActionState st
float fade = *tmp;
if (fade>255) fade=255;
if (*tmp > 2048) { *tmp=255; *in=false; }
al_draw_tinted_bitmap(game->level.welcome, al_map_rgba_f(fade/255.0,fade/255.0,fade/255.0,fade/255.0), 0, 0, 0);
if (*in) {
*tmp+=tps(game, 600);
*tmp+=10;
} else {
*tmp-=tps(game, 600);
*tmp-=10;
if (*tmp<=0) { return true; }
}
} else {
} else if (state == TM_ACTIONSTATE_DRAW) {
al_draw_tinted_bitmap(game->level.welcome, al_map_rgba_f(*tmp/255.0,*tmp/255.0,*tmp/255.0,*tmp/255.0), 0, 0, 0);
} else if (state == TM_ACTIONSTATE_DESTROY) {
free(action->arguments->value);
free(action->arguments->next->value);
TM_DestroyArgs(action->arguments);

View file

@ -45,13 +45,13 @@ void Obst_RotateSin(struct Game *game, struct Obstacle *obstacle) {
float* a = (float*)obstacle->data;
/*PrintConsole(game, "%p - %f", obstacle, obstacle->y);*/
obstacle->angle = sin(*a)/2.0;
*a+=tps(game, 4.5);
*a+=4.5/60.0;
}
void Obst_MoveSin(struct Game *game, struct Obstacle *obstacle) {
float* a = (float*)obstacle->data;
/*PrintConsole(game, "%p - %f", obstacle, obstacle->y);*/
obstacle->y -= sin(*a)*4;
*a+=tps(game, 4.5);
*a+=4.5/60.0;
obstacle->y += sin(*a)*4;
}

View file

@ -534,6 +534,7 @@ int main(int argc, char **argv){
return -1;
}
al_register_event_source(game.event_queue, al_get_timer_event_source(game.timer));
al_wait_for_vsync();
al_start_timer(game.timer);
setlocale(LC_NUMERIC, "C"); /* FIXME? */

View file

@ -108,6 +108,25 @@ void TM_Process() {
}
}
void TM_Draw() {
if (!game) return;
if (queue) {
if ((*queue->function) && (queue->active)) {
(*queue->function)(game, queue, TM_ACTIONSTATE_DRAW);
}
}
/* process all elements from background marked as active */
struct TM_Action *pom = background;
while (pom!=NULL) {
if (pom->active) {
if (*pom->function) {
(*pom->function)(game, pom, TM_ACTIONSTATE_DRAW);
}
}
pom = pom->next;
}
}
void TM_HandleEvent(ALLEGRO_EVENT *ev) {
if (ev->type != ALLEGRO_EVENT_TIMER) return;
if (!game) return;

View file

@ -27,6 +27,7 @@
enum TM_ActionState {
TM_ACTIONSTATE_INIT,
TM_ACTIONSTATE_RUNNING,
TM_ACTIONSTATE_DRAW,
TM_ACTIONSTATE_DESTROY
};
@ -52,6 +53,8 @@ struct TM_Action {
void TM_Init(struct Game* game);
/*! \brief Process current timeline actions. */
void TM_Process();
/*! \brief Ask current timeline actions to draw. */
void TM_Draw();
/*! \brief Handle timer events. */
void TM_HandleEvent(ALLEGRO_EVENT *ev);
/*! \brief Add new action to main queue. */