Changeset 74 for trunk/src/map.cpp


Ignore:
Timestamp:
Jul 6, 2010, 11:37:47 PM (10 years ago)
Author:
sam
Message:

Support CSV .tmx files to get rid of that pathetic system() call.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/map.cpp

    r70 r74  
    11
    22#include <cstdio>
     3#include <cstring>
     4#include <cstdlib>
    35#include <malloc.h>
     6#include <ctype.h>
    47
    58#include "map.h"
     
    1114{
    1215    char tmp[BUFSIZ];
    13     int firstgid = 0, width = 0, height = 0, level = 0, data = 0;
     16    uint32_t *data = NULL;
     17    int width = 0, height = 0, level = 0, orientation = 0;
     18    int firstgid = 0, ntiles = 0;
    1419
    1520    FILE *fp = fopen(path, "r");
     
    2833        if (data)
    2934        {
    30             if (--data == 0)
     35            /* We are in the process of reading layer data. Only stop
     36             * when we have read the expected number of tiles. */
     37            char const *parser = tmp;
     38            while (ntiles < width * height)
    3139            {
    32                 layers[nlayers] = new Layer(width, height, level, tmp);
     40                data[ntiles++] = atoi(parser);
     41                while (isdigit(*parser))
     42                    parser++;
     43                if (*parser == ',')
     44                    parser++;
     45                if (!isdigit(*parser))
     46                    break;
     47            }
     48
     49            if (ntiles == width * height)
     50            {
     51                layers[nlayers] = new Layer(width, height, level, data);
    3352                nlayers++;
     53                data = NULL;
    3454            }
    3555        }
    3656        else if (sscanf(tmp, " <tileset firstgid=\"%i\"", &i) == 1)
    3757        {
     58            /* This is a tileset description. Remember its firstgid value. */
    3859            firstgid = i;
    39             fprintf(stderr, "found tileset, firstgid %i\n", firstgid);
    4060        }
    4161        else if (sscanf(tmp, " <image source=\"%[^\"]\"", str) == 1)
    4262        {
    43             fprintf(stderr, "image %s\n", str);
     63            /* This is a tileset image file. Associate it with firstgid. */
    4464        }
    45         else if (sscanf(tmp, " <layer name=\"%c%i%c%*[^\"]\" width=\"%i\" height=\"%i\"",
    46                         &a, &i, &b, &j, &k) == 5)
     65        else if (sscanf(tmp, " <layer name=\"%c%i%c%*[^\"]\" "
     66                        "width=\"%i\" height=\"%i\"", &a, &i, &b, &j, &k) == 5)
    4767        {
    48             fprintf(stderr, "%s layer, level %i, sublevel %c, %ix%i\n",
    49                     a == 'H' ? "horizontal" : "vertical", i, b, j, k);
    50             layers = (Layer **)realloc(layers, sizeof(Layer **) * (nlayers + 1));
     68            /* This is a layer description. Prepare to read the data. */
     69            layers = (Layer **)realloc(layers,
     70                                       sizeof(Layer **) * (nlayers + 1));
     71            orientation = toupper(a) == 'V' ? 1 : 0;
    5172            width = j;
    5273            height = k;
    53             data = 2;
    54         }
    55         else
    56         {
    57             fprintf(stderr, ".");
     74            ntiles = 0;
     75            data = (uint32_t *)malloc(width * height * sizeof(uint32_t));
    5876        }
    5977    }
    6078
    6179    fclose(fp);
    62 
    63 /*
    64     char tmp[1024];
    65 
    66     sprintf(tmp, "grep '\\(^   [^< ]\\|layer name\\)' %s | while read i; do echo \"$i\"; read i; echo -n \"$i\" | perl -MMIME::Base64 -ne 'print decode_base64($_)' | gunzip; done", path);
    67 
    68     FILE *fp = popen(tmp, "r");
    69 
    70     while (fp && !feof(fp))
    71     {
    72         int width, height;
    73 
    74         fscanf(fp, "<layer name=\"%[^\"]\" ", name);
    75         if (feof(fp))
    76             break;
    77         fscanf(fp, "width=\"%u\" ", &width);
    78         fscanf(fp, "height=\"%u\" ", &height);
    79         fgets(tmp, 1024, fp); // Ignore rest of line
    80         layers = (Layer **)realloc(layers, sizeof(Layer **) * (nlayers + 1));
    81         layers[nlayers] = new Layer(name, width, height, fp);
    82         nlayers++;
    83     }
    84 
    85     pclose(fp);
    86 */
    8780}
    8881
     
    9487}
    9588
    96 void Map::Draw(Tiler *tiler)
     89void Map::Draw(Tileset *tileset)
    9790{
    9891    for (int i = 0; i < nlayers; i++)
     
    10295        for (int y = 0; y < 32; y++)
    10396            for (int x = 0; x < 32; x++)
    104                 tiler->AddTile(layers[i]->GetTile(x, y), x * 32, y * 32, z);
     97                tileset->AddTile(layers[i]->GetTile(x, y), x * 32, y * 32, z);
    10598    }
    10699}
Note: See TracChangeset for help on using the changeset viewer.