#include "Tile.h" #include "Tool/Tool_String.h" #include "EngineCore/Game.h" #include "Actor/Map/GameMap.h" #include "Global/Global_Game.h" Tile::Tile(GameMap *parentMap, std::vector normal, std::vector ex) { m_parentMap = parentMap; for (size_t i = 0; i < normal.size(); i++) { InitTile(normal[i], i); } for (size_t i = 0; i < ex.size(); i++) { InitExTile(ex[i], i); } // 有可能没写地板 if (m_BasicTileWidth == 0) m_BasicTileWidth = 224 * normal.size(); // 通过父对象获取地图大小 m_parentMap->_MapLength = m_BasicTileWidth; m_parentMap->_MapHeight = m_BasicTileHeight + m_ExTileHeight; Canvas::Init({(int)m_BasicTileWidth, (int)m_BasicTileHeight + (int)m_ExTileHeight + (int)m_tileY}); DrawTile(); } Tile::~Tile() { } void Tile::InitTile(std::string Path, int Index) { // 读取文件 TileInfo data; InitInfo(Path, data); // 读取信息 float ImgOffset = std::get(data["pos"]); if (ImgOffset > m_tileY) m_tileY = ImgOffset; std::string path = std::get(data["path"]); int index = std::get(data["idx"]); // 如果是个空地板 给他默认赋值 if (path == "") path = "sprite/character/common/circlecooltime.img"; // 构造纹理标识符 ImgKey key = {path, index}; // 判断是否存在标识符对应的纹理,如果不存在则创建 if (m_imgMap.find(key) == m_imgMap.end()) { RefPtr tex = new Sprite(path, index); m_imgMap[key] = tex; } // 横向地板数量增加 m_Tile_X_Count++; // 基础地板宽度增加 m_BasicTileWidth += m_imgMap[key]->GetTexture()->getFrameSize().width; // 取基础地板最高的高度 if (m_imgMap[key]->GetTexture()->getFrameSize().height > m_BasicTileHeight) m_BasicTileHeight = m_imgMap[key]->GetTexture()->getFrameSize().height; DrawInfo info; info.sprite_ = key; info.pos = {Index * 224, ImgOffset}; m_drawQueue.push_back(info); } void Tile::InitExTile(std::string Path, int Index) { // 读取文件 TileInfo data; InitInfo(Path, data); // 读取信息 float ImgOffset = std::get(data["pos"]); if (ImgOffset > m_tileY) m_tileY = ImgOffset; std::string path = std::get(data["path"]); int index = std::get(data["idx"]); // 如果是个空地板 给他默认赋值 if (path == "") path = "sprite/character/common/circlecooltime.img"; // 构造纹理标识符 ImgKey key = {path, index}; // 判断是否存在标识符对应的纹理,如果不存在则创建 if (m_imgMap.find(key) == m_imgMap.end()) { RefPtr tex = new Sprite(path, index); m_imgMap[key] = tex; } // 如果进了这个函数默认有1格 if (m_ExTileHeight == 0) m_ExTileHeight = 120; // Ex地板高度120一格 if (((Index / m_Tile_X_Count) * 120) > m_ExTileHeight) m_ExTileHeight = ((Index / m_Tile_X_Count) * 120); DrawInfo info; info.sprite_ = key; info.pos = {Index * 224, m_tileY + m_BasicTileHeight + ((Index / m_Tile_X_Count) * 120)}; m_drawQueue.push_back(info); } void Tile::InitInfo(std::string Path, TileInfo &m_data) { ScriptData Data = AssetManager::GetInstance().GetScriptInfo(Path); m_data["pos"] = 0; while (!Data.IsEnd()) { std::string Segment = Data.Get(); if (Segment == "[IMAGE]") { std::string PathBuf = Tool_toLowerCase(Data.Get()); m_data["path"] = "sprite/" + PathBuf; m_data["idx"] = std::stoi(Data.Get()); } else if (Segment == "[img pos]") { m_data["pos"] = std::stoi(Data.Get()); } } } void Tile::DrawTile() { BeginDraw(); for (auto &info : m_drawQueue) { m_imgMap[info.sprite_]->SetPosition(info.pos); DrawActor(m_imgMap[info.sprite_]); } EndDraw(); }