// Checks for mouse input, called once every frame void* mousehandler(MOUSE* mouse_s, void *data) { MOUSE *mouse = (MOUSE*)mouse_s; GDATAPTR game = (GDATAPTR)data; if((mouse->button & MOUSE_L_NEW) && game->gamestarted) { SPRITESPTR sprite = search_sprite_list_for_element("BRICK_WALL"); SPRITESPTR fsprite = sprite; if(sprite != NULL) { do { if(strcmp(sprite->slabel, "BRICK_WALL") == 0) set_anim_flags_on_sprite(sprite, MDOWN); sprite = sprite->nextsprite; } while(sprite != fsprite); } } // if((mouse->button & MOUSE_R)) // { // set_anim_flags_on_sprite(search_sprite_list_for_element("STICKMAN"), MRIGHT); // } // if(mouse->dz > 0) // { // set_anim_flags_on_sprite(search_sprite_list_for_element("STICKMAN"), MRIGHT); // } return NULL; }
void collision_end_lose(cpSpace *Space, void *obj, void *unused) { // cpShape *shape = (cpShape*)obj; // SPRITESPTR sprite = (SPRITESPTR)shape->data; SPRITESPTR stman = search_sprite_list_for_element("STICKMAN"); lives--; set_anim_flags_on_sprite(stman, MDAMAGED); }
// Checks for keyboard input, called once every frame void* keyhandler(String key, void *data) { GDATAPTR game = (GDATAPTR)data; if(game->gamestarted) { if((key[ALLEGRO_KEY_W] & KEYNEW) || (key[ALLEGRO_KEY_UP] & KEYNEW)) { set_anim_flags_on_sprite(search_sprite_list_for_element("STICKMAN"), MUP); } if((key[ALLEGRO_KEY_S] & KEYNEW) || (key[ALLEGRO_KEY_DOWN] & KEYNEW)) { set_anim_flags_on_sprite(search_sprite_list_for_element("STICKMAN"), MDOWN); } if((key[ALLEGRO_KEY_SPACE] & KEYNEW)) { set_anim_flags_on_sprite(search_sprite_list_for_element("STICKMAN"), MATTACK); } } if((key[ALLEGRO_KEY_ESCAPE] & KEYPRESSED)) { game->exit = true; game->gamestarted = false; } if((key[ALLEGRO_KEY_M] & KEYNEW)) { return_to_main_menu(game); } if((key[ALLEGRO_KEY_P] & KEYNEW)) { if(game->paused) { exit_pause(game); mpressed = true; } else { if (game->gamestarted) game->paused = true; } } return NULL; }
void remove_all_enemies(void) { SPRITESPTR sprite; while((sprite = search_sprite_list_for_element("AMEAN")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } while((sprite = search_sprite_list_for_element("BRICK_WALL")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } while((sprite = search_sprite_list_for_element("CLAMP")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } while((sprite = search_sprite_list_for_element("STEEL_WALL")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } while((sprite = search_sprite_list_for_element("FLYING_FIST")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } while((sprite = search_sprite_list_for_element("SPIKES")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } while((sprite = search_sprite_list_for_element("RAW")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } while((sprite = search_sprite_list_for_element("PLANT")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } total_enemies = 0; ameans = 0; bwall = 0; clamp = 0; swall = 0; fist = 0; spikes = 0; raw = 0; plants = 0; }
void update_raw(SPRITESPTR raw) { int nflags = 0; raw->shape->body->v = cpv(-180, 0); if(raw->sdata.x <= 600 && raw->sdata.x >= 550) { set_anim_flags_on_sprite(raw, MATTACK); } add_element_to_render_queue(raw->sdata.currentimg->image, raw->sdata.x, raw->sdata.y, nflags, RCOLOR(255, 255, 255, 255), NULL); if((raw->sdata.animflags & MATTACK)) { int x = raw->sdata.x-5*raw->sdata.anim_counter; int y = raw->sdata.y+30; SIMAGEPTR lazer = search_image_list_for_element(&(raw->ifirstptr), "LAZER"); raw->sdata.anim_counter++; raw->sdata.currentimg = search_image_list_for_element(&(raw->ifirstptr), "RAW_2"); if(x+lazer->width <= raw->sdata.x) { raw->sdata.currentimg = search_image_list_for_element(&(raw->ifirstptr), "RAW_1"); } if(x+lazer->width <= 0) { raw->sdata.anim_counter = 0; remove_anim_flags_on_sprite(raw, MATTACK); } SPRITESPTR stman = search_sprite_list_for_element("STICKMAN"); if((x >= stman->sdata.x && x <= stman->sdata.x+stman->sdata.currentimg->width) && (y >= stman->sdata.y && y <= stman->sdata.y+stman->sdata.currentimg->height) && !(stman->sdata.animflags & MDAMAGED) && !(stman->sdata.animflags & MRECOVER)) { lives--; set_anim_flags_on_sprite(stman, MDAMAGED); raw->sdata.anim_counter = 0; remove_anim_flags_on_sprite(raw, MATTACK); } add_element_to_render_queue(lazer->image, x, y, nflags, RCOLOR(255, 255, 255, 255), NULL); } raw->sdata.x = raw->shape->body->p.x-raw->sdata.currentimg->width/2; raw->sdata.y = raw->shape->body->p.y-raw->sdata.currentimg->height/2; if(raw->sdata.x+raw->sdata.currentimg->width <= 0) cpSpaceAddPostStepCallback(get_global_cpSpace(), &remove_enemy, raw, NULL); }
void update_lives(void) { SPRITESPTR sprite = search_sprite_list_for_element("STICKMAN"); SIMAGEPTR life = search_image_list_for_element(&(sprite->ifirstptr), "STICKFIGURE_LIVES"); int x = res_width-life->width; int y = 0; for(int i = 0; i < lives; i++) { add_element_to_render_queue(life->image, x, y, 0, RCOLOR(255, 255, 255, 255), NULL); x -= life->width+10; } }
void maingame_cleanup(void) { SPRITESPTR stman = search_sprite_list_for_element("STICKMAN"); SPRITESPTR ground = search_sprite_list_for_element("GROUND"); GDATAPTR game = get_game_data(); cpSpace *space = get_global_cpSpace(); cpSpaceRemoveCollisionHandler(space, 1, 2); remove_physics_object(stman); remove_element_from_sprite_list_ptr(stman); remove_element_from_sprite_list("CLOUD"); ground->sdata.x = 0; ground->sdata.y = 510; remove_all_enemies(); game->gamestarted = false; start = false; lives = 3; score = 0; minutes = 0; seconds = 0; }
void update_ground(void) { SPRITESPTR ground = search_sprite_list_for_element("GROUND"); if(start) { ground->sdata.x -= ground->sdata.dx; add_element_to_render_queue(ground->sdata.currentimg->image, ground->sdata.x, ground->sdata.y, 0, RCOLOR(255, 255, 255, 255), NULL); add_element_to_render_queue(ground->sdata.currentimg->image, ground->sdata.x+ground->sdata.currentimg->width, ground->sdata.y, 0, RCOLOR(255, 255, 255, 255), NULL); if(ground->sdata.x+ground->sdata.currentimg->width < 0) ground->sdata.x = 0; } else add_element_to_render_queue(ground->sdata.currentimg->image, ground->sdata.x, ground->sdata.y, 0, RCOLOR(255, 255, 255, 255), NULL); }
void update_clouds(void) { SPRITESPTR clouds = search_sprite_list_for_element("CLOUD"); int nflags = 0; static int m = -1; clouds->sdata.x += m*clouds->sdata.dx; if(clouds->sdata.x+clouds->sdata.currentimg->width < 0) { clouds->sdata.y = rand_int(res_height-90-clouds->sdata.currentimg->height); m *= -1; } if(clouds->sdata.x > res_width) { clouds->sdata.y = rand_int(res_height-90-clouds->sdata.currentimg->height); m *= -1; } add_element_to_render_queue(clouds->sdata.currentimg->image, clouds->sdata.x, clouds->sdata.y, nflags, RCOLOR(255, 255, 255, 255), NULL); }
void remove_all_enemies_of_type(char *enemy_label) { SPRITESPTR sprite; if(strcmp(enemy_label, "AMEAN") == 0) { while((sprite = search_sprite_list_for_element("AMEAN")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } ameans = 0; } else if(strcmp(enemy_label, "BRICK_WALL") == 0) { while((sprite = search_sprite_list_for_element("BRICK_WALL")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } bwall = 0; } else if(strcmp(enemy_label, "CLAMP") == 0) { while((sprite = search_sprite_list_for_element("CLAMP")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } clamp = 0; } else if(strcmp(enemy_label, "STEEL_WALL") == 0) { while((sprite = search_sprite_list_for_element("STEEL_WALL")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } swall = 0; } else if(strcmp(enemy_label, "FLYING_FIST") == 0) { while((sprite = search_sprite_list_for_element("FLYING_FIST")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } fist = 0; } else if(strcmp(enemy_label, "SPIKES") == 0) { while((sprite = search_sprite_list_for_element("SPIKES")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } spikes = 0; } else if(strcmp(enemy_label, "RAW") == 0) { while((sprite = search_sprite_list_for_element("RAW")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } raw = 0; } else if(strcmp(enemy_label, "PLANT") == 0) { while((sprite = search_sprite_list_for_element("PLANT")) != NULL) { remove_physics_object(sprite); remove_element_from_sprite_list_ptr(sprite); } plants = 0; } }
// Performs animations for the stickman and adds the sprites to the render queue void update_stickman(void) { SPRITESPTR stman = search_sprite_list_for_element("STICKMAN"); SPRITESPTR ground = search_sprite_list_for_element("GROUND"); float height = (search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_MOVE_1"))->height; float y = stman->shape->body->p.y-height/2; int cx = 0, cy = 0, nflags = 0; static _Bool up = false, down = false; ALLEGRO_COLOR color = RCOLOR(255, 255, 255, 255); if(!start) { //static int sx = 0; //static int sy = 0; if(y+height >= ground->sdata.y) stman->sdata.anim_counter++; stman->sdata.currentimg = search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_MOVE_1"); if(stman->sdata.anim_counter >= 20) { stman->sdata.anim_counter = 0; stman->shape->e = 0.1; stman->shape->u = 0.9; //sx = stman->shape->body->p.x; //sy = stman->shape->body->p.y; start = true; } } else if((stman->sdata.animflags & MUP) && !down) { if(y+height >= ground->sdata.y && !up) { cpVect currentvel = stman->shape->body->v; stman->shape->body->v = cpv(0, -stman->sdata.dy); cpVect newvel = stman->shape->body->v; stman->shape->body->v = cpvadd(currentvel, newvel); up = true; } else if(y+height >= ground->sdata.y && up) { remove_anim_flags_on_sprite(stman, MUP); up = false; } stman->sdata.currentimg = search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_MOVE_1"); } else if((stman->sdata.animflags & MDOWN)) { down = true; static int dcounter = 0; dcounter++; if(dcounter > 65) { down = false; remove_anim_flags_on_sprite(stman, MDOWN); dcounter = 0; } stman->sdata.currentimg = search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_SLIDE"); cy = 15; } else { stman->sdata.anim_counter++; if(stman->sdata.anim_counter < 5) stman->sdata.currentimg = search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_MOVE_1"); else if(stman->sdata.anim_counter > 5 && stman->sdata.anim_counter < 10) stman->sdata.currentimg = search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_MOVE_2"); else if(stman->sdata.anim_counter > 10) stman->sdata.anim_counter = 0; } if((stman->sdata.animflags & MATTACK)) { static int counter = 0; counter++; if(counter > 44) { remove_anim_flags_on_sprite(stman, MATTACK); counter = 0; } if(up) { stman->sdata.currentimg = search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_ATTACK_JUMP"); } else if(down) { stman->sdata.currentimg = search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_ATTACK_SLIDE"); cy = 20; } else stman->sdata.currentimg = search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_ATTACK_RUN"); } if ((stman->sdata.animflags & MDAMAGED)) { static int counter = 0; counter++; stman->sdata.currentimg = search_image_list_for_element(&stman->ifirstptr, "STICKFIGURE_DEAD"); if(stman->sdata.x+stman->sdata.currentimg->width <= 0 || counter >= 60) { remove_anim_flags_on_sprite(stman, MDAMAGED); set_anim_flags_on_sprite(stman, MRECOVER); stman->shape->body->p.x = 70; stman->shape->body->v = cpvzero; counter = 0; } } if((stman->sdata.animflags & MRECOVER)) { static int counter = 0; counter++; if(counter >= 15 && counter <= 30) color = RCOLOR(255, 255, 255, 105); else if(counter >= 45 && counter <= 60) color = RCOLOR(255, 255, 255, 105); else if(counter >= 75 && counter <= 90) color = RCOLOR(255, 255, 255, 105); else if(counter >= 105 && counter <= 120) color = RCOLOR(255, 255, 255, 105); if(counter >= 120) { counter = 0; remove_anim_flags_on_sprite(stman, MRECOVER); } } if((int)stman->shape->body->p.x != 50 && start && y+height >= ground->sdata.y && !(stman->sdata.animflags & MDAMAGED)) { stman->shape->body->p.x = 70; } add_element_to_render_queue(stman->sdata.currentimg->image, stman->sdata.x+cx, stman->sdata.y+cy, nflags, color, NULL); stman->sdata.x = stman->shape->body->p.x-stman->sdata.currentimg->width/2; stman->sdata.y = stman->shape->body->p.y-stman->sdata.currentimg->height/2; }
// Updates the background image void update_background(void) { SPRITESPTR background = search_sprite_list_for_element("BACKGROUND"); add_element_to_render_queue(background->sdata.currentimg->image, background->sdata.x, background->sdata.y, 0, RDEFAULT, NULL); }