source: trunk/src/map.cpp @ 70

Last change on this file since 70 was 70, checked in by sam, 11 years ago

Breaking the map/layer code apart. Needs more work.

  • Property svn:keywords set to Id
File size: 2.5 KB
RevLine 
[38]1
2#include <cstdio>
3#include <malloc.h>
4
5#include "map.h"
6#include "layer.h"
7
8Map::Map(char const *path) :
9    layers(0),
10    nlayers(0)
11{
[70]12    char tmp[BUFSIZ];
13    int firstgid = 0, width = 0, height = 0, level = 0, data = 0;
14
15    FILE *fp = fopen(path, "r");
16
17    if (!fp)
18        return;
19
20    while (!feof(fp))
21    {
22        char str[1024];
23        int i, j, k;
24        char a, b;
25
26        fgets(tmp, BUFSIZ, fp);
27
28        if (data)
29        {
30            if (--data == 0)
31            {
32                layers[nlayers] = new Layer(width, height, level, tmp);
33                nlayers++;
34            }
35        }
36        else if (sscanf(tmp, " <tileset firstgid=\"%i\"", &i) == 1)
37        {
38            firstgid = i;
39            fprintf(stderr, "found tileset, firstgid %i\n", firstgid);
40        }
41        else if (sscanf(tmp, " <image source=\"%[^\"]\"", str) == 1)
42        {
43            fprintf(stderr, "image %s\n", str);
44        }
45        else if (sscanf(tmp, " <layer name=\"%c%i%c%*[^\"]\" width=\"%i\" height=\"%i\"",
46                        &a, &i, &b, &j, &k) == 5)
47        {
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));
51            width = j;
52            height = k;
53            data = 2;
54        }
55        else
56        {
57            fprintf(stderr, ".");
58        }
59    }
60
61    fclose(fp);
62
63/*
[38]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));
[47]81        layers[nlayers] = new Layer(name, width, height, fp);
[38]82        nlayers++;
83    }
84
85    pclose(fp);
[70]86*/
[38]87}
88
89Map::~Map()
90{
91    for (int i = 0; i < nlayers; i++)
92        delete layers[i];
93    free(layers);
94}
95
96void Map::Draw(Tiler *tiler)
97{
98    for (int i = 0; i < nlayers; i++)
[47]99    {
100        int z = layers[i]->GetZ();
101
[38]102        for (int y = 0; y < 32; y++)
103            for (int x = 0; x < 32; x++)
[47]104                tiler->AddTile(layers[i]->GetTile(x, y), x * 32, y * 32, z);
105    }
[38]106}
107
Note: See TracBrowser for help on using the repository browser.