double Character::scanDistance(double edge, const Tilemap& map, Direction direction, intVector firstTile, intVector lastTile) { double distance; //indices of tile to be checked int xi; int yi; //to keep track of smallest value int minDist = 1000000; int distIndex; //for each occupied tile, shoot a ray in desired direction //insert smallest value in distance for (int i = firstTile.y; i <= lastTile.y; i++) { for (int j = firstTile.x; j <= lastTile.x; j++) { yi = i; xi = j; distIndex = 0; while ( distIndex < minDist && xi >= 0 && yi >= 0 && xi < map.horiTiles && yi < map.vertiTiles && map.getTile(xi, yi) != 1 ) { switch (direction) { case LEFT: xi--; break; case RIGHT: xi++; break; case UP: yi--; break; case DOWN: yi++; break; } distIndex++; } minDist = min(minDist, distIndex); } } switch (direction) { case LEFT: distance = edge - (xi + 1)*map.tileRes; break; case RIGHT: distance = xi*map.tileRes - edge; break; case UP: distance = edge - (yi + 1)*map.tileRes; break; case DOWN: distance = yi*map.tileRes - edge; break; } return signbit(distance) ? 0.0 : distance; }
bool checkMapCollision(Character& scanner, const Tilemap& map) { int x1 = scanner.rect.x / map.tileRes; int x2 = (scanner.rect.x + scanner.rect.w - 1) / map.tileRes; int y1 = scanner.rect.y / map.tileRes; int y2 = (scanner.rect.y + scanner.rect.h - 1) / map.tileRes; for (int x = x1; x <= x2; x++) { for (int y = y1; y <= y2; y++) { if (x < 0 || x >= map.horiTiles || y < 0 || y >= map.vertiTiles) continue; if (map.getTile(x, y) == 1) return true; } } return false; }