summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorthe lemons <citrons@mondecitronne.com>2023-03-25 05:07:20 -0500
committerthe lemons <citrons@mondecitronne.com>2023-03-25 05:07:20 -0500
commit96ae18ce6bd9647052896f71fc3289f1a0b94bed (patch)
treeacaebf0e2a483ed5d7c6777b0f1561e06e74d3aa
parentf9c0d381e1f7ec8eb0e93a296b1dcd32f9c4d57e (diff)
parallel tasks
-rw-r--r--evloop.lua20
-rw-r--r--main.lua36
2 files changed, 36 insertions, 20 deletions
diff --git a/evloop.lua b/evloop.lua
index c72f920..57e15c0 100644
--- a/evloop.lua
+++ b/evloop.lua
@@ -30,6 +30,7 @@ end
local function create_task(fn)
local task = {}
task.co = coroutine.create(fn)
+ resume_task(task)
return task
end
@@ -51,6 +52,19 @@ function M.queue(...)
table.insert(queue, {...})
end
+function M.await_any(...)
+ local tasks = {...}
+ for i, t in ipairs(tasks) do
+ tasks[i] = create_task(t)
+ end
+ while true do
+ local e = coroutine.yield()
+ for _, t in ipairs(tasks) do
+ if not resume_task(t, e) then return end
+ end
+ end
+end
+
function M.mainloop(start)
local main = create_task(function()
start()
@@ -76,16 +90,16 @@ function M.mainloop(start)
local q = queue
queue = {}
for i, e in ipairs(q) do
- if not resume_task(main, e) then return end
+ if not resume_task(main, e) then return 0 end
end
local dt = love.timer.step()
- if not resume_task(main, {"update", dt}) then return end
+ if not resume_task(main, {"update", dt}) then return 0 end
if love.graphics and love.graphics.isActive() then
love.graphics.origin()
love.graphics.clear(love.graphics.getBackgroundColor())
- if not resume_task(main, {"draw", dt}) then return end
+ if not resume_task(main, {"draw", dt}) then return 0 end
love.graphics.present()
end
diff --git a/main.lua b/main.lua
index 2c7308e..73f762b 100644
--- a/main.lua
+++ b/main.lua
@@ -1,14 +1,13 @@
+local evloop = require "evloop"
local playfield = require "game.playfield"
local tetrominoes = require "game.tetrominoes"
-local field
+local field = playfield.new(20, 10)
local piece
-function love.load()
- field = playfield.new(20, 10)
-end
+local function draw()
+ evloop.poll "draw"
-function love.draw()
local _, height = love.graphics.getDimensions()
local size = height / field.lines
@@ -40,9 +39,12 @@ function love.draw()
end
end
end
+
+ return draw()
end
local function gravity()
+ evloop.sleep(0.5)
field:remove_cleared()
if not piece then
piece = tetrominoes.l:drop(field)
@@ -53,20 +55,11 @@ local function gravity()
piece = nil
end
end
+ return gravity()
end
-local interval = 0.5
-local ellapsed = 0
-
-function love.update(dt)
- ellapsed = ellapsed + dt
- while ellapsed >= interval do
- gravity()
- ellapsed = ellapsed - interval
- end
-end
-
-function love.keypressed(key)
+local function inputs()
+ local _, key = evloop.poll "keypressed"
if piece then
if key == "left" then
piece:move(0, -1)
@@ -78,4 +71,13 @@ function love.keypressed(key)
piece:rotate()
end
end
+ return inputs()
+end
+
+function love.run()
+ if love.load then love.load(love.arg.parseGameArguments(arg), arg) end
+ if love.timer then love.timer.step() end
+ return evloop.mainloop(function()
+ evloop.await_any(inputs, gravity, draw)
+ end)
end