Pico-8 协同程序偶尔失效

我试图用协同程序来代替 for 循环来移动星星:

--原代码
function _update()
 for c in all(boids) do
  move_boid(c)
 end
end

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

注意到一定数量的星星被冻结了(我很确定数量是固定的):

boids

但是为什么呢?我该怎么处理呢?完整代码请见 itch

点赞
用户3340588
用户3340588

感谢 @Vald 和 @Egor 的评论。似乎问题是由 "太长的协程 "造成的,在 PICO-8 周期内难以完成。因此,解决方法是将未完成的协程存储在一个表中,在未完成时恢复它们。但不知何故,移动方式发生了变化,有点像 "丢失帧"。

下面是我编辑过的代码:

function _init()
 -- 代码
 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)
 -- 代码
 yield()
 -- 代码
end

只需在完成之前暂停。


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

function _init()
 -- 代码
 -- 创建协程
 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

-- 并将移动函数包装在一个循环中
function move_boid(c)
 while true do
  -- 代码
  yield()
  -- 代码
  yield()
 end
end
2019-01-15 09:18:26