quick-cocos中定时器的使用

本文深入探讨游戏开发中定时器的应用场景与优化策略,通过实例展示如何利用快速库(quick)中的定时器功能,实现每帧调用、指定时间调用以及间隔调用等需求,并提供自定义间隔调用的实现方式。同时,介绍如何通过快速库的封装,简化定时器的使用过程,提升游戏逻辑的执行效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

定时器用的地方还是比较多的,游戏中的逻辑判断很多都是采用每帧执行。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中没有封装的,但是我们还是可以自己动手实现一下,原理也很简单,每次执行一次就计个数,达到指定的次数就停止定时器,

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了,大家可以自己试一试哈。

定时器就是这样子了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值