-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTiledMap.lua
129 lines (108 loc) · 3.21 KB
/
TiledMap.lua
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
local TiledMap = {}
TiledMap.new_from_file = function (filename, texture)
local reader = require("BinaryFile").new_reader(filename)
reader.i32()
reader.i32()
local w = reader.i32()
local h = reader.i32()
local layers = reader.i32()
local map = {}
for l = 1, layers do
map[l] = {}
for i = 1, w * h do
reader.u16()
map[l][i] = reader.u16()
end
end
return TiledMap.new(w, h, layers, map, texture)
end
TiledMap.new = function (w, h, layers, map, texture)
local self = {}
local layered_vertices = {}
local mesh = {}
self.map = map
self.texture = texture
self.x = 0
self.y = 0
self.zoom = 16
self.w = w
self.h = h
for l = 1, layers do
end
self.generate = function ()
-- Loop through each layer
for l = 1, layers do
-- Generate vertices for single layer
local vertices = {}
local tilex, tiley = self.texture[l]["w"], self.texture[l]["h"]
local uvw, uvh = 1.0 / tilex, 1.0 / tiley
for x = 1, self.w do
for y = 1, self.h do
local index = (y - 1) * w + x
local tile = self.map[l][index]
if tile >= 0 then
local x0, y0 = x - 1, y - 1
local uvx, uvy = uvw * (tile % tilex), uvh * math.floor(tile / tilex)
vertices[index * 6 - 5] = {x0 , y0 , uvx , uvy , 255, 255, 255, 255}
vertices[index * 6 - 4] = {x0+1, y0+1, uvx+uvw, uvy+uvh, 255, 255, 255, 255}
vertices[index * 6 - 3] = {x0 , y0+1, uvx , uvy+uvh, 255, 255, 255, 255}
vertices[index * 6 - 2] = {x0 , y0 , uvx , uvy , 255, 255, 255, 255}
vertices[index * 6 - 1] = {x0+1, y0 , uvx+uvw, uvy , 255, 255, 255, 255}
vertices[index * 6 ] = {x0+1, y0+1, uvx+uvw, uvy+uvh, 255, 255, 255, 255}
else
vertices[index * 6 - 5] = {0, 0, 0, 0, 255, 255, 255, 0}
vertices[index * 6 - 4] = {0, 0, 0, 0, 255, 255, 255, 0}
vertices[index * 6 - 3] = {0, 0, 0, 0, 255, 255, 255, 0}
vertices[index * 6 - 2] = {0, 0, 0, 0, 255, 255, 255, 0}
vertices[index * 6 - 1] = {0, 0, 0, 0, 255, 255, 255, 0}
vertices[index * 6 ] = {0, 0, 0, 0, 255, 255, 255, 0}
end
end
end
-- Add into layers
layered_vertices[l] = vertices
end
end
self.generate_mesh = function ()
for l = 1, layers do
mesh[l] = love.graphics.newMesh(layered_vertices[l], "triangles", "static")
mesh[l]:setTexture(texture[l]["tex"])
end
end
self.update_mesh = function ()
for l = 1, layers do
mesh[l]:setVertices(layered_vertices[l], 1)
mesh[l]:setTexture(texture[l]["tex"])
end
end
self.generate()
self.generate_mesh()
self.draw = function ()
love.graphics.push()
love.graphics.translate(self.x, self.y)
love.graphics.scale(self.zoom, self.zoom)
for l = 1, layers do
love.graphics.draw(mesh[l])
end
love.graphics.pop()
end
self.save = function (filename)
local writer = require("binaryfile").new_writer(filename)
writer.i32(0x57a7d4a3) -- ThingsWorks magic number
writer.i32(0x70614dff) -- "\xffMap"
writer.i32(self.w)
writer.i32(self.h)
writer.i32(layers)
for l = 1, layers do
for i = 1, self.w * self.h do
writer.u8(0) -- variant type
writer.u8(0) -- texture id, unsupported
local tile = self.map[l][i]
writer.u16(tile)
end
end
writer.close()
end
return self
end
return TiledMap