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
|
-- `Effect`
-- Short animation with graphics that plays in various situation.
-- Metatable of `Effect`
-- nils initialized in constructor
Effect = {
x = 0,
y = 0,
delay = 0.08,
initial = nil,
frame = 1,
animation = nil,
sprite = love.graphics.newImage("assets/effects.png"),
quads = {
jump = {
[1] = love.graphics.newQuad( 0, 0, 24,24, 168,120),
[2] = love.graphics.newQuad( 24, 0, 24,24, 168,120),
[3] = love.graphics.newQuad( 48, 0, 24,24, 168,120),
[4] = love.graphics.newQuad( 72, 0, 24,24, 168,120),
frames = 4
},
doublejump = {
[1] = love.graphics.newQuad( 0, 24, 24,24, 168,120),
[2] = love.graphics.newQuad( 24, 24, 24,24, 168,120),
[3] = love.graphics.newQuad( 48, 24, 24,24, 168,120),
[4] = love.graphics.newQuad( 72, 24, 24,24, 168,120),
frames = 4
},
land = {
[1] = love.graphics.newQuad( 0, 48, 24,24, 168,120),
[2] = love.graphics.newQuad( 24, 48, 24,24, 168,120),
[3] = love.graphics.newQuad( 48, 48, 24,24, 168,120),
[4] = love.graphics.newQuad( 72, 48, 24,24, 168,120),
[5] = love.graphics.newQuad( 96, 48, 24,24, 168,120),
frames = 5
},
respawn = {},
clash = {},
trail = {},
hit = {}
}
}
-- NAME :POSITION :SIZE :FRAMES
-- jump :x 0 y 0: 24px: 4
-- doublejump:x 0 y 24: 24px: 4
-- land :x 0 y 48: 24px: 5
-- respawn :x 0 y 72: 24px: 7
-- clash :x 0 y 96: 24px: 6
-- trail :x104 y 0: 16px: 4
-- hit :x106 y 18: 16px: 3
-- Construct of `Effect`
function Effect:new(name, x, y)
-- Meta
local o = {}
setmetatable(o, self)
self.__index = self
-- Set filter
local min, mag = self.sprite:getFilter()
if min ~= "nearest" or
mag ~= "nearest" then
self.sprite:setFilter("nearest", "nearest")
end
-- Init
o.initial = o.delay
o.animation = name
o.x = x or self.x
o.y = y or self.y
return o
end
-- Animation and return flag for deletion after completion
-- returns true if completed and ready to delete
function Effect:update(dt)
self.delay = self.delay - dt
if self.delay < 0 then
if self.frame < self.quads[self.animation].frames then
self.frame = self.frame + 1
self.delay = self.delay + self.initial
else
return true -- delete
end
end
return false
end
-- Draw me with scale and offsets, senpai
function Effect:draw(offset_x, offset_y, scale)
-- defaults
local offset_x = offset_x or 0
local offset_y = offset_y or 0
local scale = scale or 1
-- draw
love.graphics.setColor(255,255,255,255)
love.graphics.draw(self.sprite, self.quads[self.animation][self.frame], (self.x+offset_x)*scale, (self.y+offset_y)*scale, 0, scale, scale)
end
|