一 说明
1.1 当前软件环境,Windows10,Cocos Creator 2.4.8,VSCode
1.2 安装VSCode插件 Debugger for Chrome
二 回调动作cc.callFunc 函数
/**
!#en Creates the action with the callback.
!#zh 执行回调函数。
@param selector selector
@param selectorTarget selectorTarget
@param data data for function, it accepts all data types.
@example
```js
// example
// CallFunc without data
var finish = cc.callFunc(this.removeSprite, this);
// CallFunc with data
var finish = cc.callFunc(this.removeFromParentAndCleanup, this._grossini, true);
```
*/
export function callFunc(selector: Function, selectorTarget?: any, data?: any): ActionInstant;
函数cc.callFunc 的返回值,是一个 ActionInstant,代表即时动作。方便在node.runAction中作为参数使用。
cc.callFunc 使用场景,通常是用于顺序执行动作中,回调进行的逻辑处理。
三 测试用例
testRunAction(){
var action1 = cc.delayTime(1);
var action1_print = cc.callFunc(function(){
this.print_timestamp("action1_print");
},this);
var action2 = cc.callFunc(function(target, param){
this.print_timestamp("action2,begin");
var action2_1 = cc.delayTime(10);
var action2_1_print = cc.callFunc(function(){
this.print_timestamp("action2_1_print");
},this);
var action2_2 = cc.moveTo(5, cc.v2(300,300)).easing(cc.easeIn(2));
var action2_2_print = cc.callFunc(function(){
this.print_timestamp("action2_2_print");
},this);
target.runAction(cc.sequence(action2_1,action2_1_print, action2_2, action2_2_print));
this.print_timestamp("action2,end");
}, this);
var action2_print = cc.callFunc(function(){
this.print_timestamp("action2_print");
},this);
var action3 = cc.moveTo(5, cc.v2(200,200)).easing(cc.easeIn(2));
var action3_print = cc.callFunc(function(){
this.print_timestamp("action3_print");
},this);
this.tip.runAction(cc.sequence(action1, action1_print, action2, action2_print, action3, action3_print));
this.print_timestamp("testRunAction()");
},
print_timestamp(param){
var date = new Date();
console.log("print_timestamp(),"+param+","+date.getTime()/1000);
},
VSCode调试控制台输出结果【时间戳单位秒】:
print_timestamp(),testRunAction(),1652580406.619
print_timestamp(),action1_print,1652580407.569
print_timestamp(),action2,begin,1652580407.569
print_timestamp(),action2,end,1652580407.57
print_timestamp(),action2_print,1652580407.57
print_timestamp(),action3_print,1652580412.568
print_timestamp(),action2_1_print,1652580417.582
print_timestamp(),action2_2_print,1652580422.582
大体来看一下这个输出结果:
- 每一个action完成后,我们都有输出时间戳。
- action我们大体分两层,每一层都是使用runAction异步函数创建开启:
- 第一层是 一级动作,代码中使用 action1,action2,action3 标示。
- 第二层是 二级动作,代码中比如 action2_1,action2_2标示。
- 具体的时间线分析如下:
从时间0秒开始,a1开始,delayTime 1秒,结束时间为1秒,a2为回调动作 瞬时动作,完成时间计为0,a3 为 moveTo 5秒。
在a2 中 runAction 新的连续动作,因为 runAction 为异步函数,所以,a2 瞬时完成的同时,开启第二层动作。
a2_1为delayTime 10秒,a2_2为moveTo 5秒。
20220515103446.png
在回调动作 callFunc中开始新的动作,其实不是应该做的,但是出于好奇,测试一下,还是有助于理解runAction异步函数的功能。
学海无涯,错误难免,如有发现,尽请指正。
--the end