Changeset 75 for trunk/src/map.cpp


Ignore:
Timestamp:
Jul 7, 2010, 2:11:16 AM (10 years ago)
Author:
sam
Message:

Much better resource allocation and release. Scene manager stub.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/map.cpp

    r74 r75  
    88#include "map.h"
    99#include "layer.h"
     10#include "tiler.h"
    1011
    11 Map::Map(char const *path) :
    12     layers(0),
    13     nlayers(0)
     12#define MAX_TILERS 128
     13
     14/*
     15 * Map implementation class
     16 */
     17
     18class MapData
    1419{
     20    friend class Map;
     21
     22private:
     23    int tilers[MAX_TILERS];
     24    int ntilers;
     25    Layer **layers;
     26    int nlayers;
     27};
     28
     29/*
     30 * Public Map class
     31 */
     32
     33Map::Map(char const *path)
     34{
     35    data = new MapData();
     36    data->ntilers = 0;
     37    data->layers = NULL;
     38    data->nlayers = 0;
     39
    1540    char tmp[BUFSIZ];
    16     uint32_t *data = NULL;
    17     int width = 0, height = 0, level = 0, orientation = 0;
    18     int firstgid = 0, ntiles = 0;
     41    int gids[MAX_TILERS];
     42    uint32_t *tiles = NULL;
     43    int width = 0, height = 0, level = 0, orientation = 0, ntiles = 0;
    1944
    2045    FILE *fp = fopen(path, "r");
     
    2954        char a, b;
    3055
     56        /* Read a line, then decide what to do with it. */
    3157        fgets(tmp, BUFSIZ, fp);
    3258
    33         if (data)
     59        if (tiles)
    3460        {
    3561            /* We are in the process of reading layer data. Only stop
     
    3864            while (ntiles < width * height)
    3965            {
    40                 data[ntiles++] = atoi(parser);
     66                uint32_t code = 0;
     67                int id = atoi(parser);
     68                if (id)
     69                {
     70                    for (int n = 0; n < data->ntilers; n++)
     71                    {
     72                        if (id < gids[n])
     73                            continue;
     74                        if (n == data->ntilers - 1
     75                             || id < gids[n + 1])
     76                        {
     77                            code = (data->tilers[n] << 16) | (id - 1);
     78                            break;
     79                        }
     80                    }
     81                }
     82
     83                tiles[ntiles++] = code;
    4184                while (isdigit(*parser))
    4285                    parser++;
     
    4992            if (ntiles == width * height)
    5093            {
    51                 layers[nlayers] = new Layer(width, height, level, data);
    52                 nlayers++;
    53                 data = NULL;
     94                data->layers[data->nlayers] = new Layer(width, height, level, tiles);
     95                data->nlayers++;
     96                tiles = NULL;
    5497            }
    5598        }
    5699        else if (sscanf(tmp, " <tileset firstgid=\"%i\"", &i) == 1)
    57100        {
    58             /* This is a tileset description. Remember its firstgid value. */
    59             firstgid = i;
     101            /* This is a tileset description. Remember its first gid value. */
     102            gids[data->ntilers] = i;
    60103        }
    61104        else if (sscanf(tmp, " <image source=\"%[^\"]\"", str) == 1)
    62105        {
    63106            /* This is a tileset image file. Associate it with firstgid. */
     107            data->tilers[data->ntilers] = Tiler::Register(str);
     108            data->ntilers++;
    64109        }
    65110        else if (sscanf(tmp, " <layer name=\"%c%i%c%*[^\"]\" "
     
    67112        {
    68113            /* This is a layer description. Prepare to read the data. */
    69             layers = (Layer **)realloc(layers,
    70                                        sizeof(Layer **) * (nlayers + 1));
     114            data->layers = (Layer **)realloc(data->layers,
     115                                       sizeof(Layer **) * (data->nlayers + 1));
    71116            orientation = toupper(a) == 'V' ? 1 : 0;
    72117            width = j;
    73118            height = k;
     119            tiles = (uint32_t *)malloc(width * height * sizeof(uint32_t));
    74120            ntiles = 0;
    75             data = (uint32_t *)malloc(width * height * sizeof(uint32_t));
    76121        }
    77122    }
     
    82127Map::~Map()
    83128{
    84     for (int i = 0; i < nlayers; i++)
    85         delete layers[i];
    86     free(layers);
     129    for (int i = 0; i < data->ntilers; i++)
     130        Tiler::Deregister(data->tilers[i]);
     131    for (int i = 0; i < data->nlayers; i++)
     132        delete data->layers[i];
     133    free(data->layers);
     134    delete data;
    87135}
    88136
    89 void Map::Draw(Tileset *tileset)
     137void Map::Draw()
    90138{
    91     for (int i = 0; i < nlayers; i++)
    92     {
    93         int z = layers[i]->GetZ();
    94 
    95         for (int y = 0; y < 32; y++)
    96             for (int x = 0; x < 32; x++)
    97                 tileset->AddTile(layers[i]->GetTile(x, y), x * 32, y * 32, z);
    98     }
     139    for (int i = 0; i < data->nlayers; i++)
     140        data->layers[i]->Draw();
    99141}
    100142
Note: See TracChangeset for help on using the changeset viewer.