我试图用协程替换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
请注意,冻结了固定数量的星星(我很确定数量是固定的):
但是为什么呢?我该如何处理?完整的代码位于itch上。
答案 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