aboutsummaryrefslogtreecommitdiff
path: root/src/objs/specks.lua
blob: fdfeb26de0e6cde4221390941aa6b61a908635cf (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
98
99
100
101
102
103
104
105
106
107
108
109
110
Speck_Sys = {}
Speck_Sys.__index = Speck_Sys

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

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

    lifetime = {},
    lifetime_max = {},

    scale_start = {},
    scale_end = {}
  }

  self.scale_curve = lerp
  self.scale_start_min = 1
  self.scale_start_max = 1

  self.scale_end_min = 0
  self.scale_end_max = 0

  self.lifetime_min = 1
  self.lifetime_max = 5

  self.interval = 0.1
  self.spawn_timer = self.interval

  self.texture = get_tex("res/img/speck.png")

  self.x = 0
  self.y = 0
  return self
end

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

  self.spawn_timer = self.spawn_timer - dt
  if self.spawn_timer <= 0 then
    self.spawn_timer = self.interval

    data.size = data.size + 1
    data.pos[data.size] = { x = self.x, y = self.y }
    data.vel[data.size] = { x = 0, y = 0 }

    data.lifetime[data.size] = lmath.random(
      self.lifetime_min, self.lifetime_max)
    data.lifetime_max[data.size] = data.lifetime[data.size]

    data.scale_start[data.size] = lmath.random(
      self.scale_start_min, self.scale_start_max)
    data.scale_end[data.size] = lmath.random(
      self.scale_end_min, self.scale_end_max)
  end

  for i = 1, data.size do
    if data.lifetime[i] <= 0 then
      goto next_speck_update
    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_update::
  end
end

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

  for i = 1, data.size do
    if data.lifetime[i] <= 0 then
      goto next_speck_draw
    end

    local anim = 1 - data.lifetime[i] / data.lifetime_max[i]
    local scale = scale_curve(data.scale_start[i], data.scale_end[i], anim)

    local w, h = self.texture:getDimensions()
    w = w * scale
    h = h * scale

    lg.draw(
      self.texture, data.pos[i].x - w/2, data.pos[i].y - h/2, 0, scale
    )
    ::next_speck_draw::
  end
end

register_comp("Speck_System", function(ent)
  ent.speck_sys = Speck_Sys.new()
end)

function speck_update_sys(ent, dt)
  ent.speck_sys.x = ent.x
  ent.speck_sys.y = ent.y

  ent.speck_sys:update(dt)
end

function speck_draw_sys(ent)
  ent.speck_sys:draw()
end