Lua模拟多并发加Buffer

发布于 2019-08-07 10:26:24

本文章原作者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函数在一个循环中负责切换各个协程,每个协程虽然是一个循环,但是会在做一些操作后主动挂起自己,让其他协程可以运行,这样就可以模拟出并发执行的效果。

1 条评论

发布
问题