aboutsummaryrefslogtreecommitdiff
path: root/src/objs/specks.lua
diff options
context:
space:
mode:
Diffstat (limited to 'src/objs/specks.lua')
-rw-r--r--src/objs/specks.lua59
1 files changed, 59 insertions, 0 deletions
diff --git a/src/objs/specks.lua b/src/objs/specks.lua
new file mode 100644
index 0000000..a3a21c5
--- /dev/null
+++ b/src/objs/specks.lua
@@ -0,0 +1,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