SFML и C++ Уроки \ Разработка игр › Форумы › SFML Graphics › урок 22
В этой теме 12 ответов, 4 участника, последнее обновление Alex 7 года/лет, 9 мес. назад.
-
АвторСообщения
-
в строке std:: vector<sf:: Recd<int>>subRects; выдает ошибку???
Опечатка
sf::Recd (d = t)std:: vector<sf:: Recd(d=t)subRects; так должно получиться?
std:: vector<sf:: Rect и далее
безрезультатно на все строки где есть subRects выдает ошибку??? если закоментирую эти строки то запускается урок но вместо карты непонятные рисунки,но все остальное работает
lol 😀
std::vector<sf::Rect<int>> subRects;
все исправил std::vector<sf::Rect<int>> subRects; строка все ровно не работает и выдает ошибку, думаю, пробую, возможно из за того что компилитор code bloks есть какие то дополнительные проблемы…как найду решение напишу
может в include не дописал?
Просто чтоб не танцевать вокруг да около, нужно выкладывать чуть больше кода.
Отредактировано.
Причина: Пользуйтесь вставкой кода на сайте.C++123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346#ifndef LEVEL_H#define LEVEL_H#include <map>#include <SFML/Graphics.hpp>#include <iostream>#include "TinyXML/tinyxml.h"#include <string>#include <vector>struct Object{int GetPropertyInt(std::string name);//номер свойства объекта в нашем спискеfloat GetPropertyFloat(std::string name);std::string GetPropertyString(std::string name);std::string name;//объявили переменную name типа stringstd::string type;//а здесь переменную type типа stringsf::Rect<float> rect;//тип Rect с нецелыми значениямиstd::map<std::string, std::string> properties;//создаём ассоциатиный массив. ключ - строковый тип, значение - строковыйsf::Sprite sprite;//объявили спрайт};struct Layer//слои{int opacity;//непрозрачность слояstd::vector<sf::Sprite> tiles;//закидываем в вектор тайлы};class Level//главный класс - уровень{public:bool LoadFromFile(std::string filename);//возвращает false если не получилось загрузитьObject GetObject(std::string name);std::vector<Object> GetObjects(std::string name);//выдаем объект в наш уровеньstd::vector<Object> GetAllObjects();//выдаем все объекты в наш уровеньvoid Draw(sf::RenderWindow &window);//рисуем в окноsf::Vector2i GetTileSize();//получаем размер тайлаprivate:int width, height, tileWidth, tileHeight;//в tmx файле width height в начале,затем размер тайлаint firstTileID;//получаем айди первого тайлаsf::Rect<float> drawingBounds;//размер части карты которую рисуемsf::Texture tilesetImage;//текстура картыstd::vector<Object> objects;//массив типа Объекты, который мы создалиstd::vector<Layer> layers;};///////////////////////////////////////int Object::GetPropertyInt(std::string name)//возвращаем номер свойства в нашем списке{return atoi(properties[name].c_str());}float Object::GetPropertyFloat(std::string name){return strtod(properties[name].c_str(), NULL);}std::string Object::GetPropertyString(std::string name)//получить имя в виде строки.вроде понятно{return properties[name];}bool Level::LoadFromFile(std::string filename)//двоеточия-обращение к методам класса вне класса{TiXmlDocument levelFile(filename.c_str());//загружаем файл в TiXmlDocument// загружаем XML-картуif (!levelFile.LoadFile())//если не удалось загрузить карту{std::cout << "Loading level \"" << filename << "\" failed." << std::endl;//выдаем ошибкуreturn false;}// работаем с контейнером mapTiXmlElement *map;map = levelFile.FirstChildElement("map");// пример карты: <map version="1.0" orientation="orthogonal"// width="10" height="10" tilewidth="34" tileheight="34">width = atoi(map->Attribute("width"));//извлекаем из нашей карты ее свойстваheight = atoi(map->Attribute("height"));//те свойства, которые задавали при работе вtileWidth = atoi(map->Attribute("tilewidth"));//тайлмап редактореtileHeight = atoi(map->Attribute("tileheight"));// Берем описание тайлсета и идентификатор первого тайлаTiXmlElement *tilesetElement;tilesetElement = map->FirstChildElement("tileset");firstTileID = atoi(tilesetElement->Attribute("firstgid"));// source - путь до картинки в контейнере imageTiXmlElement *image;image = tilesetElement->FirstChildElement("image");std::string imagepath = image->Attribute("source");// пытаемся загрузить тайлсетsf::Image img;if (!img.loadFromFile(imagepath)){std::cout << "Failed to load tile sheet." << std::endl;//если не удалось загрузить тайлсет-выводим ошибку в консольreturn false;}img.createMaskFromColor(sf::Color(255, 255, 255));//для маски цвета.сейчас нет маскиtilesetImage.loadFromImage(img);tilesetImage.setSmooth(false);//сглаживание// получаем количество столбцов и строк тайлсетаint columns = tilesetImage.getSize().x / tileWidth;int rows = tilesetImage.getSize().y / tileHeight;// вектор из прямоугольников изображений (TextureRect)std::vector<sf::Rect<int>> subRects;for (int y = 0; y < rows; y++)for (int x = 0; x < columns; x++){sf::Rect<int> rect;rect.top = y * tileHeight;rect.height = tileHeight;rect.left = x * tileWidth;rect.width = tileWidth;subRects.push_back(rect);}// работа со слоямиTiXmlElement *layerElement;layerElement = map->FirstChildElement("layer");while (layerElement){Layer layer;// если присутствует opacity, то задаем прозрачность слоя, иначе он полностью непрозраченif (layerElement->Attribute("opacity") != NULL){float opacity = strtod(layerElement->Attribute("opacity"), NULL);layer.opacity = 255 * opacity;}else{layer.opacity = 255;}// контейнер <data>TiXmlElement *layerDataElement;layerDataElement = layerElement->FirstChildElement("data");if (layerDataElement == NULL){std::cout << "Bad map. No layer information found." << std::endl;}// контейнер <tile> - описание тайлов каждого слояTiXmlElement *tileElement;tileElement = layerDataElement->FirstChildElement("tile");if (tileElement == NULL){std::cout << "Bad map. No tile information found." << std::endl;return false;}int x = 0;int y = 0;while (tileElement){int tileGID = atoi(tileElement->Attribute("gid"));int subRectToUse = tileGID - firstTileID;// Устанавливаем TextureRect каждого тайлаif (subRectToUse >= 0){sf::Sprite sprite;sprite.setTexture(tilesetImage);sprite.setTextureRect(subRects[subRectToUse]);sprite.setPosition(x * tileWidth, y * tileHeight);sprite.setColor(sf::Color(255, 255, 255, layer.opacity));layer.tiles.push_back(sprite);//закидываем в слой спрайты тайлов}tileElement = tileElement->NextSiblingElement("tile");x++;if (x >= width){x = 0;y++;if (y >= height)y = 0;}}layers.push_back(layer);layerElement = layerElement->NextSiblingElement("layer");}// работа с объектамиTiXmlElement *objectGroupElement;// если есть слои объектовif (map->FirstChildElement("objectgroup") != NULL){objectGroupElement = map->FirstChildElement("objectgroup");while (objectGroupElement){// контейнер <object>TiXmlElement *objectElement;objectElement = objectGroupElement->FirstChildElement("object");while (objectElement){// получаем все данные - тип, имя, позиция, и тдstd::string objectType;if (objectElement->Attribute("type") != NULL){objectType = objectElement->Attribute("type");}std::string objectName;if (objectElement->Attribute("name") != NULL){objectName = objectElement->Attribute("name");}int x = atoi(objectElement->Attribute("x"));int y = atoi(objectElement->Attribute("y"));int width, height;sf::Sprite sprite;sprite.setTexture(tilesetImage);sprite.setTextureRect(sf::Rect<int>(0, 0, 0, 0));sprite.setPosition(x, y);if (objectElement->Attribute("width") != NULL){width = atoi(objectElement->Attribute("width"));height = atoi(objectElement->Attribute("height"));}else{width = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].width;height = subRects[atoi(objectElement->Attribute("gid")) - firstTileID].height;sprite.setTextureRect(subRects[atoi(objectElement->Attribute("gid")) - firstTileID]);}// экземпляр объектаObject object;object.name = objectName;object.type = objectType;object.sprite = sprite;sf::Rect <float> objectRect;objectRect.top = y;objectRect.left = x;objectRect.height = height;objectRect.width = width;object.rect = objectRect;// "переменные" объектаTiXmlElement *properties;properties = objectElement->FirstChildElement("properties");if (properties != NULL){TiXmlElement *prop;prop = properties->FirstChildElement("property");if (prop != NULL){while (prop){std::string propertyName = prop->Attribute("name");std::string propertyValue = prop->Attribute("value");object.properties[propertyName] = propertyValue;prop = prop->NextSiblingElement("property");}}}objects.push_back(object);objectElement = objectElement->NextSiblingElement("object");}objectGroupElement = objectGroupElement->NextSiblingElement("objectgroup");}}else{std::cout << "No object layers found..." << std::endl;}return true;}Object Level::GetObject(std::string name){// только первый объект с заданным именемfor (int i = 0; i < objects.size(); i++)if (objects[i].name == name)return objects[i];}std::vector<Object> Level::GetObjects(std::string name){// все объекты с заданным именемstd::vector<Object> vec;for (int i = 0; i < objects.size(); i++)if (objects[i].name == name)vec.push_back(objects[i]);return vec;}std::vector<Object> Level::GetAllObjects(){return objects;};sf::Vector2i Level::GetTileSize(){return sf::Vector2i(tileWidth, tileHeight);}void Level::Draw(sf::RenderWindow &window){// рисуем все тайлы (объекты не рисуем!)for (int layer = 0; layer < layers.size(); layer++)for (int tile = 0; tile < layers[layer].tiles.size(); tile++)window.draw(layers[layer].tiles[tile]);}#endifAlex, если у тебя ругается вот на такого типа строки: std::vector<sf::Rect<int>>, и ты используешь не с++11, то я знаю что у тебя за ошибка.
Нужно писать вот так: std::vector<sf::Rect<int> >, то есть ставить пробел между закрывающимися угловыми скобками.спасибо заработало,ошибку уже не выдает
всем спасибо за помощь, заработал код наконец то
-
АвторСообщения
Для ответа в этой теме необходимо авторизоваться.