aboutsummaryrefslogtreecommitdiff
path: root/src/objs/specks.lua
blob: a3a21c54ac7580107b669ce9e2cc63c8d4deaac3 (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
Speck_Sys = {}
Speck_Sys.__index = Speck_Sys

function Speck_Sys.new(texture)
  local self = setmetatable({}, Speck_Sys)

  self.data = {
    size = 0,
    pos = {},
    vel = {},

    lifetime = {},
    lifetime_max = {},

    scale_start = {},
    scale_end = {}
  }

  self.scale_curve = lerp
  self.scale_min = 1
  self.scale_max = 1

  self.scale_end_min = 1
  self.scale_end_max = 1

  self.texture = texture
end

function Speck_Sys:process(dt)
  local data = self.data

  for i = 1, data.size do
    -- dead particles skip
    if data.lifetime[i] <= 0 then
      goto next_speck_process
    end

    data.pos[i].x = data.pos[i].x + data.vel[i].x * dt
    data.pos[i].y = data.pos[i].y + data.vel[i].y * dt

    data.lifetime[i] = data.lifetime[i] - dt

    ::next_speck_process::
  end
end

function Speck_Sys:draw()
  local scale_curve = self.scale_curve
  local data = self.data

  for i = 1, data.size do
    local anim = data.lifetime[i] / data.lifetime_max[i]
    local scale = scale_curve(self.scale_start, self.scale_end, anim)

    lg.draw(
      self.texture, data.pos[i].x, data.pos[i].y
    )
  end
end