void AFP::MapParser::addBackgroundLayers(std::vector <SceneNode*>& sceneLayers, SceneNode& spriteGraph, const sf::FloatRect worldBounds) { /// Initialize the different tiling backround layers for (int i = 0; i < mMap.GetNumImageLayers(); ++i) { SceneNode::Ptr layer(new SceneNode(Category::None)); sceneLayers.push_back(layer.get()); /// Add background layers to spritegraph spriteGraph.attachChild(std::move(layer)); const Tmx::ImageLayer* imageLayer = mMap.GetImageLayer(i); const Tmx::PropertySet layerProperties = imageLayer->GetProperties(); if (layerProperties.HasProperty("repeat") && layerProperties.GetLiteralProperty("repeat") == "true") { /// Set backround texture to be tiled sf::Texture& texture = mTextures.get(imageLayer->GetName()); sf::IntRect textureRect(worldBounds); texture.setRepeated(true); /// Make the texture as big as the world bounds std::unique_ptr<SpriteNode> backgroundSprite( new SpriteNode(texture, textureRect)); backgroundSprite->setPosition( worldBounds.left, worldBounds.top); sceneLayers.back()->attachChild(std::move(backgroundSprite)); } else if (layerProperties.HasProperty("repeatVertical") && layerProperties.GetLiteralProperty("repeatVertical") == "true") { /// Tile texture vertically sf::Texture& texture = mTextures.get(imageLayer->GetName()); sf::IntRect textureRect(0.f, 0.f, worldBounds.width, texture.getSize().y); texture.setRepeated(true); std::unique_ptr<SpriteNode> backgroundSprite( new SpriteNode(texture, textureRect)); if (!layerProperties.HasProperty("height")) { throw std::runtime_error("World::buildScene(): Missing property" " height from vertical image layer!"); } /// Set tiled image to the correct height. In tiled the height is /// set as the number of pixels from the bottom int height = layerProperties.GetNumericProperty("height"); backgroundSprite->setPosition( worldBounds.left, mMap.GetHeight() * mMap.GetTileHeight() - height - texture.getSize().y); sceneLayers.back()->attachChild(std::move(backgroundSprite)); } } }