您的位置:首页 > 移动开发 > Cocos引擎

Cocos2d-Lua之协同程序

2016-06-18 08:04 330 查看
协同程序与操作系统中的线程类似,但工作方式是不同的,例如线程的时间片调度算法,当某个线程的时间片用完,系统会自动让该线程等待,让后面的线程运行。而对于协同程序,除非一个正在运行的协同程序被挂起,否则就一直运行到结束才能让其他协同程序运行。

举个例子:

function coroutineFun()
local co = coroutine.create(function(a, b)
for i = 1, 10 do
print(a + b)
coroutine.yield()
end
end)
return co
end

local co = coroutineFun()
for i = 1, 11 do
coroutine.resume(co, i, 6)
print(coroutine.status(co))
end


coroutine.create(函数)    --创建一个协同程序


coroutine.yield()    --将该协同程序挂起


coroutine.resume(co, i, 6)    --运行协同程序,第一个参数是协同程序名称,后面的是协同程序里函数需要传入的参数


coroutine.status(协同程序名称)    --获取协同程序的状态,并返回状态信息


输出结果:



可以看到运行协程时,只有第一次传入的参数起到了作用,后面传入的参数都不被理睬,这就像发射子弹一样,一旦枪口位置和方向决定了,一旦开枪,子弹的运行轨迹就决定了,不会再改变是一个到底,协程就会用来制作这样类似的游戏。

一旦协程被挂起,执行一次就不再执行了,需要不断地resume来继续协程的执行。可以看到,没执行完一次,协程的状态就是suspended(挂起状态),知道全部运行完毕,最后的状态就会变成dead(死亡状态)。

如果这里把协同中的挂起去掉:

function coroutineFun()
local co = coroutine.create(function(a, b)
for i = 1, 10 do
print(a + b)
--coroutine.yield()
end
end)
return co
end

local co = coroutineFun()
for i = 1, 11 do
coroutine.resume(co, i, 6)
print(coroutine.status(co))
end


像这样,输出结果:



可以看到协程就会一直运行到结束。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: