summaryrefslogtreecommitdiff
path: root/client/tmxloader.js
blob: 9e61012b870e69522e159b19fafde846b2d2a328 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
var TMXLoader = function (mapName)
{
    var self = {};

    self.mapName = mapName;

    self.tileset = {
        firstGID: 0,
        isTsx: false,
        tsxSource: "",
        source: "",
        tileWidth: 0,
        tileHeight: 0,
        tileCount: 0,
        width: 0,
        height: 0,
        img: null,
    };

    self.tile = {
        id: 0,
        index: 0,
    };

    self.tiles = [self.tile];

    self.layer = {
        id: 0,
        name: "",
        tiles: [],
        tilesStr: ""
    };

    self.layers = {
        layer: [self.layer]
    };

    self.map = {
        width: 0,
        height: 0,
        layers: [self.layer],
        tilesets: [self.tileset],

    };

    self.xml = new XMLHttpRequest();
    self.xml2 = new XMLHttpRequest();
    self.parser = new DOMParser();

    self.loadMap = function ()
    {
        self.xml.open('GET', "/client/assets/maps/" + mapName + ".tmx");
        self.xml.onload = function ()
        {
            var dom = self.parser.parseFromString(self.xml.response, "text/xml");

            self.map.width = dom.documentElement.getAttribute('width');
            self.map.height = dom.documentElement.getAttribute('height');

            // tilesets
            for (var i = 0; i < dom.documentElement.getElementsByTagName('tileset').length; i++)
            {
                var tileset = {};
                tileset.firstGID = parseInt(dom.documentElement.getElementsByTagName('tileset').item(i).getAttribute('firstgid'));
                if (!dom.documentElement.getElementsByTagName('tileset').item(i).hasAttribute('source'))
                {
                    tileset.source = dom.documentElement.getElementsByTagName('tileset').item(i).getElementsByTagName('image')[0].getAttribute('source').replace("../", "/client/assets/");
                    tileset.width = parseInt(dom.documentElement.getElementsByTagName('tileset').item(i).getElementsByTagName('image')[0].getAttribute('width'));
                    tileset.height = parseInt(dom.documentElement.getElementsByTagName('tileset').item(i).getElementsByTagName('image')[0].getAttribute('height'));
                    tileset.tileWidth = parseInt(dom.documentElement.getElementsByTagName('tileset').item(i).getAttribute('tilewidth'));
                    tileset.tileHeight = parseInt(dom.documentElement.getElementsByTagName('tileset').item(i).getAttribute('tileheight'));
                    tileset.tileCount = parseInt(dom.documentElement.getElementsByTagName('tileset').item(i).getAttribute('tilecount'));
                    tileset.img = self.addImg(tileset.source);
                    self.map.tilesets[i] = tileset;
                } else
                {
                    tileset.isTsx = true;
                    tileset.tsxSource = dom.documentElement.getElementsByTagName('tileset').item(i).getAttribute('source').replace("../", "/client/assets/");
                    self.map.tilesets[i] = tileset;
                    self.loadTSX();
                }
            }

            // layers
            for (var i = 0; i < dom.documentElement.getElementsByTagName('layer').length; i++)
            {
                var layer = {};
                layer.name = dom.documentElement.getElementsByTagName('layer').item(i).getAttribute('name');
                layer.tilesStr = dom.documentElement.getElementsByTagName('layer').item(i).getElementsByTagName('data')[0].innerHTML;
                layer.id = parseInt(dom.documentElement.getElementsByTagName('layer').item(i).getAttribute('id'));
                layer.tiles = [];
                self.map.layers[i] = layer;
            }
            self.parseLayer();
        }
        self.xml.send();
    }

    self.addImg = function (source)
    {
        var TSet = {};
        TSet.new = new Image();
        TSet.new.src = source;
        return TSet.new;
    }

    self.loadTSX = function ()
    {
        for (var i = 0; i < self.map.tilesets.length; i++)
        {

            if (self.map.tilesets[i].isTsx && self.map.tilesets[i].tsxSource != null)
            {
                self.xml2.open('GET', self.map.tilesets[i].tsxSource);
                var tileset = self.map.tilesets[i];
                self.xml2.onload = function ()
                {
                    var dom2 = self.parser.parseFromString(self.xml2.response, "text/xml");
                    tileset.source = "/client/assets/tilesets/" + dom2.documentElement.getElementsByTagName('image')[0].getAttribute('source')
                    tileset.width = parseInt(dom2.documentElement.getElementsByTagName('image')[0].getAttribute('width'));
                    tileset.height = parseInt(dom2.documentElement.getElementsByTagName('image')[0].getAttribute('height'));
                    tileset.tileWidth = parseInt(dom2.documentElement.getAttribute('tilewidth'));
                    tileset.tileHeight = parseInt(dom2.documentElement.getAttribute('tileheight'));
                    tileset.tileCount = parseInt(dom2.documentElement.getAttribute('tilecount'));
                    tileset.img = self.addImg(tileset.source);
                    tileset.isTsx = false; // prevents from reloading
                }
                self.xml2.send();
            }
        }
    }

    self.getTileIdAt = function (x, y, layer)
    {
        return self.map.layers[layer].tiles[y][x];
    }

    self.parseLayer = function ()
    {
        for (var i = 0; i < self.map.layers.length; i++)
        {
            for (var mapX = 0; mapX < self.map.height; mapX++)
            {
                self.map.layers[i].tiles[mapX] = [];
                for (var mapY = 0; mapY < self.map.width; mapY++)
                {
                    var tileId = parseInt(self.map.layers[i].tilesStr.replace('\n', '').split(',')[mapY * self.map.width + mapX]);
                    self.map.layers[i].tiles[mapX][mapY] = {
                        id: tileId,
                        index: mapX * self.map.width + mapY
                    };
                }
            }
            self.map.layers[i].tilesStr = "";
        }
    }

    self.getCollision = function (direction)
    {
        // TODO
    }

    self.drawLayer = function (canvas, layerName, xOffset, yOffset)
    {
        for (var layerId = 0; layerId < self.map.layers.length; layerId++)
        {
            var t = 0;
            if (self.map.layers[layerId].name.toLowerCase().includes(layerName))
            {
                for (var mapY = 0; mapY < self.map.height; mapY++)
                {
                    for (var mapX = 0; mapX < self.map.width; mapX++)
                    {
                        var gid = self.map.layers[layerId].tiles[mapX][mapY].id;

                        for (var sets = 0; sets < self.map.tilesets.length; sets++)
                        {
                            if (gid <= (self.map.tilesets[sets].firstGID + self.map.tilesets[sets].tileCount) &&
                                gid >= self.map.tilesets[sets].firstGID)
                                t = sets;
                        }

                        var tsGid = gid - self.map.tilesets[t].firstGID;

                        if (self.map.tilesets[t].img == null && tsGid == 0)
                            continue;

                        var tilesinrow = self.map.tilesets[t].width / self.map.tilesets[t].tileWidth;

                        var y = Math.floor(tsGid / tilesinrow);
                        var x = tsGid % (tilesinrow);

                        canvas.drawImage(self.map.tilesets[t].img,
                            x * self.map.tilesets[t].tileWidth, y * self.map.tilesets[t].tileHeight,
                            self.map.tilesets[t].tileWidth, self.map.tilesets[t].tileHeight,
                            mapX * self.map.tilesets[t].tileWidth + xOffset, mapY * self.map.tilesets[t].tileWidth + yOffset,
                            self.map.tilesets[t].tileWidth, self.map.tilesets[t].tileHeight)
                    }
                }
            }
        }
    }

    self.loadMap();

    return self;
}