Пример #1
0
/**
* This method loads all of the data for a level from a file. It does not
* render the level, it only parses the file and gathers all of the information
* needed to render the level.
*/
void Level::load(const std::string& file_name)
{
    clearPreviousLevelData();
    this->file_name = file_name;

    DEBUG("Loading level: " << this->file_name);

    tinyxml2::XMLDocument doc;

    if (doc.LoadFile(this->file_name.c_str()) != tinyxml2::XML_SUCCESS)
    {
        SDL_SetError(doc.ErrorName());
        throw Application::Error::XML;
    }

    for (tinyxml2::XMLNode* node = doc.FirstChild(); node; node = node->NextSibling())
    {
        std::string node_name = node->ToElement()->Name();
        if (node_name == "about")
        {
            for (tinyxml2::XMLNode* about_node = node->FirstChild(); about_node; about_node = about_node->NextSibling())
            {
                std::string name = about_node->ToElement()->Name();
                std::string text = about_node->ToElement()->GetText();
                if (name == "title")
                {
                    title = text;
                    DEBUG("Level title: " << title);
                }
                else if (name == "width")
                {
                    width = atoi(text.c_str());
                    DEBUG("Level width: " << width);
                }
                else if (name == "height")
                {
                    height = atoi(text.c_str());
                    DEBUG("Level height: " << height);
                }
            }
        }

        else if (node_name == "level")
        {
            for (tinyxml2::XMLNode* level_node = node->FirstChild(); level_node; level_node = level_node->NextSibling())
            {
                std::string level_node_name = level_node->ToElement()->Name();
                if (level_node_name == "layers")
                {
#ifdef DEBUG_ENABLED
                    int layer_num = 0;
#endif // DEBUG_ENABLED
                    for (tinyxml2::XMLNode* layer_node = level_node->FirstChild(); layer_node; layer_node = layer_node->NextSibling())
                    {
                        std::string layer_node_name = layer_node->ToElement()->Name();
                        if (layer_node_name == "layer")
                        {
                            std::string layer_text = layer_node->ToElement()->GetText();
                            processLayers(layer_text);
                            DEBUG("Layer " << ++layer_num << ":" << std::endl << layer_text);
                        }
                    }
                }

                if (level_node_name == "objects")
                {
                    std::string object_text = level_node->ToElement()->GetText();
                    processObjects(object_text);
                }
            }
        }
    }
}
void Streamer::performPlayerUpdate(Player &player, bool automatic)
{
	Eigen::Vector3f delta = Eigen::Vector3f::Zero(), position = player.position;
	int state = GetPlayerState(player.playerID);
	bool update = true;
	if (automatic)
	{
		player.interiorID = GetPlayerInterior(player.playerID);
		player.worldID = GetPlayerVirtualWorld(player.playerID);
		GetPlayerPos(player.playerID, &player.position[0], &player.position[1], &player.position[2]);
		if (state != PLAYER_STATE_NONE && state != PLAYER_STATE_WASTED)
		{
			if (player.position != position)
			{
				position = player.position;
				Eigen::Vector3f velocity = Eigen::Vector3f::Zero();
				if (state == PLAYER_STATE_ONFOOT)
				{
					GetPlayerVelocity(player.playerID, &velocity[0], &velocity[1], &velocity[2]);
				}
				else if (state == PLAYER_STATE_DRIVER || state == PLAYER_STATE_PASSENGER)
				{
					GetVehicleVelocity(GetPlayerVehicleID(player.playerID), &velocity[0], &velocity[1], &velocity[2]);
				}
				float velocityNorm = velocity.squaredNorm();
				if (velocityNorm >= velocityBoundaries.get<0>() && velocityNorm <= velocityBoundaries.get<1>())
				{
					delta = velocity * averageUpdateTime;
					player.position += delta;
				}
			}
			else
			{
				update = player.updateWhenIdle;
			}
		}
		else
		{
			update = false;
		}
	}
	std::vector<SharedCell> cells;
	if (update)
	{
		core->getGrid()->findAllCells(player, cells);
		if (!cells.empty())
		{
			if (!core->getData()->objects.empty() && player.enabledItems[STREAMER_TYPE_OBJECT] && !IsPlayerNPC(player.playerID))
			{
				processObjects(player, cells);
			}
			if (!core->getData()->checkpoints.empty() && player.enabledItems[STREAMER_TYPE_CP])
			{
				processCheckpoints(player, cells);
			}
			if (!core->getData()->raceCheckpoints.empty() && player.enabledItems[STREAMER_TYPE_RACE_CP])
			{
				processRaceCheckpoints(player, cells);
			}
			if (!core->getData()->mapIcons.empty() && player.enabledItems[STREAMER_TYPE_MAP_ICON] && !IsPlayerNPC(player.playerID))
			{
				processMapIcons(player, cells);
			}
			if (!core->getData()->textLabels.empty() && player.enabledItems[STREAMER_TYPE_3D_TEXT_LABEL] && !IsPlayerNPC(player.playerID))
			{
				processTextLabels(player, cells);
			}
			if (!core->getData()->areas.empty() && player.enabledItems[STREAMER_TYPE_AREA])
			{
				if (!delta.isZero())
				{
					player.position = position;
				}
				processAreas(player, cells);
				if (!delta.isZero())
				{
					player.position += delta;
				}
			}
		}
	}
	if (automatic)
	{
		if (!core->getData()->pickups.empty())
		{
			if (!update)
			{
				core->getGrid()->findMinimalCells(player, cells);
			}
			processPickups(player, cells);
		}
		if (!delta.isZero())
		{
			player.position = position;
		}
		executeCallbacks();
	}
}