TileMap::TileMap(Game& world, TextureManager& textureManager, const TMX& tmx) : BaseGameEntity(world, b2BodyDef()) , mWorld(world) , mTextures() , mpCollider(nullptr) , mpNavGraph(nullptr) , mDrawFlags(0) , mCellSpaceNeighborhoodRange(1) , mpCellSpacePartition(nullptr) { setDrawOrder(std::numeric_limits<int>::max()); std::vector<std::vector<sf::VertexArray>> layers; tmx.makeVertices(textureManager, mTextures, layers); for (auto it = layers.begin(); it != layers.end(); ++it) { int index = it - layers.begin(); if (it->size() != mTextures.size()) { throw std::runtime_error("Texture and layer component counts are inconsistent."); } auto pLayer = std::make_unique<Layer>(mWorld, std::move(*it), mTextures); pLayer->setDrawOrder(index); attachNode(std::move(pLayer)); } const sf::Transform& transform = getWorld().getPixelToWorldTransform(); mpCollider = std::unique_ptr<CompositeCollider>(tmx.makeCollider(transform)); mpNavGraph = std::unique_ptr<NavGraph>(tmx.makeNavGraph(transform)); mCellSpaceNeighborhoodRange = calculateAverageGraphEdgeLength(*mpNavGraph) + 1; mpCellSpacePartition = std::make_unique<NavCellSpace>((float)tmx.getTileWidth() / tmx.getWidth(), (float)tmx.getTileHeight() * tmx.getHeight(), tmx.getWidth() / 4, tmx.getHeight() / 4, mpNavGraph->numNodes()); TileMap::NavGraph::ConstNodeIterator nodeIter(*mpNavGraph); for (const TileMap::NavGraph::Node* pNode = nodeIter.begin(); !nodeIter.end(); pNode = nodeIter.next()) { mpCellSpacePartition->addEntity(pNode); } std::vector<b2Fixture*> fixtures; mpCollider->createFixtures(getBody(), fixtures); }
void ZeldaGame::loadMap(const std::string& fileName) { TMX tmx(fileName); TMX::Object* pPlayer = nullptr; int playerSortOrder = 0; std::vector<TMX::ObjectGroup> objectGroups = tmx.getObjectGroups(); for (auto& objectGroup : objectGroups) { for (auto& object : objectGroup.objects) { if (object.name == "Player") { if (pPlayer != nullptr) { throw std::runtime_error("Multiple Player objects found."); } pPlayer = &object; playerSortOrder = objectGroup.index; } } } if (pPlayer == nullptr) { throw std::runtime_error("No Player object found."); } auto upPlayer = Player::make(*this, *pPlayer); upPlayer->setDrawOrder(playerSortOrder); mPlayerID = upPlayer->getID(); getSceneGraph().attachNode(std::move(upPlayer)); mpCamera = std::make_unique<Camera>(getEntityManager(), mPlayerID, sf::Vector2f(16 * 24.f, 9 * 24.f)); setTileMap(TileMap::make(*this, getTextureManager(), std::move(tmx))); getMap().setDrawColliderEnabled(true); getMap().setDrawNavGraphEnabled(true); // TODO: DELETE SECOND MAP auto upMap2 = TileMap::make(*this, getTextureManager(), TMX{fileName}); upMap2->setDrawColliderEnabled(true); upMap2->setDrawNavGraphEnabled(true); getMap().stitch(sf::Vector2i{ 0, 0 }, *upMap2, sf::Vector2i{ 0, 20 }); auto* pMap = upMap2.get(); getMap().attachNode(std::move(upMap2)); auto upMap3 = TileMap::make(*this, getTextureManager(), TMX{fileName}); pMap->stitch({ 0, 0 }, *upMap3, { 30, 0 }); getMap().attachNode(std::move(upMap3)); //getMap().move({ -4, 0 }); }
/** * Copies all attributes (layer, block, color, line weight, line style) from the given entity. */ void REntity::copyAttributesFrom(REntity* entity, bool copyBlockId) { if (entity==NULL) { qWarning("REntity::copyAttributesFrom: source entity is NULL"); return; } if (getDocument()!=entity->getDocument()) { qWarning("REntity::copyAttributesFrom: source entity not from same document"); //RDebug::printBacktrace(); return; } setLayerId(entity->getLayerId()); if (copyBlockId) { setBlockId(entity->getBlockId()); } setColor(entity->getColor()); setLineweight(entity->getLineweight()); setLinetypeId(entity->getLinetypeId()); setLinetypeScale(entity->getLinetypeScale()); setDrawOrder(entity->getDrawOrder()); }