Я создал свой собственный 2D-движок, и вместо того, чтобы создавать традиционную карту тайлов, я нарисовал большое изображение на сетке 16x16, а затем экспортировал набор тайлов и карту тайлов.Из-за этого у меня большое количество уникальных плиток.Моя проблема в том, что мой движок неправильно обрабатывает плитки с тремя цифрами в TID. Вот изображение окна игры .
Я думаю, что моя проблема где-то в map.cpp, но я не уверен, где я ошибся.
Здесьмоя карта тайла:
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
00,00,00,00,00,01,02,03,04,00,06,07,08,09,00,00
00,00,00,10,11,12,13,14,15,16,17,18,19,20,00,00
00,00,31,21,22,23,24,25,26,23,27,28,29,30,00,00
00,00,32,33,22,23,24,25,26,23,27,28,23,34,00,00
00,00,35,36,22,23,24,25,26,23,27,28,23,37,38,00
39,40,41,42,22,43,44,45,46,47,48,28,23,49,50,51
52,53,54,55,22,56,57,58,59,60,61,62,63,64,65,66
00,00,00,67,68,69,70,71,72,73,74,75,76,77,78,00
00,00,00,79,80,81,82,83,84,85,86,87,88,89,00,00
90,91,92,93,94,95,96,97,98,99,100,00,00,00,00,00
101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116
00,00,00,00,117,118,119,120,121,00,00,00,00,00,00,00
00,00,00,00,122,123,124,125,126,00,00,00,00,00,00,00
Вот моя карта map.cpp:
#include "map.h"
#include "TextureManager.h"
#include "Game.h"
#include <fstream>
#include "ECS.h"
#include "Components.h"
//we will have manager object which is defined in Game.cpp
extern Manager manager;
//constructor. implementation of map.h
Map::Map(std::string tID, int ms, int ts) : texID(tID), mapScale(ms), tileSize(ts)
{
scaledSize = ms * ts;
}
Map::~Map()
{
}
void Map::LoadMap(std::string path, int sizeX, int sizeY)
{
char c;
//object to store file we're loading
std::fstream mapFile;
mapFile.open(path);
int srcX, srcY;
//parse. loops to move-through size of file and make tile for each character
for (int y = 0; y < sizeY; ++y)
{
//for each column, we'll move thru file
for (int x = 0; x < sizeX; x++)
{
mapFile.get(c);
srcY = atoi(&c) * tileSize;
mapFile.get(c);
srcX = atoi(&c) * tileSize;
//convert char to int
//scale up to 64x64
AddTile(srcX, srcY, x * scaledSize, y * scaledSize);
//skip comma
mapFile.ignore();
}
}
mapFile.ignore();
for (int y = 0; y < sizeY; y++)
{
for (int x = 0; x < sizeX; x++)
{
//checks mapFile to see if collider layer is 1 or 0
mapFile.get(c);
if (c == '1')
{
//add collider
auto& tcol(manager.addEntity());
tcol.addComponent<ColliderComponent>("terrain", x * scaledSize, y * scaledSize, scaledSize);
tcol.addGroup(Game::groupColliders);
}
//if zero, we still should ignore
mapFile.ignore();
}
}
mapFile.close();
}
void Map::AddTile(int srcX, int srcY, int xpos, int ypos)
{
auto& tile(manager.addEntity());
tile.addComponent<TileComponent>(srcX, srcY, xpos, ypos, tileSize, mapScale, texID);
tile.addGroup(Game::groupMap);
}
Фрагменты моего game.cpp, которые имеют отношение:
assets->AddTexture("terrain", "Assets/env_1.png");
map = new Map("terrain", 2, 32);
map->LoadMap("Assets/env_1.map", 16, 16);