Hi guys!
With the code from the book, I tried to create a tiled map with vertex arrays (like there :
http://www.sfml-dev.org/tutorials/2.3/graphics-vertex-array.php).
So I did this :
void World::buildScene()
{
// Initialize the different layers
for (std::size_t i = 0; i < LayerCount; ++i)
{
Category::Type category = (i == LowerAir) ? Category::SceneBackgroundLayer : Category::None;
SceneNode::Ptr layer(new SceneNode(category));
mSceneLayers[i] = layer.get();
mSceneGraph.attachChild(std::move(layer));
}
// Prepare the tiled background
sf::Texture& tilesetTexture = mTextures.get(Textures::Tileset);
int roomHeight = 30;
int roomWidth = 30;
sf::VertexArray _vertices;
_vertices.setPrimitiveType(sf::Quads);
_vertices.resize(30 * 30 * 4);
for(unsigned int y = 0; y < roomHeight; ++y)
for(unsigned int x = 0; x < roomWidth; ++x)
{
unsigned int tileNumber = 5;
unsigned int textureColumn, textureLine;
textureColumn = (tileNumber % 30 == 0) ? 30 : tileNumber % 30;
textureLine = (tileNumber % 30 == 0) ? tileNumber / 30 : tileNumber / 30 + 1;
sf::Vector2u coordTexture;
coordTexture.x = (textureColumn - 1) * (128 + 128);
coordTexture.y = (textureLine - 1) * (128 + 128);
sf::Vertex* quad = &_vertices[(y * 30 + x) * 4];
quad[0].position = sf::Vector2f(x * 128, y * 128);
quad[1].position = sf::Vector2f((x + 1) * 128, y * 128);
quad[2].position = sf::Vector2f((x + 1) * 128 , (y + 1) * 128);
quad[3].position = sf::Vector2f(x * 128, (y + 1) * 128);
quad[0].texCoords = sf::Vector2f(coordTexture.x, coordTexture.y);
quad[1].texCoords = sf::Vector2f(coordTexture.x + 128, coordTexture.y);
quad[2].texCoords = sf::Vector2f(coordTexture.x + 128, coordTexture.y + 128);
quad[3].texCoords = sf::Vector2f(coordTexture.x, coordTexture.y + 128);
}
std::unique_ptr<SpriteNode> tiledBackground(new SpriteNode(tilesetTexture, _vertices));
mSceneLayers[Background]->attachChild(std::move(tiledBackground));
}
And then I modified SpriteNode like that :
class SpriteNode : public SceneNode
{
public:
explicit SpriteNode(const sf::Texture& texture);
SpriteNode(const sf::Texture& texture, const sf::IntRect& textureRect);
SpriteNode(const sf::Texture& texture, sf::VertexArray& vertices);
private:
virtual void drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const;
private:
sf::Sprite mSprite;
sf::VertexArray mVertices;
sf::Texture mTexture;
bool mTiled;
};
SpriteNode::SpriteNode(const sf::Texture& texture)
: mSprite(texture)
, mTiled(false)
{
}
SpriteNode::SpriteNode(const sf::Texture& texture, const sf::IntRect& textureRect)
: mSprite(texture, textureRect)
, mTiled(false)
{
}
SpriteNode::SpriteNode(const sf::Texture& texture, sf::VertexArray& vertices)
: mTexture(texture)
, mVertices(vertices)
, mTiled(true)
{
}
void SpriteNode::drawCurrent(sf::RenderTarget& target, sf::RenderStates states) const
{
if(!mTiled)
target.draw(mSprite, states);
else
{
states.transform *= getTransform();
states.texture = &mTexture;
target.draw(mVertices, states);
}
}
My VertexArray and my Texture are okay, the algorithm (with the 2 for) works in an other code but I'd like to integrate it into this one.
There, when I switch to GameState, I just see a black screen. What is wrong ?
I did put a std::cout in the else of the draw and it is displayed.
Thanks for your help!