1

レイヤー 1 はオブジェクト、レイヤー 2 はキャラクターなど、ゲームにレベルをロードする方法を教えてください。必要なレイヤーは 3 つだけで、それらはすべて互いに重ねられます。つまり、下のレイヤーの草や土の上に透明な背景を持つ花を配置します。同じファイルからも読み取りたいと思います。どうすればこれを行うことができますか?どんな助けでも大歓迎です。

タイルシートのタイルに対応する数字だけのレベル ファイルからマップを読み込みます。

そして、これがそれを解釈するコードです

void LoadMap(const char *filename, std::vector< std::vector <int> > &map)
{
    std::ifstream openfile(filename); 
    if(openfile.is_open())
    {
        std::string line, value;
        int space;

        while(!openfile.eof())
        {
            std::getline(openfile, line);

            if(line.find("[TileSet]") != std::string::npos)
            {
                state = TileSet;
                continue;
            }
            else if (line.find("[Layer1]") != std::string::npos)
            {
                state = Map;
                continue;
            }

            switch(state)
            {
            case TileSet:
                if(line.length() > 0)
                    tileSet = al_load_bitmap(line.c_str());
                break;
            case Map: 

                std::stringstream str(line);
                std::vector<int> tempVector;

                while(!str.eof())
                {
                    std::getline(str, value, ' ');
                    if(value.length() > 0)
                                 tempVector.push_back(atoi(value.c_str()));
                }
                map.push_back(tempVector);
                break;
            }
        }
    }
    else
    {
  }
  }

これが地図を描く方法です。また、タイル シートは 1280 x 1280 で、tilesizeX と tilesizeY は 64 です。

void DrawMap(std::vector <std::vector <int> > map)
{    
    int mapRowCount = map.size();

    for(int i, j = 0; i < mapRowCount; i ++)
    {
        int mapColCount = map[i].size();

        for (int j = 0; j < mapColCount; ++j)
        {
              int tilesetIndex = map[i][j];
              int tilesetRow = floor(tilesetIndex / TILESET_COLCOUNT);
              int tilesetCol = tilesetIndex % TILESET_COLCOUNT;    
              al_draw_bitmap_region(tileSet, tilesetCol * TileSizeX, tilesetRow * TileSizeY, TileSizeX, TileSizeY, j * TileSizeX, i * TileSizeX, NULL);
        }
    }
}

編集: http://i.imgur.com/Ygu0zRE.jpg

4

1 に答える 1

2

複数の 2 次元配列が必要なようです。

次のようなことを試してください:

unsigned int map[3][8][8];
#define OBJECTS_LAYER 0
#define CHARACTER_LAYER 1
#define FLOWER_ID 2

//...

map[OBJECTS_LAYER][3][4] = FLOWER_ID;

編集 1

OPの説明によると、レイヤーは8 x 8の2次元配列であり、次のように表されます。

unsigned int layer[8][8];

OP のマップには複数のレイヤーがあります。これは、レイヤーのコンテナーに変換されます。
1 つの方法は、配列の別の次元を使用することです。層状のケーキや建物の床によく似ています。

unsigned int map[/* maximum layers */][8 /* from layer above */][8 /* from layer above */];

レイヤー 1 の位置 [3,4] にアクセスするには、式は次のようになります。

map[0][3][4]

C++ ではインデックスは 0 から始まるため、最初のレイヤーのインデックスは 0 です。

建物のフロア 3、行 2、列 7 にアクセスするには、次の命名法を使用します。

empire_state_building[2][1][6]
于 2013-01-25T23:02:29.147 に答える