Hello again. I've got a question about 2D map rendering. I am rendering a map using verticles and single texture with tiles. This is how the code looks like:
MapRender::Tile::Tile(MapRender &map_render_, std::shared_ptr<MapFile::Tile> file_data_)
: map_render(map_render_)
, file_data(file_data_)
{
verticles.setPrimitiveType(sf::Quads);
verticles.resize(4);
update_verticles();
}
void MapRender::Tile::update_verticles()
{
sf::Vertex *quad = &verticles[0];
int char_x = map_render.game.me->x * 32;
int char_y = map_render.game.me->y * 32;
int x1 = (file_data->x * 32) - char_x;
int y1 = (file_data->y * 32) - char_y;
int x2 = ((file_data->x * 32) - char_x) + 32;
int y2 = ((file_data->y * 32) - char_y) + 32;
quad[0].position = sf::Vector2f(x1, y1);
quad[1].position = sf::Vector2f(x2, y1);
quad[2].position = sf::Vector2f(x2, y2);
quad[3].position = sf::Vector2f(x1, y2);
sf::FloatRect rect = file_data->sprite_rect;
quad[0].texCoords = sf::Vector2f(rect.left, rect.top);
quad[1].texCoords = sf::Vector2f(rect.left + rect.width, rect.top);
quad[2].texCoords = sf::Vector2f(rect.left + rect.width, rect.top + rect.height);
quad[3].texCoords = sf::Vector2f(rect.left, rect.top + rect.height);
}
MapRender::MapRender(MapFile &map_file_, Game &game_)
: map_file(map_file_)
, game(game_)
{
construct();
}
// it's called in the main loop with sf::RenderWindow
void MapRender::draw(sf::RenderTarget &target, sf::RenderStates states) const
{
states.texture = &game.gfx_loader->dir["map/"].tex[map_file.texture_id];
target.draw(tile_verticles, states);
}
void MapRender::process()
{
update_verticles();
}
void MapRender::update_verticles()
{
for(int y = 0; y < map_file.height; ++y)
{
for(int x = 0; x < map_file.width; ++x)
{
tiles[0][x][y]->update_verticles();
for(int i = 0; i < 4; ++i)
tile_verticles[(1 * ((((4 * x) + i) + ((y * map_file.width) * 4))))] = tiles[0][x][y]->verticles[i];
}
}
}
void MapRender::construct()
{
tile_verticles.setPrimitiveType(sf::Quads);
// 1 = amount of layers, 4 = verticles per tile
tile_verticles.resize(1 * ((map_file.width * map_file.height) * 4));
for(int y = 0; y < map_file.height; ++y)
{
for(int x = 0; x < map_file.width; ++x)
{
tiles[0][x][y] = std::shared_ptr<Tile>(new Tile(*this, map_file.tiles[0][x][y]));
tiles[0][x][y]->update_verticles();
for(int i = 0; i < 4; ++i)
tile_verticles[(1 * ((((4 * x) + i) + ((y * map_file.width) * 4))))] = tiles[0][x][y]->verticles[i];
}
}
}
There is a simple character too, the map possition is based on it's coordinates. Everytime I press any arrow key, I set the new character possition and call MapRender::process() to update all the verticles to new possitions. Is there a better way to move the map without updating 10000's of verticles?
I guess it can be done with sf::View but I have no idea how to use it... I have read the tutorial already but there are problems still. Can you give me some hint?