martes, 31 de marzo de 2015

Mapa de tiles en SFML


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.

No hay comentarios:

Publicar un comentario