2
-- A tile repeats a single image across its dimensions. If you do
3
-- not specify a width and height, the sprite will size itself so
4
-- that it's exactly as big as its source image.
12
-- The image to tile across the sprite.
14
-- Property: imageOffset
15
-- Setting this moves the top-left corner of the tile inside
16
-- the sprite's rectangle. To draw as normal, set both x and y
18
imageOffset = { x = 0, y = 0 },
20
-- private property: keeps track of properties that need action
21
-- to be taken when they are changed
22
-- image must be a nonsense value, not nil,
23
-- for the tile to see that an image has been set if it
25
_set = { image = -1, imageOffset = { x = 0, y = 0 } },
27
-- private property imageObj: actual Image instance used to draw
28
-- this is normally set via the image property, but you may set it directly
29
-- so long as you never change that image property afterwards.
31
new = function (self, obj)
35
if obj.image then obj:updateQuad() end
36
if obj.onNew then obj:onNew() end
40
updateQuad = function (self)
42
self._imageObj = Cached:image(self.image)
43
if not self.width then self.width = self._imageObj:getWidth() end
44
if not self.height then self.height = self._imageObj:getHeight() end
46
self._quad = love.graphics.newQuad(self.imageOffset.x, self.imageOffset.y,
47
self.width, self.height,
48
self._imageObj:getWidth(), self._imageObj:getHeight())
49
self._imageObj:setWrap('repeat', 'repeat')
50
self._set.image = self.image
51
self._set.imageOffset.x = self.imageOffset.x
52
self._set.imageOffset.y = self.imageOffset.y
56
draw = function (self, x, y)
57
if not self.visible or self.alpha <= 0 then return end
59
x = math.floor(x or self.x)
60
y = math.floor(y or self.y)
63
assert(type(x) == 'number', 'visible fill does not have a numeric x property')
64
assert(type(y) == 'number', 'visible fill does not have a numeric y property')
65
assert(type(self.width) == 'number', 'visible fill does not have a numeric width property')
66
assert(type(self.height) == 'number', 'visible fill does not have a numeric height property')
69
if not self.image then return end
71
-- set color if needed
73
local colored = self.alpha ~= 1 or self.tint[1] ~= 1 or self.tint[2] ~= 1 or self.tint[3] ~= 1
76
love.graphics.setColor(self.tint[1] * 255, self.tint[2] * 255, self.tint[3] * 255, self.alpha * 255)
79
-- if the source image or offset has changed, we need to recreate our quad
81
if self.image and (self.image ~= self._set.image or
82
self.imageOffset.x ~= self._set.imageOffset.x or
83
self.imageOffset.y ~= self._set.imageOffset.y) then
88
local scaleX = self.scale * self.distort.x
89
local scaleY = self.scale * self.distort.y
91
if self.flipX then scaleX = scaleX * -1 end
92
if self.flipY then scaleY = scaleY * -1 end
94
love.graphics.drawq(self._imageObj, self._quad, x + self.width / 2, y + self.height / 2, self.rotation,
95
scaleX, scaleY, self.width / 2, self.height / 2)
100
love.graphics.setColor(255, 255, 255, 255)
103
Sprite.draw(self, x, y)
106
__tostring = function (self)
107
local result = 'Tile (x: ' .. self.x .. ', y: ' .. self.y ..
108
', w: ' .. self.width .. ', h: ' .. self.height .. ', '
110
result = result .. 'image \'' .. self.image .. '\', '
113
result = result .. 'active, '
115
result = result .. 'inactive, '
119
result = result .. 'visible, '
121
result = result .. 'invisible, '
125
result = result .. 'solid'
127
result = result .. 'not solid'