Cocos2d-Lua之协同程序

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

举个例子:

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(协同程序名称)    --获取协同程序的状态,并返回状态信息

输出结果:

Cocos2d-Lua之协同程序_第1张图片

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

一旦协程被挂起,执行一次就不再执行了,需要不断地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

像这样,输出结果:

Cocos2d-Lua之协同程序_第2张图片

可以看到协程就会一直运行到结束。

你可能感兴趣的:(Cocos2dLua)