2
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
1 ---------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
2 -- -= ObjectLayer =-
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
3 ---------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
4 -- Setup
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
5 TILED_LOADER_PATH = TILED_LOADER_PATH or ({...})[1]:gsub("[%.\\/][Oo]bject[Ll]ayer$", "") .. '.'
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
6 local love = love
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
7 local unpack = unpack
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
8 local pairs = pairs
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
9 local ipairs = ipairs
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
10 local Object = require( TILED_LOADER_PATH .. "Object")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
11 local ObjectLayer = {class = "ObjectLayer"}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
12 local grey = {128,128,128,255}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
13 ObjectLayer.__index = ObjectLayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
14
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
15 ---------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
16 -- Creates and returns a new ObjectLayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
17 function ObjectLayer:new(map, name, color, opacity, prop)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
18
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
19 -- Create a new table for our object layer and do some error checking.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
20 local layer = setmetatable({}, ObjectLayer)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
21
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
22 layer.map = map -- The map this layer belongs to
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
23 layer.name = name or "Unnamed ObjectLayer" -- The name of this layer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
24 layer.color = color or grey -- The color theme
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
25 layer.opacity = opacity or 1 -- The opacity
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
26 layer.objects = {} -- The layer's objects indexed numerically
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
27 layer.properties = prop or {} -- Properties set by Tiled.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
28 layer.visible = true -- If false then the layer will not be drawn
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
29
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
30 -- Return the new object layer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
31 return layer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
32 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
33
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
34 ---------------------------------------------------------------------------------------------------
|
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
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
36 function ObjectLayer:newObject(name, type, x, y, width, height, gid, prop)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
37 local obj = Object:new(self, name, type, x, y, width, height, gid, prop)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
38 self.objects[#self.objects+1] = obj
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
39 return obj
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
40 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
41
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
42 ---------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
43 -- Sorting function for objects. We'll use this below in ObjectLayer:draw()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
44 local function drawSort(o1, o2)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
45 return o1.drawInfo.order < o2.drawInfo.order
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
46 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
47
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
48 ---------------------------------------------------------------------------------------------------
|
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
|
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
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
51 -- Tiled does it as possible.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
52 local di, dr, drawList, r, g, b, a, line, obj, offsetX, offsetY
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
53 function ObjectLayer:draw()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
54
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
55 -- Early exit if the layer is not visible.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
56 if not self.visible then return end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
57
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
58 -- Exit if objects are not suppose to be drawn
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
59 if not self.map.drawObjects then return end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
60
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
61 di = nil -- The draw info
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
62 dr = {self.map:getDrawRange()} -- The drawing range. [1-4] = x, y, width, height
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
63 drawList = {} -- A list of the objects to be drawn
|
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
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
65 line = love.graphics.getLineWidth() -- Save the line width too
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
66 self.color[4] = 255 * self.opacity -- Set the opacity
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
67
|
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
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
69 -- add all objects
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
70 for i = 1, #self.objects do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
71 obj = self.objects[i]
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
72 obj:updateDrawInfo()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
73 di = obj.drawInfo
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
74 if dr[1] and dr[2] and dr[3] and dr[4] then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
75 if di.right > dr[1]-20 and
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
76 di.bottom > dr[2]-20 and
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
77 di.left < dr[1]+dr[3]+20 and
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
78 di.top < dr[2]+dr[4]+20 then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
79 drawList[#drawList+1] = obj
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
80 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
81 else
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
82 drawList[#drawList+1] = obj
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
83 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
84 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
85
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
86 -- Sort the draw list by the object's draw order
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
87 table.sort(drawList, drawSort)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
88
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
89 -- Draw all the objects in the draw list.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
90 offsetX, offsetY = self.map.offsetX, self.map.offsetY
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
91 for i = 1, #drawList do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
92 obj = drawList[i]
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
93 love.graphics.setColor(r,b,g,a)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
94 drawList[i]:draw(di.x, di.y, unpack(self.color or neutralColor))
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
95 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
96
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
97 -- Reset the color and line width
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
98 love.graphics.setColor(r,b,g,a)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
99 love.graphics.setLineWidth(line)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
100 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
101
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
102 ---------------------------------------------------------------------------------------------------
|
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.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
104 function ObjectLayer:toCustomLayer(convert)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
105 if convert then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
106 for i = 1, #self.objects do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
107 self.objects[i] = convert(self.objects[i])
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
108 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
109 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
110 self.class = "CustomLayer"
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
111 return setmetatable(self, nil)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
112 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
113
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
114 ---------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
115 -- Return the ObjectLayer class
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
116 return ObjectLayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
117
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
118
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
119 --[[Copyright (c) 2011-2012 Casey Baxter
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
120
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
121 Permission is hereby granted, free of charge, to any person obtaining a copy
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
122 of this software and associated documentation files (the "Software"), to deal
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
123 in the Software without restriction, including without limitation the rights
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
124 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
125 copies of the Software, and to permit persons to whom the Software is
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
126 furnished to do so, subject to the following conditions:
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
127
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
128 The above copyright notice and this permission notice shall be included in
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
129 all copies or substantial portions of the Software.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
130
|
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
|
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
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
133 other dealings in this Software without prior written authorization.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
134
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
135 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
136 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
137 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
138 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
139 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
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
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
141 THE SOFTWARE.--]]
|