Example #1
0
glm::dvec3 Ellipsoid::cartesianSurfacePosition(const Geodetic2& geodetic2) const
{
    // Position on surface : height = 0
    return cartesianPosition(Geodetic3({ geodetic2, 0 }));
}
Example #2
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();
}