glm::dvec3 Ellipsoid::cartesianSurfacePosition(const Geodetic2& geodetic2) const { // Position on surface : height = 0 return cartesianPosition(Geodetic3({ geodetic2, 0 })); }
Level::Level(const std::string& fileName) { // Load the spritesheet // TODO(Marzena): Maybe don't make it hard coded like this, so different levels can have different sprite sheets. _wallSprites.init("Textures/IsoWalls.png", 8, 8); _dungeonSprites.init("Textures/DungeonTiles.png", 8, 4); //Load the file std::ifstream file; file.open(fileName); //Error check if (file.fail()) { errors::fatalError("Failed to open " + fileName + "!"); } //Ignore the first string in tmpVar std::string tmpVar; file >> tmpVar >> _numHumans; //Throw away the rest of the first line std::getline(file, tmpVar); //Read the base layer of level data while (std::getline(file, tmpVar)) { charLevelFile[0].push_back(tmpVar); _levelData[0].emplace_back(tmpVar.size()); } // Set up top layer of tiles _levelData[1].resize(_levelData[0].size()); // Initialize each row for (size_t i = 0; i < _levelData[1].size(); i++) { _levelData[1][i].resize(_levelData[0][0].size()); } // Generate top layer here generateUpperLayer(); //Set up texture coordinate glm::vec4 uvRect(0.0f, 0.0f, 1.0f, 1.0f); //Set color <- enhance your engine, add color there instead! Color4 colorWhite; colorWhite.r = 255; colorWhite.g = 255; colorWhite.b = 255; colorWhite.a = 255; //Render all the tiles for (int z = 0; z < NUM_LAYERS; z++) { std::vector<std::vector<Tile>>& layerData = _levelData[z]; SpriteBatch& spriteBatch = _spriteBatch[z]; //Initialize SpriteBatch spriteBatch.init(); spriteBatch.begin(GlyphSortType::BACK_TO_FRONT); for (int y = 0; y < layerData.size(); y++) { for (int x = 0; x < layerData[y].size(); x++) { //Grab the tile char tileChar = charLevelFile[z][y][x]; Tile& tile = layerData[y][x]; const float TILE_SCALE = 2.0f; const float TILE_OFFSET = TILE_WIDTH * TILE_SCALE * 0.5f; glm::vec2 cartesianPosition(x * TILE_WIDTH + TILE_WIDTH, y * TILE_WIDTH + TILE_WIDTH); glm::vec2 isoPosition = utils::cartToIso(cartesianPosition); // Offset for layer isoPosition.y += z * TILE_WIDTH * TILE_SCALE; //Get dest rect glm::vec4 destRect(isoPosition.x - TILE_OFFSET, isoPosition.y - TILE_OFFSET, TILE_WIDTH * TILE_SCALE, TILE_WIDTH * TILE_SCALE); // Calculate depth using the Y screen position and the floor number float depth = isoPosition.y; //+ (NUM_LAYERS - z + 1) * DEPTH_PER_LAYER; //Process the tile switch (tileChar) { case 'R': spriteBatch.draw(destRect, _wallSprites.getUvRect(1, 1), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(1, 1); break; case 'P': spriteBatch.draw(destRect, _wallSprites.getUvRect(0, 1), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(0, 1); break; case 'L': spriteBatch.draw(destRect, _wallSprites.getUvRect(2, 1), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(2, 1); break; case '@': tile.isCollider = false; _startPlayerPos.x = x * TILE_WIDTH; _startPlayerPos.y = y * TILE_WIDTH; break; case 'Z': spriteBatch.draw(destRect, _dungeonSprites.getUvRect(0, 0), _dungeonSprites.getTexture().id, depth, colorWhite); _enemyStartPos.emplace_back(x * TILE_WIDTH, y * TILE_WIDTH); tile.setTextureOffset(0, 0); tile.isCollider = false; break; case ':': //Quest giver tile.isCollider = false; spriteBatch.draw(destRect, _dungeonSprites.getUvRect(0, 0), _dungeonSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(0, 0); _qGiverStartPos.x = x * TILE_WIDTH; _qGiverStartPos.y = y * TILE_WIDTH; break; case ';': //Boss tile.isCollider = false; spriteBatch.draw(destRect, _dungeonSprites.getUvRect(0, 0), _dungeonSprites.getTexture().id, isoPosition.y, colorWhite); tile.setTextureOffset(0, 0); _bossStartPos.x = x * TILE_WIDTH; _bossStartPos.y = y * TILE_WIDTH; break; case '!': //Ranged boss tile.isCollider = false; spriteBatch.draw(destRect, _dungeonSprites.getUvRect(0, 0), _dungeonSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(0, 0); _rangedBossStartPos.x = x * TILE_WIDTH; _rangedBossStartPos.y = y * TILE_WIDTH; break; case '.': spriteBatch.draw(destRect, _dungeonSprites.getUvRect(0, 0), _dungeonSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(0, 0); tile.isCollider = false; break; case '1': //Door spriteBatch.draw(destRect, _wallSprites.getUvRect(5, 1), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(5, 1); tile.isCollider = false; break; case '2': spriteBatch.draw(destRect, _wallSprites.getUvRect(6, 1), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(6, 1); tile.isCollider = false; break; case '3': spriteBatch.draw(destRect, _wallSprites.getUvRect(3, 1), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(3, 1); tile.isCollider = false; break; case '4': spriteBatch.draw(destRect, _wallSprites.getUvRect(4, 1), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(4, 1); tile.isCollider = false; break; case ',': // Top of pillar spriteBatch.draw(destRect, _wallSprites.getUvRect(0, 0), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(0, 0); break; case '[': // Wall facing right top spriteBatch.draw(destRect, _wallSprites.getUvRect(1, 0), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(1, 0); break; case ']': // Wall facing left top spriteBatch.draw(destRect, _wallSprites.getUvRect(2, 0), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(2, 0); break; case '<': // Door Top spriteBatch.draw(destRect, _wallSprites.getUvRect(5, 0), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(5, 0); break; case '>': // Door Top spriteBatch.draw(destRect, _wallSprites.getUvRect(6, 0), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(6, 0); break; case '|': // Door Top spriteBatch.draw(destRect, _wallSprites.getUvRect(3, 0), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(3, 0); break; case '/': // Door Top spriteBatch.draw(destRect, _wallSprites.getUvRect(4, 0), _wallSprites.getTexture().id, depth, colorWhite); tile.setTextureOffset(4, 0); break; default: //std::printf("Unexpected symbol %c at (%d, %d)", tile, x, y); break; } } } spriteBatch.end(); } // Dont need this anymore charLevelFile[0].clear(); charLevelFile[1].clear(); }