lua - Pico-8 协程偶尔会死掉

标签 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 .

最佳答案

感谢@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

关于lua - Pico-8 协程偶尔会死掉,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54193676/

相关文章:

lua - 使用 Lua 中的函数修改链表

lua - 存储为字符串的简单 Lua 表的反序列化

lua - 如何用lua编写星型图案程序?

lua - 如何使用 torch 的类系统创建自定义类

c# - C# 的 Lua 包装器?

c++ - 使用 require(..) 或 dofile(..) 在 Lua 中加载 .dll

performance - Lua:代码优化向量长度计算