zoukankan      html  css  js  c++  java
  • quick-cocos2d-x游戏开发【7】——scheduler 定时器

    定时器用的地方还是比較多的,游戏中的逻辑推断非常多都是採用每帧运行。quick对于schedule的封装在scheduler这个lua文件里。假设是第一次接触quick的话,可能依照官方的api来写一个定时器被报错,提示schedule是一个nil值,这是由于其它的模块在初始化时都是被载入的,只有这个scheduler没有载入,所以在使用的时候,第一件事是引入这个模块,

    local scheduler = require("framework.scheduler")

    剩下的就能够看着api来写了,在写quick的定时器之前还是再复习一下cocos2dx原生lua对于定时器的写法。

    每帧调用的,

    void scheduleUpdateWithPriority (int priority)

    void scheduleUpdateWithPriorityLua (int nHandler,int priority)


    指定调用间隔时间的,

    unsigned int scheduleScriptFunc (unsigned int nHandler, float fInterval, bool bPaused)


    还有取消定时器事件

    void unscheduleScriptEntry (unsigned int uScheduleScriptEntryID)


    quick的scheduler主要是对后面两个函数的封装。在c++的cocos使用中,我们使用定时器,无非就是每帧调用,间隔时间调用无数次,间隔时间调用指定次数,间隔时间调用一次,取消调用这几个。

    我们依次来看下,

    每帧调用,

        local time = 0
        local function update(dt)
            time = time + 1
            label:setString(string.format("%d", time))
        end
    
        scheduler.scheduleUpdateGlobal(update)

    间隔一定时间调用,

        local time = 0
        local function onInterval(dt)
            time = time + 1
            label:setString(string.format("%d", time))
        end
    
        scheduler.scheduleGlobal(onInterval, 1)


    间隔时间调用一次,这个封装的不错,非经常常使用

        local time = 0
        local function onInterval(dt)
            time = time + 1
            label:setString(string.format("%d", time))
            print("over")
        end
    
        scheduler.performWithDelayGlobal(onInterval, 1)

    能够看下这个是怎么实现的,

    function scheduler.performWithDelayGlobal(listener, time)
        local handle
        handle = sharedScheduler:scheduleScriptFunc(function()
            scheduler.unscheduleGlobal(handle)
            listener()
        end, time, false)
        return handle
    end

    事实上就是在间隔一定时间后,将其停止,然后运行一次回调函数就能够了。


    封装的最后一个是停止这些定时器,

    scheduler.unscheduleGlobal()

    它的參数是前面那些定时器返回的句柄,所以假设须要在后面停止掉,记得在创建的留一个返回值就好了。


    只是在游戏中,我们可能会做一个倒计时,也就是间隔一定时间调用指定的次数,这个是在quick中没有封装的,可是我们还是能够自己动手实现一下,原理也非常easy,每次运行一次就计个数,达到指定的次数就停止定时器,

        local handle
        local interval = 1
        local repeatIndex = 3
        local index = 0
        local sharedScheduler = CCDirector:sharedDirector():getScheduler()
        handle = sharedScheduler:scheduleScriptFunc(function()
            index = index + 1
            label:setString(string.format("%d", index))
            if index >= repeatIndex then
                scheduler.unscheduleGlobal(handle)
                print("over")
            end
        end, interval, false)


    效果如图



    这样就ok了,大家能够自己试一试哈。

    定时器就是这样子了。


  • 相关阅读:
    [bzoj3527][Zjoi2014]力_FFT
    [bzoj2194]快速傅立叶之二_FFT
    [bzoj2179]FFT快速傅立叶_FFT
    [bzoj3196][Tyvj1730]二逼平衡树_树套树_位置线段树套非旋转Treap/树状数组套主席树/权值线段树套位置线段树
    [bzoj3436]小K的农场_差分约束
    [bzoj3712][PA2014]Fiolki_倍增LCA
    [bzoj2208][Jsoi2010]连通数_bitset_传递闭包floyd
    [bzoj2150]部落战争_二分图最小路径覆盖
    [bzoj1059][ZJOI2007]矩阵游戏_二分图最大匹配
    python_SMTP and POP3
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4548965.html
Copyright © 2011-2022 走看看