void Map::getPlatformDimensions (int gridX, int startTraceGridY, int *start, int *end) const { const int endTraceGridY = startTraceGridY + 1; if (gridX > 0) { IEntity *hit = nullptr; trace(gridX, startTraceGridY, 0, startTraceGridY, &hit); int leftGridX = 0; if (hit && hit->isSolid()) { MapTile *mapTile = static_cast<MapTile*>(hit); leftGridX = mapTile->getGridX() + mapTile->getGridWidth(); } int startTraceGridX = gridX; const int steps = startTraceGridX - leftGridX; for (int i = 0; i < steps; ++i) { const b2Vec2 startV(startTraceGridX - 0.5f, startTraceGridY + 0.5f); const b2Vec2 endV(startTraceGridX - 0.5f, endTraceGridY + 0.2f); const bool state = trace(startV, endV, &hit); if (state && hit && hit->isSolid()) { --startTraceGridX; continue; } break; } *start = startTraceGridX; } else { IEntity *hit = nullptr; const b2Vec2 startV(0, startTraceGridY); const b2Vec2 endV(0, startTraceGridY + 0.0001f); const bool state = trace(startV, endV, &hit); if (state && hit && hit->isSolid()) return; *start = 0; } if (gridX < _width - 1) { IEntity *hit = nullptr; trace(gridX, startTraceGridY, _width - 1, startTraceGridY, &hit); int rightGridX = _width - 1; if (hit && hit->isSolid()) { MapTile *mapTile = static_cast<MapTile*>(hit); // we always subtract 1 here - not the width - it's the left side rightGridX = mapTile->getGridX() - 1; } int endTraceGridX = gridX; const int steps = rightGridX - endTraceGridX; for (int i = 0; i < steps; ++i) { const b2Vec2 startV(endTraceGridX + 1.5f, startTraceGridY + 0.5f); const b2Vec2 endV(endTraceGridX + 1.5f, endTraceGridY + 0.2f); const bool state = trace(startV, endV, &hit); if (state && hit && hit->isSolid()) { ++endTraceGridX; continue; } break; } *end = endTraceGridX; } else { IEntity *hit = nullptr; const b2Vec2 startV(_width - 1.0f, startTraceGridY); const b2Vec2 endV(_width - 1.0f, startTraceGridY + 0.0001f); const bool state = trace(startV, endV, &hit); if (state && hit && hit->isSolid()) return; *end = _width - 1; } }