-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathmain.lua
112 lines (100 loc) · 3.14 KB
/
main.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
local sti = require("sti")
local gamera = require("gamera")
--love.window.setFullscreen(true)
-- create a new orthogonal map that is 64x64 tiles, each tile is 32x32 pixels
local map = {
orientation = "orthogonal",
width = 64,
height = 64,
tilewidth = 32,
tileheight = 32,
tilesets = {},
layers = {}
}
-- create a tileset from an image (Liberated Pixel Cup terrain_atlas.png from opengameart.org)
local tileset = {
name = "terrain_atlas",
firstgid = 1,
tilewidth = 32,
tileheight = 32,
spacing = 0,
margin = 0,
image = "terrain_atlas.png",
imagewidth = 1024,
imageheight = 1024,
tileoffset = {x = 0, y = 0},
tilecount = 1024,
tiles = {}
}
table.insert(map.tilesets, tileset)
-- create a layer of the map, with the same height/width as the map
function addLayer(map, name)
local layer = {
type = "tilelayer",
name = name,
x = 0,
y = 0,
width = 64,
height = 64,
visible = true,
opacity = 1,
offsetx = 0,
offsety = 0,
properties = {},
encoding = "lua",
data = {}
}
table.insert(map.layers, layer)
return layer
end
local layer = addLayer(map, "grass")
-- populate the layer with a default tile ID
function populateLayer(layer, tile_id)
for i=1, layer.width * layer.height do
table.insert(layer.data, tile_id)
end
end
-- helper function to get the ID of a tile from the tileset using x,y coordinates
function getTileID(tileset, x, y)
local width = tileset.imagewidth / tileset.tilewidth
return x + y * width + 1 -- +1 because Tile ID 0 represents an empty tile
end
-- create a grass background layer
local grass_tile_id = getTileID(tileset, 22, 3)
populateLayer(layer, grass_tile_id)
-- helper function to set a tile in the layer based on x,y coordinates
function setTile(layer, x, y, tile_id)
layer.data[x + y * layer.width + 1] = tile_id -- +1 because Tile ID 0 represents an empty tile
end
-- create a layer for the path
local path_layer = addLayer(map, "path")
populateLayer(path_layer, 0)
for x=0, path_layer.width - 1 do
setTile(path_layer, x, 5, getTileID(tileset, 19, 2))
setTile(path_layer, x, 6, getTileID(tileset, 19, 3))
setTile(path_layer, x, 7, getTileID(tileset, 19, 4))
end
-- create a layer for objects like
local objects_layer = addLayer(map, "objects")
populateLayer(objects_layer, 0)
setTile(objects_layer, 1, 1, getTileID(tileset, 30, 0))
setTile(objects_layer, 2, 1, getTileID(tileset, 31, 0))
setTile(objects_layer, 1, 2, getTileID(tileset, 30, 1))
setTile(objects_layer, 2, 2, getTileID(tileset, 31, 1))
setTile(objects_layer, 1, 3, getTileID(tileset, 30, 2))
setTile(objects_layer, 2, 3, getTileID(tileset, 31, 2))
setTile(objects_layer, 1, 4, getTileID(tileset, 30, 3))
setTile(objects_layer, 2, 4, getTileID(tileset, 31, 3))
setTile(objects_layer, 1, 5, getTileID(tileset, 30, 4))
setTile(objects_layer, 2, 5, getTileID(tileset, 31, 4))
local tileMap = sti(map)
local w, h = tileMap.tilewidth * tileMap.width, tileMap.tileheight * tileMap.height
local camera = gamera.new(0, 0, w, h)
function love.draw()
local dt = love.timer.getDelta()
camera:draw(function(l, t, w, h)
tileMap:update(dt)
tileMap:setDrawRange(-l, -t, w, h)
tileMap:draw()
end)
end