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.
No hay comentarios:
Publicar un comentario