aboutsummaryrefslogtreecommitdiff
path: root/src/sprite.lua
blob: 79a38bf830d1dcdbc9edc0d9d78c2d1a32195ddd (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
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.setColor(1, 1, 1)
  lg.draw(
    sprite.tex, q,
    ent.x or 0, ent.y or 0,
    ent.rotation or 0,
    ent.scalex or ent.scale or 1, ent.scaley or ent.scale or 1,
    sprite.offsetx, sprite.offsety,
    ent.shearx or 0, ent.sheary or 0
  )
end