summaryrefslogtreecommitdiffhomepage
path: root/effect.lua
blob: 665191675b456a04dccc50b85508571ca9cff740 (plain)
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