Как визуализировать более 99 плиток в 2D движке - PullRequest
0 голосов
/ 02 июля 2019

Я создал свой собственный 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);

1 Ответ

0 голосов
/ 21 июля 2019

Вот что я положил в свой цикл for, который работает:

        //it's y, x. so 13 is y=1, x=3
        getline(mapFile, str, ',');
        int srcIndex = stoi(str);
        int srcY = (srcIndex / 10) * tileSize;
        int srcX = (srcIndex % 10) * tileSize;
        AddTile(srcX, srcY, x * scaledSize, y * scaledSize);
        //skip comma
        mapFile.ignore();
...