annotate AdvTiledLoader/ObjectLayer.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 -- -= ObjectLayer =-
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 TILED_LOADER_PATH = TILED_LOADER_PATH or ({...})[1]:gsub("[%.\\/][Oo]bject[Ll]ayer$", "") .. '.'
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
6 local love = love
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
7 local unpack = unpack
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
8 local pairs = pairs
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
9 local ipairs = ipairs
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
10 local Object = require( TILED_LOADER_PATH .. "Object")
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
11 local ObjectLayer = {class = "ObjectLayer"}
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
12 local grey = {128,128,128,255}
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
13 ObjectLayer.__index = ObjectLayer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
14
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
15 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
16 -- Creates and returns a new ObjectLayer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
17 function ObjectLayer:new(map, name, color, opacity, prop)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
18
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
19 -- Create a new table for our object layer and do some error checking.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
20 local layer = setmetatable({}, ObjectLayer)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
21
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
22 layer.map = map -- The map this layer belongs to
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
23 layer.name = name or "Unnamed ObjectLayer" -- The name of this layer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
24 layer.color = color or grey -- The color theme
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
25 layer.opacity = opacity or 1 -- The opacity
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
26 layer.objects = {} -- The layer's objects indexed numerically
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
27 layer.properties = prop or {} -- Properties set by Tiled.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
28 layer.visible = true -- If false then the layer will not be drawn
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
29
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
30 -- Return the new object layer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
31 return layer
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
32 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
33
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
34 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
35 -- Creates a new object, automatically inserts it into the layer, and then returns it
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
36 function ObjectLayer:newObject(name, type, x, y, width, height, gid, prop)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
37 local obj = Object:new(self, name, type, x, y, width, height, gid, prop)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
38 self.objects[#self.objects+1] = obj
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
39 return obj
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
40 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
41
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
42 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
43 -- Sorting function for objects. We'll use this below in ObjectLayer:draw()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
44 local function drawSort(o1, o2)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
45 return o1.drawInfo.order < o2.drawInfo.order
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
46 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
47
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
48 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
49 -- Draws the object layer. The way the objects are drawn depends on the map orientation and
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
50 -- if the object has an associated tile. It tries to draw the objects as closely to the way
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
51 -- Tiled does it as possible.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
52 local di, dr, drawList, r, g, b, a, line, obj, offsetX, offsetY
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
53 function ObjectLayer:draw()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
54
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
55 -- Early exit if the layer is not visible.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
56 if not self.visible then return end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
57
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
58 -- Exit if objects are not suppose to be drawn
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
59 if not self.map.drawObjects then return end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
60
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
61 di = nil -- The draw info
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
62 dr = {self.map:getDrawRange()} -- The drawing range. [1-4] = x, y, width, height
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
63 drawList = {} -- A list of the objects to be drawn
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
64 r,g,b,a = 255, 255, 255, 255 ---love.graphics.getColor() -- Save the color so we can set it back at the end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
65 line = love.graphics.getLineWidth() -- Save the line width too
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
66 self.color[4] = 255 * self.opacity -- Set the opacity
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
67
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
68 -- Put only objects that are on the screen in the draw list. If the screen range isn't defined
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
69 -- add all objects
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
70 for i = 1, #self.objects do
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
71 obj = self.objects[i]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
72 obj:updateDrawInfo()
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
73 di = obj.drawInfo
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
74 if dr[1] and dr[2] and dr[3] and dr[4] then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
75 if di.right > dr[1]-20 and
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
76 di.bottom > dr[2]-20 and
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
77 di.left < dr[1]+dr[3]+20 and
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
78 di.top < dr[2]+dr[4]+20 then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
79 drawList[#drawList+1] = obj
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 else
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
82 drawList[#drawList+1] = obj
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
83 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
84 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
85
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
86 -- Sort the draw list by the object's draw order
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
87 table.sort(drawList, drawSort)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
88
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
89 -- Draw all the objects in the draw list.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
90 offsetX, offsetY = self.map.offsetX, self.map.offsetY
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
91 for i = 1, #drawList do
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
92 obj = drawList[i]
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
93 love.graphics.setColor(r,b,g,a)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
94 drawList[i]:draw(di.x, di.y, unpack(self.color or neutralColor))
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
95 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
96
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
97 -- Reset the color and line width
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
98 love.graphics.setColor(r,b,g,a)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
99 love.graphics.setLineWidth(line)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
100 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
101
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
102 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
103 -- Changes an object layer into a custom layer. A function can be passed to convert objects.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
104 function ObjectLayer:toCustomLayer(convert)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
105 if convert then
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
106 for i = 1, #self.objects do
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
107 self.objects[i] = convert(self.objects[i])
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
108 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
109 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
110 self.class = "CustomLayer"
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
111 return setmetatable(self, nil)
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
112 end
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
113
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
114 ---------------------------------------------------------------------------------------------------
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
115 -- Return the ObjectLayer class
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
116 return ObjectLayer
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
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
119 --[[Copyright (c) 2011-2012 Casey Baxter
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
120
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
121 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
122 of this software and associated documentation files (the "Software"), to deal
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
123 in the Software without restriction, including without limitation the rights
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
124 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
125 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
126 furnished to do so, subject to the following conditions:
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
127
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
128 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
129 all copies or substantial portions of the Software.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
130
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
131 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
132 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
133 other dealings in this Software without prior written authorization.
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
134
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
135 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
136 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0c46edeabad6 scrolling map
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff changeset
137 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
138 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
139 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
140 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
141 THE SOFTWARE.--]]