本文章原作者SC
在游戏脚本中,有时候需要用到多线程并发操作,比如人物有10个Buffer需要加,那么没有并发机制时,只能在每次释放一次技能后调用10个函数去分别检测和加Buffer。如果有多线程,那么可以给每个Buffer创建一个线程,在循环中一直循环检测和加Buffer,这样在打怪过程中,就不需要再去关注Buffer的问题。
Lua中没有真正的多线程,而且使用协同程序来模拟并发操作,这样的好处是避免的多线程中的同步问题,而且可以更自由的控制各个函数的时间片,例如上面加多个Buffer的问题可以在Lua中这样写:
function addBuffer1() -- 循环检测和补充buffer1
while true do -- 主循环
if getColor(100, 100) ~= 0x000000 then -- 如果没有buffer1
touchDown(0, 100, 100); -- 释放buffer1
touchUp(0);
end
mSleep(500);
coroutine.yield(); -- 主动挂起自己
end
end
function addBuffer2() -- 循环检测和补充buffer2
while true do -- 主循环
if getColor(200, 200) ~= 0x000000 then -- 如果没有buffer2
touchDown(0, 200, 200); -- 释放buffer2
touchUp(0);
end
mSleep(500);
coroutine.yield(); -- 主动挂起自己
end
end
function addBuffer3() -- 循环检测和补充buffer3
while true do -- 主循环
if getColor(300, 300) ~= 0x000000 then -- 如果没有buffer3
touchDown(0, 300, 300); -- 释放buffer3
touchUp(0);
end
mSleep(500);
coroutine.yield(); -- 主动挂起自己
end
end
function addBuffer4() -- 循环检测和补充buffer4
while true do -- 主循环
if getColor(400, 400) ~= 0x000000 then -- 如果没有buffer4
touchDown(0, 400, 400); -- 释放buffer4
touchUp(0);
end
mSleep(500);
coroutine.yield(); -- 主动挂起自己
end
end
function addBuffer5() -- 循环检测和补充buffer5
while true do -- 主循环
if getColor(500, 500) ~= 0x000000 then -- 如果没有buffer5
touchDown(0, 500, 500); -- 释放buffer5
touchUp(0);
end
mSleep(500);
coroutine.yield(); -- 主动挂起自己
end
end
function kill() -- 循环打怪一直到怪物死亡
while true do
if getColor(600, 600) ~= 0x000000 then -- 如果怪物没死
touchDown(0, 1000, 1000); -- 释放一次技能
touchUp(0);
end
mSleep(500);
coroutine.yield(); -- 主动挂起自己
end
end
function main()
co1 = coroutine.create(addBuffer1);
co2 = coroutine.create(addBuffer2);
co3 = coroutine.create(addBuffer3);
co4 = coroutine.create(addBuffer4);
co5 = coroutine.create(addBuffer5);
co6 = coroutine.create(kill);
while true do
coroutine.resume(co1);
coroutine.resume(co2);
coroutine.resume(co3);
coroutine.resume(co4);
coroutine.resume(co5);
coroutine.resume(co6);
end
end
上面的main函数在一个循环中负责切换各个协程,每个协程虽然是一个循环,但是会在做一些操作后主动挂起自己,让其他协程可以运行,这样就可以模拟出并发执行的效果。
其实并没有,你这样子反而更复杂,在挂机打怪的情况下,可以在写一个函数,里面可以放你这些东西。