140 lines
3.9 KiB
C++
140 lines
3.9 KiB
C++
#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<std::string> normal, std::vector<std::string> 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<int>(data["pos"]);
|
|
if (ImgOffset > m_tileY)
|
|
m_tileY = ImgOffset;
|
|
std::string path = std::get<std::string>(data["path"]);
|
|
int index = std::get<int>(data["idx"]);
|
|
// 如果是个空地板 给他默认赋值
|
|
if (path == "")
|
|
path = "sprite/character/common/circlecooltime.img";
|
|
|
|
// 构造纹理标识符
|
|
ImgKey key = {path, index};
|
|
// 判断是否存在标识符对应的纹理,如果不存在则创建
|
|
if (m_imgMap.find(key) == m_imgMap.end())
|
|
{
|
|
RefPtr<Sprite> 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<int>(data["pos"]);
|
|
if (ImgOffset > m_tileY)
|
|
m_tileY = ImgOffset;
|
|
std::string path = std::get<std::string>(data["path"]);
|
|
int index = std::get<int>(data["idx"]);
|
|
// 如果是个空地板 给他默认赋值
|
|
if (path == "")
|
|
path = "sprite/character/common/circlecooltime.img";
|
|
|
|
// 构造纹理标识符
|
|
ImgKey key = {path, index};
|
|
// 判断是否存在标识符对应的纹理,如果不存在则创建
|
|
if (m_imgMap.find(key) == m_imgMap.end())
|
|
{
|
|
RefPtr<Sprite> 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();
|
|
}
|