Pico-8协程偶尔会死亡

时间:2019-01-15 06:23:44

标签: lua pico-8

我试图用协程替换for循环来移动星星:

--fine
function _update()
 for c in all(boids) do
  move_boid(c)
 end
end

--broken
function _update()
 for c in all(boids) do
  coresume(cocreate(move_boid),c)
 end
end

请注意,冻结了固定数量的星星(我很确定数量是固定的):

boids

但是为什么呢?我该如何处理?完整的代码位于itch上。

1 个答案:

答案 0 :(得分:0)

感谢@Vald和@Egor的评论。似乎问题是由“太长的协程”导致的,无法在PICO-8循环中完成。因此,解决方案是将未完成的协程存储在表中,如果未完成则将其恢复。但是动作发生了某种变化,有点像“丢帧”。

这是我编辑的代码:

function _init()
 -- code
 cors={}
end

function _update()
 for i=1,#boids do
  local co=cocreate(move_boid)
  local c=boids[i]
  add(cors,co)
  coresume(co,c)
 end
 for co in all(cors) do
  if (co and costatus(co)!="dead") then
   coresume(co)
  else
   del(cors,co)
  end
 end
end

还要修改计算功能,在中间添加新行:

function move_boid(c)
 -- code
 yield()
 -- code
end

在完成之前屈服。


更新:另一种方法是重用协程。

function _init()
 -- code
 -- create coroutines
 cors={}
 for i=1,#boids do
  local co=cocreate(move_boid)
  local c=boids[i]
  add(cors,co)
  coresume(co,c)
 end
end

function _update()
 foreach(cors,coresume)
end

-- and wrap the move function with a loop
function move_boid(c)
 while true do
  -- code
  yield()
  -- code
  yield()
 end
end