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
|
Sprite = {}
Sprite.__index = Sprite
function Sprite.new(tex_name, opts)
local self = setmetatable({}, Sprite)
opts = opts or {}
self.tex = get_tex(tex_name)
self.anim = get_anim(tex_name)
self.active_tag = self.anim.default_tag
self.frame = self.anim.tags[self.active_tag].from
self.timer = 0
local width, height = self.tex:getDimensions()
self.width = width / self.anim.frame_count
self.height = height
local offsetx = opts.offsetx or 0
local offsety = opts.offsety or 0
if offsetx < 1 and offsetx > -1 then
self.offsetx = self.width * offsetx
else
self.offsetx = offsetx
end
if offsety < 1 and offsety > -1 then
self.offsety = self.height * offsety
else
self.offsety = offsety
end
return self
end
register_comp("Sprite", function(ent, tex_name, opts)
ent.sprite = Sprite.new(tex_name, opts)
end)
function sprite_anim_sys(ent, dt)
local sprite = ent.sprite
local tag = sprite.anim.tags[sprite.active_tag]
sprite.timer = sprite.timer + dt
if sprite.timer > tag.duration then
sprite.frame = sprite.frame + 1
sprite.timer = 0
end
if sprite.frame >= tag.to then
sprite.frame = tag.from
end
if sprite.frame < tag.from then
sprite.frame = tag.from
end
end
function sprite_draw_sys(ent)
local sprite = ent.sprite
local q = lg.newQuad(
sprite.width * sprite.frame, 0,
sprite.width, sprite.height,
sprite.tex:getDimensions()
)
lg.draw(
sprite.tex, q,
ent.x or 0, ent.y or 0,
0, 1, 1,
sprite.offsetx, sprite.offsety
)
end
|