예제 #1
0
파일: tile_map.cpp 프로젝트: evinstk/Zelda
	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);
	}
예제 #2
0
	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 });
	}
예제 #3
0
파일: REntity.cpp 프로젝트: seem-sky/qcad
/**
 * 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());
}