#include "map.h" struct platform_t { int x; int y; int w; int h; bool enter_from_left; bool enter_from_right; bool enter_from_top; bool enter_from_bottom; int r; int g; int b; int a; }; Map::Map() { add_collision(-6, 0, GAME_WIDTH, left, 1); add_collision(GAME_WIDTH+6, 0, GAME_WIDTH, right, 1); FILE* f = fopen("../maps/bigmap.txt", "r"); char* mapbuf = (char*) malloc(MAP_WIDTH*(MAP_HEIGHT-1)*sizeof(char)); for (int i=0; i::iterator it; switch (dir) { case up: it = up_collisions.begin(); for (; it!=up_collisions.end(); it++) { if (it->axis < axis) break; } up_collisions.insert(it, {axis, lower, upper, type}); break; case down: it = down_collisions.begin(); for (; it!=down_collisions.end(); it++) { if (it->axis > axis) break; } down_collisions.insert(it, {axis, lower, upper, type}); break; case left: it = left_collisions.begin(); for (; it!=left_collisions.end(); it++) { if (it->axis < axis) break; } left_collisions.insert(it, {axis, lower, upper, type}); break; case right: it = right_collisions.begin(); for (; it!=right_collisions.end(); it++) { if (it->axis > axis) break; } right_collisions.insert(it, {axis, lower, upper, type}); break; } } void Map::check_collisions(mob_t* mob, int x_next, int y_next) { if (x_next < mob->x) { for (list::iterator it=left_collisions.begin(); it!=left_collisions.end(); it++) { if (it->axis > mob->x) continue; if (it->axis < x_next) break; if ((mob->y+mob->h > it->lower) && (mob->y < it->upper)) { // We have a collision! if (it->type == 0) { x_next = it->axis; mob->x_vel = 0; } else if (it->type == 1) { x_next = GAME_WIDTH-mob->w/2; } break; } } } else if (x_next > mob->x) { for (list::iterator it=right_collisions.begin(); it!=right_collisions.end(); it++) { if (it->axis < mob->x+mob->w) continue; if (it->axis > x_next+mob->w) break; if ((mob->y+mob->h > it->lower) && (mob->y < it->upper)) { // We have a collision! if (it->type == 0) { x_next = it->axis - mob->w; mob->x_vel = 0; } else if (it->type == 1) { x_next = -mob->w/2; } break; } } } mob->x = x_next; if (y_next < mob->y) { for (list::iterator it=up_collisions.begin(); it!=up_collisions.end(); it++) { if (it->axis > mob->y) continue; if (it->axis < y_next) break; if ((mob->x+mob->w > it->lower) && (mob->x < it->upper)) { // We have a collision! if (it->type == 0) { y_next = it->axis; mob->y_vel = 0; } else if (it->type == 1) { y_next = GAME_HEIGHT-mob->h/2-1; } break; } } } else if (y_next > mob->y) { for (list::iterator it=down_collisions.begin(); it!=down_collisions.end(); it++) { if (it->axis < mob->y+mob->h) continue; if (it->axis > y_next+mob->h) break; if ((mob->x+mob->w > it->lower) && (mob->x < it->upper)) { // We have a collision! if (it->type == 0) { y_next = it->axis - mob->h; mob->y_vel = 0; } else if (it->type == 1) { y_next = 1 - mob->h/2; } break; } } } mob->y = y_next; } void Map::render(Texture* buffer) { blitTexture(bg, buffer, NULL, NULL); }