用捕捉函数解决如何在多个动作结束后回调函数实现

  前几天在练习制作一个消除游戏,其中多次遇到这样一个问题:怎么在多个动作结束后,再回调一个函数?比如说,在消除几个宝石后,才需要刷新布局。那么只要有一个宝石的动作没有结束,就不能回调刷新的函数。

  在cocos2d-x当中,提供了CallFunc这样一个动作,可以在一个动作结束后回调一个函数。可是这仅仅适用于一个节点的动作,多个节点就不知道如何是好了。好像用CallFunc这条路是走不通了。想来想去,我找到一个比较笨的办法,但并不影响效率,却完美解决了问题。

  那就是用schedule做一个捕捉函数——这是我给它起的名字。它有这样的特性:

  1.捕捉部分:每帧(或者很短时间间隔)调用,对节点的状态进行捕捉,若不满足条件那么返回;

  2.处理部分:当捕捉到后,立即unschedule停止捕捉,然后执行后续逻辑代码。

  这样在一个节点动作结束完毕后,给它设置一个状态位,捕捉函数就能在下一个时间步内捕捉到该节点的状态。一旦所有节点状态都满足了要求,那么立即停止捕捉,随后回调一个函数。

  拿消除的捕捉函数作例子,代码如下:

void JewelsGrid::onJewelsCrushing(float dt)
{
    //捕捉宝石消除状态,如果有宝石还在消除,那么继续捕捉
    for (auto jewel : m_crushJewelBox)
    {
        if (jewel->isCrushing())
        {
            //log("crushing");
            return;
        }
    }

    //如果全部宝石已经消除完毕,停止捕捉函数
    unschedule(schedule_selector(JewelsGrid::onJewelsCrushing));

    m_crushJewelBox.clear(); //清空消除宝石盒子

    log("crush over!");
    log("begin to refresh!");

    //刷新宝石阵列,并开启刷新状态捕捉函数
    refreshJewelsGrid();
    schedule(schedule_selector(JewelsGrid::onJewelsRefreshing));
}

  每一帧遍历每一个正在消除的宝石,一旦全部消除完成,那么立即停止捕捉。并依次执行之后的逻辑代码。消除完后就是刷新布局,它也是要进行多个动作然后回调一个函数的,因此使用了同样的机制。可以看出,使用捕捉函数的方法就是:将其和动作函数写在一起,保证在同一帧开始动作,同一帧开始捕捉。

时间: 2024-10-22 04:03:15

用捕捉函数解决如何在多个动作结束后回调函数实现的相关文章

jquery1.2以上 待url载入文件地址 成功载入后回调函数

jQuery.getScript('url',function(){}) jquery1.2以上    待url载入文件地址  成功载入后回调函数 $.getScript('test.js') 加载并执行js $.getScript('test.js',function(){ //code }) 加载并执行js文件  成功后去执行代码

原生js判断css动画结束 css 动画结束的回调函数

原文:原生js判断css动画结束 css 动画结束的回调函数 css3 的时代,css3--动画 一切皆有可能: 传统的js 可以通过回调函数判断动画是否结束:即使是采用CSS技术生成动画效果,JavaScript仍然能捕获动画或变换的结束事件: transitionend事件和animationend事件标准的浏览器事件,但在WebKit浏览器里你仍然需要使用webkit前缀,所以,我们不得不根据各种浏览器分别检测事件 var transitions = { 'transition':'tra

NG循环结束后执行函数:(用于瀑布流,下拉框,及相关需要插座dom插件之类的场景)

先定义指令: app.directive('onFinishRender',function ($timeout) { return { restrict: 'A', link: function (scope, element, attr) { if (scope.$last === true) { $timeout(function () { scope.$emit('ngRepeatFinished'); // scope.isSelectShow = false; }); } } } }

Bootstrap弹窗插件(拟态框)关闭后回调函数

$(function(){ $('#questionnaire').on('hidden.bs.modal',function(){ //清除缓存方法 }); }); 事件 Bootstrap 的模态框类提供了一些事件用于监听并执行你自己的代码. All modal events are fired at the modal itself (i.e. at the ). 事件类型 描述 show.bs.modal show 方法调用之后立即触发该事件.如果是通过点击某个作为触发器的元素,则此元素

$.getJSON() 回调函数没有执行的原因

$.getJSON() 方法使用 AJAX 的 HTTP GET 请求获取 JSON 数据. 语法 $.getJSON(url,data,success(data,status,xhr)) url必填规定请求发送到那个url: data可选规定发送到服务器的数据: success可选data包含服务器返回的数据, status包含请求的状态,("success"."notmodified"."error"."timeout".

javascript回调函数,闭包作用域,call,apply函数解决this的作用域问题

在JavaScrip中,function是内置的类对象,也就是说它是一种类型的对象,可以和其它String.Array.Number.Object类的对象一样用于内置对象的管理.因为function实际上是一种对象,它可以“存储在变量中,通过参数传递给(别一个)函数(function),在函数内部创建,从函数中返回结果值”. 因为function是内置对象,我们可以将它作为参数传递给另一个函数,延迟到函数中执行,甚至执行后将它返回.这是在JavaScript中使用回调函数的精髓.本篇文章的剩余部

JavaScript中的回调函数

在学习JavaScript的过程中遇到了很多,使用到回调函数的例子,出现了许多疑问,就由一个栗子开始吧: 在JavaScript中接触的第一个回调函数是在setInterval()和setTimeout()中出现的: 1 var num = 10; 2 3 var interValId = setInterval(function (){ 4 console.log(num); 5 num--; 6 if(num==0){ 7 clearInterval(interValId); 8 } 9 }

=> 应用在js回调函数中

=> 可以简化以前的回调函数的调用,具体来说: 今后,几乎所有的回调函数都可用箭头函数简化 比如: 1. 所有回调函数都可: 去function改=> 2. 如果函数体只有一句话: 可省略{} 如果这一句话还是return,可省略return 3. 如果只有一个参数: 可省略() 但是,如果没有参数,必须保留空() 更大用途: 箭头函数内外共用同一个this--取代bind 特殊: 如果不希望内外共用this,就不能用箭头函数 比如事件处理函数: elem.addEventListener(&

前端基本知识(四):JS的异步模式:1、回调函数;2、事件监听;3、观察者模式;4、promise对象

JavaScript语言将任务的执行模式可以分成两种:同步(Synchronous)和异步(Asychronous). “同步模式”就是一个任务完成之后,后边跟着一个任务接着执行:程序的执行顺序和排列顺序是一直的:”异步模式”则完全不同,每一个任务都有一个或者多个回调函数(callback),前一个任务结束的时候,不是执行下一个任务,二十执行回调函数,后一个任务则是不等前一个任务结束就执行,所以程序的执行顺序与任务顺序不一致的,异步的. 在浏览器端,耗时时间长的操作都应该异步执行,避免浏览器数去