From de5a458cb037bb8e1e80c849c5e6525f9413b43a Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Sat, 14 Feb 2015 12:09:41 -0500 Subject: Monitor stuff is looking pretty cool! --- src/map.cpp | 241 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 src/map.cpp (limited to 'src/map.cpp') diff --git a/src/map.cpp b/src/map.cpp new file mode 100644 index 0000000..10cd313 --- /dev/null +++ b/src/map.cpp @@ -0,0 +1,241 @@ +#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*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); +} -- cgit 1.4.1