annotate AdvTiledLoader/Map.lua @ 48:eeb43b94f625 default tip

merge
author Makdaam
date Sun, 16 Dec 2012 19:50:44 +0100
parents 0c46edeabad6
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
1 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
2 -- -= Map =-
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
3 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
4 -- Setup
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
5
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
6 -- Import the other classes
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
7 TILED_LOADER_PATH = TILED_LOADER_PATH or ({...})[1]:gsub("[%.\\/][Mm]ap$", "") .. '.'
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
8 local Tile = require( TILED_LOADER_PATH .. "Tile")
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
9 local TileSet = require( TILED_LOADER_PATH .. "TileSet")
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
10 local TileLayer = require( TILED_LOADER_PATH .. "TileLayer")
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
11 local Object = require( TILED_LOADER_PATH .. "Object")
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
12 local ObjectLayer = require( TILED_LOADER_PATH .. "ObjectLayer")
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
13
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
14 -- Localize some functions so they are faster
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
15 local love = love
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
16 local table = table
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
17 local ceil = math.ceil
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
18 local floor = math.floor
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
19
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
20 -- Make our map class
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
21 local Map = {class = "Map"}
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
22 Map.__index = Map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
23
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
24 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
25 -- Returns a new map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
26 function Map:new(name, width, height, tileWidth, tileHeight, orientation, path, prop)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
27
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
28 -- Our map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
29 local map = setmetatable({}, Map)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
30 prop = prop or {}
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
31
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
32 -- Public:
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
33 map.name = name or "Unnamed Map" -- Name of the map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
34 map.width = width or 0 -- Width of the map in tiles
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
35 map.height = height or 0 -- Height of the map in tiles
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
36 map.tileWidth = tileWidth or 0 -- Width in pixels of each tile
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
37 map.tileHeight = tileHeight or 0 -- Height in pixels of each tile
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
38 map.orientation = orientation or "orthogonal" -- Type of map. orthogonal or isometric
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
39 map.properties = prop or {} -- Properties of the map set by Tiled
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
40 map.useSpriteBatch = prop.atl_useSpriteBatch -- True = TileLayers use sprite batches
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
41 map.visible = true -- False = the map will not be drawn
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
42 map.drawObjects = prop.atl_drawObjects -- True = object layers will be drawn
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
43
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
44 map.viewX = prop.atl_viewX or 0 -- X coord of the viewing screen.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
45 map.viewY = prop.atl_viewY or 0 -- Y coord of the viewing screen.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
46 map.viewW = prop.atl_viewW or love.graphics.getWidth() -- The width of the viewing screen
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
47 map.viewH = prop.atl_viewH or love.graphics.getHeight() -- The height of the viewing screen
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
48 map.viewScaling = 1 -- The game scaling
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
49 map.viewPadding = 10 -- Padding for the view
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
50
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
51 map.offsetX = prop.atl_offsetX or 0 -- Drawing offset X
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
52 map.offsetY = prop.atl_offsetY or 0 -- Drawing offset Y
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
53
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
54 map.layers = {} -- Layers of the map indexed by name
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
55 map.tilesets = {} -- Tilesets indexed by name
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
56 map.tiles = {} -- Tiles indexed by id
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
57 map.layerOrder = {} -- The order of the layers. Callbacks are called in this order.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
58
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
59 -- Private:
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
60 map._widestTile = 0 -- The widest tile on the map.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
61 map._highestTile = 0 -- The tallest tile on the map.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
62 map._forceRedraw = false -- If true then the next redraw is forced
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
63 map._previousUseSpriteBatch = false -- The previous useSpiteBatch.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
64 map._tileClipboard = nil -- The value that stored for tile copying and pasting.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
65 map._directory = path -- The directory the map is in
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
66
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
67 -- Return the new map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
68 return map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
69 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
70
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
71 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
72 -- Creates a new tileset and adds it to the map. The map will then auto-update its tiles.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
73 function Map:newTileSet(...)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
74 if not name then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
75 error("Map:newTileSet - The name parameter is invalid")
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
76 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
77 self.tilesets[name] = TileSet:new(...)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
78 self:updateTiles()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
79 return self.tilesets[name]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
80 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
81
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
82 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
83 -- Creates a new TileLayer and adds it to the map. The position parameter is the position to insert
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
84 -- the layer into the layerOrder.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
85 function Map:newTileLayer(position, ...)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
86 if self.layers[name] then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
87 error( string.format("Map:newTileLayer - The layer name \"%s\" already exists.", name) )
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
88 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
89 self.layers[name] = TileLayer:new(self, ...)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
90 table.insert(self.layerOrder, position or #self.layerOrder + 1, self.layers[name])
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
91 return self.layers[name]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
92 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
93
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
94 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
95 -- Creates a new ObjectLayer and inserts it into the map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
96 function Map:newObjectLayer(position, ...)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
97 if self.layers[name] then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
98 error( string.format("Map:newObjectLayer - The layer name \"%s\" already exists.", name) )
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
99 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
100 self.layers[name] = ObjectLayer:new(self, ...)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
101 table.insert(self.layerOrder, position or #self.layerOrder + 1, self.layers[name])
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
102 return self.layers[name]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
103 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
104
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
105 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
106 -- Add a custom layer to the map. You can include a predefined layer table or one will be created.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
107 function Map:newCustomLayer(name, position, layer)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
108 if self.layers[name] then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
109 error( string.format("Map:newCustomLayer - The layer name \"%s\" already exists.", name) )
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
110 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
111 self.layers[name] = layer or {name=name}
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
112 self.layers[name].class = "CustomLayer"
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
113 table.insert(self.layerOrder, position or #self.layerOrder + 1, self.layers[name])
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
114 return self.layers[name]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
115 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
116
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
117 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
118 -- Cuts tiles out of tilesets and stores them in the tiles tables under their id
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
119 -- Call this after the tilesets are set up
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
120 function Map:updateTiles()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
121 self.tiles = {}
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
122 self._widestTile = 0
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
123 self._highestTile = 0
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
124 for _, ts in pairs(self.tilesets) do
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
125 if ts.tileWidth > self._widestTile then self._widestTile = ts.tileWidth end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
126 if ts.tileHeight > self._highestTile then self._highestTile = ts.tileHeight end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
127 for id, val in pairs(ts:getTiles()) do
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
128 self.tiles[id] = val
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
129 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
130 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
131 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
132
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
133 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
134 -- Forces the map to redraw the sprite batches.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
135 function Map:forceRedraw()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
136 self._forceRedraw = true
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
137 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
138
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
139 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
140 -- Performs a callback on all map layers.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
141 local layer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
142 function Map:callback(cb, ...)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
143 if cb == "draw" then self:_updateTileRange() end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
144 for i = 1, #self.layerOrder do
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
145 layer = self.layerOrder[i]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
146 if layer[cb] then layer[cb](layer, ...) end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
147 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
148 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
149
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
150 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
151 -- Draw the map.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
152 function Map:draw()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
153 if self.visible then self:callback("draw") end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
154 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
155
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
156 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
157 -- Returns the position of the layer inside the map's layerOrder. Can be the layer name or table.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
158 function Map:layerPosition(layer)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
159 if type(layer) == "string" then layer = self.layers[layer] end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
160 for i = 1,#self.layerOrder do
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
161 if self.layerOrder[i] == layer then return i end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
162 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
163 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
164
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
165 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
166 -- Returns the position of the layer inside the map's layerOrder. The passed layers can be the
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
167 -- layer name, the layer tables themselves, or the layer positions.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
168 function Map:swapLayers(layer1, layer2)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
169 if type(layer1) ~= "number" then layer1 = self:layerPosition(layer1) end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
170 if type(layer2) ~= "number" then layer2 = self:layerPosition(layer2) end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
171 local bubble = self.layers[layer1]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
172 self.layers[layer1] = self.layers[layer2]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
173 self.layers[layer2] = bubble
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
174 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
175
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
176 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
177 -- Removes a layer from the map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
178 function Map:removeLayer(layer)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
179 if type(layer) ~= "number" then layer = self:layerPosition(layer) end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
180 layer = table.remove(self.layerOrder, layer)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
181 self.layers[layer.name] = nil
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
182 return layer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
183 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
184
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
185 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
186 -- Turns an isometric location into a world location. The unit length for isometric tiles is always
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
187 -- the map's tileHeight. This is both for width and height.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
188 local h, tw, th
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
189 function Map:fromIso(x, y)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
190 h, tw, th = self.height, self.tileWidth, self.tileHeight
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
191 return ((x-y)/th + h - 1)*tw/2, (x+y)/2
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
192 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
193
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
194 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
195 -- Turns a world location into an isometric location
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
196 local ix, iy
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
197 function Map:toIso(a, b)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
198 a, b = a or 0, b or 0
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
199 h, tw, th = self.height, self.tileWidth, self.tileHeight
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
200 ix = b - (h-1)*th/2 + (a*th)/tw
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
201 iy = 2*b - ix
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
202 return ix, iy
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
203 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
204
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
205 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
206 -- Sets the draw range
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
207 function Map:setDrawRange(x,y,w,h)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
208 self.viewX, self.viewY, self.viewW, self.viewH = x, y, w, h
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
209 self.viewPadding = 0
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
210 self.viewScaling = 1
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
211 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
212
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
213 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
214 -- Automatically sets the draw range to fit the display
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
215 function Map:autoDrawRange(tx, ty, scale, pad)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
216 tx, ty, scale, pad = tx or 0, ty or 0, scale or 1, pad or 0
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
217 self.viewX = -tx
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
218 self.viewY = -ty
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
219 self.viewW = love.graphics.getWidth()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
220 self.viewH = love.graphics.getHeight()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
221 self.viewScaling = scale > 0.001 and scale or 0.001
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
222 self.viewPadding = pad
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
223 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
224
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
225 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
226 -- Returns the normal draw range
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
227 function Map:getDrawRange()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
228 return self.viewX - self.viewPadding, self.viewY - self.viewPadding,
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
229 self.viewW/self.viewScaling + self.viewPadding*2,
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
230 self.viewH/self.viewScaling + self.viewPadding*2
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
231 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
232
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
233 ----------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
234 -- Private Functions
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
235 ----------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
236 -- This is an internal function used to update the map's _tileRange, _previousTileRange, and
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
237 -- _specialRedraw
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
238 local x1, y1, x2, y2, highOffset, widthOffset, tr, ptr, layer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
239 function Map:_updateTileRange()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
240
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
241 -- Offset to make sure we can always draw the highest and widest tile
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
242 heightOffset = self._highestTile - self.tileHeight
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
243 widthOffset = self._widestTile - self.tileWidth
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
244
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
245 -- Go through each layer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
246 for i = 1,#self.layerOrder do
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
247 layer = self.layerOrder[i]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
248
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
249 -- If the layer is a TileLayer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
250 if layer.class == "TileLayer" then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
251
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
252 -- Get the draw range.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
253 x1 = self.viewX * layer.parallaxX - self.viewPadding + layer.offsetX
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
254 y1 = self.viewY * layer.parallaxY - self.viewPadding + layer.offsetY
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
255 x2 = self.viewW/self.viewScaling + self.viewPadding*2
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
256 y2 = self.viewH/self.viewScaling + self.viewPadding*2
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
257
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
258 -- Apply the offset
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
259 x1 = x1 - self.offsetX - layer.offsetX
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
260 y1 = y1 - self.offsetY - layer.offsetY
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
261
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
262 -- Calculate the _tileRange for orthogonal tiles
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
263 if self.orientation == "orthogonal" then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
264
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
265 -- Limit the drawing range. We must make sure we can draw the tiles that are bigger
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
266 -- than the self's tileWidth and tileHeight.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
267 if x1 and y1 and x2 and y2 then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
268 x2 = ceil(x2/self.tileWidth)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
269 y2 = ceil((y2+heightOffset)/self.tileHeight)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
270 x1 = floor((x1-widthOffset)/self.tileWidth)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
271 y1 = floor(y1/self.tileHeight)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
272
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
273 -- Make sure that we stay within the boundry of the map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
274 x1 = x1 > 0 and x1 or 0
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
275 y1 = y1 > 0 and y1 or 0
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
276 x2 = x2 < self.width and x2 or self.width - 1
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
277 y2 = y2 < self.height and y2 or self.height - 1
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
278
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
279 else
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
280 -- If the drawing range isn't defined then we draw all the tiles
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
281 x1, y1, x2, y2 = 0, 0, self.width-1, self.height-1
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
282 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
283
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
284 -- Calculate the _tileRange for isometric tiles.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
285 else
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
286 -- If the drawRange is set
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
287 if x1 and y1 and x2 and y2 then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
288 x1, y1 = self:toIso(x1-self._widestTile,y1)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
289 x1, y1 = ceil(x1/self.tileHeight), ceil(y1/self.tileHeight)-1
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
290 x2 = ceil((x2+self._widestTile)/self.tileWidth)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
291 y2 = ceil((y2+heightOffset)/self.tileHeight)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
292 -- else draw everything
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
293 else
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
294 x1 = 0
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
295 y1 = 0
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
296 x2 = self.width - 1
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
297 y2 = self.height - 1
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
298 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
299 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
300
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
301 -- Assign the new values to the tile range
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
302 tr, ptr = layer._tileRange, layer._previousTileRange
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
303 ptr[1], ptr[2], ptr[3], ptr[4] = tr[1], tr[2], tr[3], tr[4]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
304 tr[1], tr[2], tr[3], tr[4] = x1, y1, x2, y2
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
305
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
306 -- If the tile range or useSpriteBatch is different than the last frame then we need to
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
307 -- update its sprite batches.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
308 layer._redraw = self.useSpriteBatch ~= self._previousUseSpriteBatch or
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
309 self._forceRedraw or
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
310 tr[1] ~= ptr[1] or
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
311 tr[2] ~= ptr[2] or
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
312 tr[3] ~= ptr[3] or
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
313 tr[4] ~= ptr[4]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
314 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
315 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
316
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
317 -- Set the previous useSpritebatch
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
318 self._previousUseSpriteBatch = self.useSpriteBatch
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
319
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
320 -- Reset the forced special redraw
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
321 self._forceRedraw = false
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
322 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
323
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
324 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
325 -- Calling the map as a function will return the layer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
326 function Map:__call(layerName)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
327 return self.layers[layerName]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
328 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
329
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
330 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
331 -- Returns the Map class
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
332 return Map
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
333
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
334
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
335 --[[Copyright (c) 2011-2012 Casey Baxter
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
336
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
337 Permission is hereby granted, free of charge, to any person obtaining a copy
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
338 of this software and associated documentation files (the "Software"), to deal
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
339 in the Software without restriction, including without limitation the rights
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
340 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
341 copies of the Software, and to permit persons to whom the Software is
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
342 furnished to do so, subject to the following conditions:
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
343
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
344 The above copyright notice and this permission notice shall be included in
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
345 all copies or substantial portions of the Software.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
346
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
347 Except as contained in this notice, the name(s) of the above copyright holders
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
348 shall not be used in advertising or otherwise to promote the sale, use or
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
349 other dealings in this Software without prior written authorization.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
350
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
351 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
352 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
353 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
354 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
355 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
356 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
357 THE SOFTWARE.--]]