diff options
author | the lemons <citrons@mondecitronne.com> | 2023-03-25 05:07:20 -0500 |
---|---|---|
committer | the lemons <citrons@mondecitronne.com> | 2023-03-25 05:07:20 -0500 |
commit | 96ae18ce6bd9647052896f71fc3289f1a0b94bed (patch) | |
tree | acaebf0e2a483ed5d7c6777b0f1561e06e74d3aa | |
parent | f9c0d381e1f7ec8eb0e93a296b1dcd32f9c4d57e (diff) |
parallel tasks
-rw-r--r-- | evloop.lua | 20 | ||||
-rw-r--r-- | main.lua | 36 |
2 files changed, 36 insertions, 20 deletions
@@ -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 @@ -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 |