Created
February 8, 2021 09:10
-
-
Save digitalbricklayer/d973820566343b24a8b82a907ae2879a to your computer and use it in GitHub Desktop.
Broken sfml tilemap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <SFML/Graphics.hpp> | |
#include <SFML/Window.hpp> | |
#include <string> | |
#include <iostream> | |
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) | |
{ | |
// load the tileset texture | |
if (!m_tileset.loadFromFile(tileset)) | |
return false; | |
// resize the vertex array to fit the level size | |
m_vertices.setPrimitiveType(sf::Quads); | |
m_vertices.resize(width * height * 4); | |
// populate the vertex array, with one quad per tile | |
for (unsigned int i = 0; i < width; ++i) | |
for (unsigned int j = 0; j < height; ++j) | |
{ | |
// get the current tile number | |
const int tileNumber = tiles[i + j * width]; | |
// find its position in the tileset texture | |
int tu = tileNumber % (m_tileset.getSize().x / tileSize.x); | |
int tv = tileNumber / (m_tileset.getSize().x / tileSize.x); | |
// get a pointer to the current tile's quad | |
sf::Vertex* quad = &m_vertices[(i + j * width) * 4]; | |
// define its 4 corners | |
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); | |
// define its 4 texture coordinates | |
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 | |
{ | |
// apply the transform | |
states.transform *= getTransform(); | |
// apply the tileset texture | |
states.texture = &m_tileset; | |
// draw the vertex array | |
target.draw(m_vertices, states); | |
} | |
sf::VertexArray m_vertices; | |
sf::Texture m_tileset; | |
}; | |
int main() | |
{ | |
// create the window | |
sf::RenderWindow window(sf::VideoMode(512, 256), "Tilemap"); | |
window.setVerticalSyncEnabled(true); | |
// define the level with an array of tile indices | |
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, 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, | |
}; | |
// create the tilemap from the level definition | |
TileMap map; | |
if (!map.load("tileset.png", sf::Vector2u(32, 32), level, 32, 16)) | |
return -1; | |
sf::View view(sf::FloatRect (0.f, 0.f, 512.f, 256.f)); | |
window.setView(view); | |
// run the main loop | |
while (window.isOpen()) | |
{ | |
// handle events | |
sf::Event event; | |
while (window.pollEvent(event)) | |
{ | |
if(event.type == sf::Event::Closed) | |
window.close(); | |
switch (event.type) | |
{ | |
case sf::Event::KeyPressed: | |
switch (event.key.code) | |
{ | |
case sf::Keyboard::Down: | |
view.move(0.0f, 32.0f); | |
window.setView(view); | |
break; | |
} | |
break; | |
} | |
} | |
window.clear(); | |
window.draw(map); | |
window.display(); | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment