Descargar Assets para este proyecto
TileMap.h
#include <SFML\Graphics.hpp>
class TileMap : public sf::Drawable, public sf::Transformable
{
public:
bool load(const std::string& tileset, sf::Vector2u tileSize, const int* tiles, unsigned int width, unsigned int height)
{
// Cargamos la textura del tile
if (!m_tileset.loadFromFile(tileset))
return false;
// Establecemos la forma del vertex array y le pasamos el ancho y el alto del tile por la cantidad de tiles que contiene la imagen en este caso 4
m_vertices.setPrimitiveType(sf::Quads);
m_vertices.resize(width * height * 4);
// rellenamos el vertex array con un quad por cada tile
for (unsigned int i = 0; i < width; ++i)
for (unsigned int j = 0; j < height; ++j)
{
// obtenemos el numero de tile actual
int numeroTile = tiles[i + j * width];
// encontramos la posicion del tileset para partirlo
int tu = numeroTile % (m_tileset.getSize().x / tileSize.x);
int tv = numeroTile / (m_tileset.getSize().x / tileSize.x);
// Apuntamos al quad actual mediante un puntero
sf::Vertex* quad = &m_vertices[(i + j * width) * 4];
// definimos las posiciones del quad
quad[0].position = sf::Vector2f(i * tileSize.x, j * tileSize.y);
quad[1].position = sf::Vector2f((i + 1) * tileSize.x, j * tileSize.y);
quad[2].position = sf::Vector2f((i + 1) * tileSize.x, (j + 1) * tileSize.y);
quad[3].position = sf::Vector2f(i * tileSize.x, (j + 1) * tileSize.y);
// definimos las coordenadas del quad
quad[0].texCoords = sf::Vector2f(tu * tileSize.x, tv * tileSize.y);
quad[1].texCoords = sf::Vector2f((tu + 1) * tileSize.x, tv * tileSize.y);
quad[2].texCoords = sf::Vector2f((tu + 1) * tileSize.x, (tv + 1) * tileSize.y);
quad[3].texCoords = sf::Vector2f(tu * tileSize.x, (tv + 1) * tileSize.y);
}
return true;
}
private:
virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const
{
// lo transformamos
states.transform *= getTransform();
// pasamos la textura
states.texture = &m_tileset;
// dibujamos el vertex array
target.draw(m_vertices, states);
}
sf::VertexArray m_vertices;
sf::Texture m_tileset;
};
Main.cpp
#include "TileMap.h"
int main()
{
// Creamos la ventana
sf::RenderWindow window(sf::VideoMode(800, 600), "Tilemap");
// Definimos un arreglo que contendra el numero de tile
const int level[] =
{
0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0,
1, 1, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3,
0, 1, 0, 0, 2, 0, 3, 3, 3, 0, 1, 1, 1, 0, 0, 0,
0, 1, 1, 0, 3, 3, 3, 0, 0, 0, 1, 1, 1, 2, 0, 0,
0, 0, 1, 0, 3, 0, 2, 2, 0, 0, 1, 1, 1, 1, 2, 0,
2, 0, 1, 0, 3, 0, 2, 2, 2, 0, 1, 1, 1, 1, 1, 1,
0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1,
0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1,
0, 0, 1, 0, 3, 2, 2, 2, 0, 0, 0, 0, 1, 1, 1, 1,
};
// Creamos un objeto de tipo Tilemap
TileMap map;
//Mandamos a llamar a la figura con tiles, la cual son de 64 * 64 cada tile y colocaremos tiles 16 horizontales y 10 verticales
//los parametros que pasamos son el nombre de la textura, los tamaños individuales de las texturas
//el arreglo y los indices del arreglo
if (!map.load("tilemap.png", sf::Vector2u(64, 64), level, 16, 10))
return -1;
// Inicia el GameLoop
while (window.isOpen())
{
//ponemos la ventana de color blanco
window.clear( sf :: Color :: White );
//dibujamos el mapa
window.draw(map);
// Evento cerrar
sf::Event event;
while (window.pollEvent(event))
{
if (event.type == sf::Event::Closed)
window.close();
}
window.display();
}
return 0;
}
Practica siempre para ir mejorando, la repetición y la constancia nos ayudan a mejorar, recuerda cada vez lo harás mejor, si te equivocas esta bien, permitirse equivocarse es la clave de mejora continua, así que permítete equivocarte mas seguido.
Si te gusta este sitio y deseas que esto continué vivo tu apoyo sera importante, puedes dar clic en la publicidad si lo deseas o puedes donar algo en Patreon si puedes permitírtelo, con esto el proyecto empezara a tener un objetivo y dejara de navegar sin rumbo y empezara a convertirse en una comunidad que ayudara unos a los otros, saludos y excelente día.
Si te gusta este sitio y deseas que esto continué vivo tu apoyo sera importante, puedes dar clic en la publicidad si lo deseas o puedes donar algo en Patreon si puedes permitírtelo, con esto el proyecto empezara a tener un objetivo y dejara de navegar sin rumbo y empezara a convertirse en una comunidad que ayudara unos a los otros, saludos y excelente día.























