time:2015/05/14

描述
lua下使用node的pause函数想暂停layer上的所有动画,结果没有效果
1. pause函数
(1)cc.Node:pause
代码:
void Node ::pause (){_scheduler-> pauseTarget(this );_actionManager-> pauseTarget(this );_eventDispatcher-> pauseEventListenersForTarget(this );}

分析:

* 暂停三个内容:定时器Schedule(其实也是全局的)、actionManager管理的所有动画、事件触发器
* 这里要理解一下三个暂停的原理是什么?
1)Schedule暂停的原理
* 找两个hash表_hashForTimers和_hashForUpdates看有没有我的这个定时器,有的话标记为paused=ture,那么在update函数的时候,就不会调用定时器的回调函数,以实现暂停
2)actionManager暂停原理
* 也是找ActionManager类的成员变量_targets,也是一个hash表。然后检测当前的Node是不是在这个hash表里面,如果在也标记paused为true,在update函数的不执行update函数实现暂停。注意一点,后面有用:就是action默认都是和一个Node绑定的
3)event的暂停原理
* 也是找节点Node所在的hash表,同上面其实也是一样的
(2)cc.Director:pause
代码:
分析:
* 只是把_paused标记为true
* _paused是在drawScene函数中不执行定时器和事件的函数,所以这个结果就是所有的定时器和事件触发器都暂停了,因为都没有执行函数了,但是所有动作还是继续执行!
(3)自己执行pause
* 自己写个for循环,暂停所有的节点
for k, v in pairs(layer:getChildren()) dov:pause()end

2. Lua的pause函数为什么没有起作用?

分析:
* 仔细看代码pause函数,发现只会暂停当前节点的动作,看ActionManager就可以看到,没有遍历所有的子节点
* 定时器和触发事件暂停也只是跟自己有关,即调用没pause函数的那个Node,其他的依旧没有影响,但是因为这两个都是全局的,或者说跟调用的layer没有关系,所以也是没有效果
3. 测试代码(自己记录)
    --test page@2015/04/15 : pauselocal moveBy = cc.MoveBy:create(2, cc.p(100, 0))local actionMove = cc.Sequence:create(moveBy, moveBy:reverse());layer:runAction(cc.RepeatForever:create(actionMove))local btnPause = cc.MenuItemImage:create("Images/pauseBtn.png","Images/pauseBtn.png");btnPause:setScale(3)local bPaused = false;local call = function(sender)if not bPaused thenbPaused = true;layer:pause();print("pause ... ")elsebPaused = false;layer:resume();print("resume ... ")endend-- btnPause:addTouchEventListener(call)
    btnPause:registerScriptTapHandler(call)local  menu = cc.Menu:create()menu:setPosition(cc.p(0, 0))menu:addChild(btnPause)layer:addChild(menu)--schedule-- local fnActionPause = function(dt)layer.fnActionPause = function(dt)print("fnActionPause ... ", dt)local sprite = cc.Sprite:create("Images/CyanTriangle.png")local act = cc.DelayTime:create(2)layer:addChild(sprite)sprite:setPosition(VisibleRect:center())local callRemove = function()sprite:removeFromParent(true)endsprite:runAction(cc.Sequence:create(act, cc.CallFunc:create(callRemove)))endlocal scheduler = cc.Director:getInstance():getScheduler();_schedule = scheduler:scheduleScriptFunc(layer.fnActionPause, 3, false)--test end

4. lua和c++接口的区别

(1)c++

  * c++增加定时器或者事件回调函数,不管是selector还是c++ 11中的std::function,都需要保存回调函数的类对象target

  * 拿定时器来说Scheduler::schedule():会把事件加到类的成员变量_hashForTimers中,pauseTarget函数就会处理该结构

void Scheduler::schedule(const ccSchedulerFunc& callback, void *target, float interval, unsigned int repeat, float delay, bool paused, const std::string& key)
{CCASSERT(target, "Argument target must be non-nullptr");CCASSERT(!key.empty(), "key should not be empty!");tHashTimerEntry *element = nullptr;HASH_FIND_PTR(_hashForTimers, &target, element);if (! element){element = (tHashTimerEntry *)calloc(sizeof(*element), 1);element->target = target;HASH_ADD_PTR(_hashForTimers, target, element);// Is this the 1st element ? Then set the pause level to all the selectors of this targetelement->paused = paused;}   //下面的省略掉...}

(2)lua

  * lua添加事件的注册函数为Scheduler::scheduleScriptFunc

  *会把事件回调函数以句柄的方式存放在另外一个结构:_scriptHandlerEntries中

  * 结构_scriptHandlerEntries只有在Scheduler::update函数中同_hashForTimers一样的处理

  *但是!没有pause函数会处理这个结构!!!--->所以理论上lua的事件是没有这个层级上的暂停的(paused=true);
总结

(1)node的pause函数并没有想像中的会暂停layer上的所有children
(2)lua和c++下依旧是有区别的,就是target对象。在c++中会保存回调函数的target对象,但是在lua中只是保存了一个句柄
(3)要想在lua下暂停一个layer下的node,自己循环

转载于:https://www.cnblogs.com/pk-run/p/4441295.html

cocos2dx中node的pause函数(lua)相关推荐

  1. 使用BabeLua3.x在cocos2d-x中编辑和调试Lua

    BabeLua是一款基于VS2012/2013的Lua集成开发环境,具有Lua语法高亮,语法检查,自动补全,快速搜索,注入宿主程序内对Lua脚本进行调试,设置断点观察变量值,查看堆栈信息等功能. 如何 ...

  2. Lua中调用C/C++函数 (转)

    1.前言 上次偶说到从C/C++中调用Lua的函数, 然后就有朋友问从Lua中如何调用C/C++的 函数, 所以偶们这次就来说说这个问题. 首先偶们会在C++中建立一个函数, 然后 告知Lua有这个函 ...

  3. cocos2d-x 中LUA和平台之间的函数调用理解

    先看一张流程图如下: 第一步: 先把NDKHelper中的方法转成LUA中可以调用的,转得方法可参考quick中LUA的用法.这个类主要是中间桥梁的作用,它可以根据是什么平台调用IOSNDKHelpe ...

  4. Matlab中pause函数的使用

    目录 语法 示例 pause函数的作用是暂时停止执行 MATLAB. 语法 pausepause(n)pause(state)oldState = pause(state) (1)pause暂时停止执 ...

  5. linux中的信号3——alarm、pause函数

    以下内容源于朱有鹏<物联网大讲堂>课程的学习,如有侵权,请告知删除. 1.alarm函数 内核以API形式提供的闹钟: 可以为当前进程定义闹钟,时间到了会发出SIGALRM信号. 每个进程 ...

  6. cocos2d-x中的动作分析

    在cocos2d-x中动作的执行调度是受cocos2d-x的全局定时器控制的,当初始完导演后便已经启动用于管理动作的update定时器. bool CCDirector::init(void) {.. ...

  7. cocos2d-x中几种存储数据的方式

    说明:本文所论述内容均基于cocos2dx 3.0 版本. 1.UserDefault 它是cocos2d-x用来存取基本数据类型用的.保存为XML文件格式. 查看CCUserDefault文件,可以 ...

  8. Cocos2dx中零散知识点

    cocos2dx中有三种定时器:schedule,scheduleUpdate,scheduleOnce.功能分别是 每隔几秒调用自定义函数.调用系统默认的update()函数.只调用一次自定义函数 ...

  9. cocos2d 嵌入网页_在 cocos2d-x 中嵌入浏览器

    在 cocos2d-x 中嵌入浏览器 次阅读 Embeds a browser in cocos2d-x 在游戏中嵌入网页是很常见的需求,cocos2d-x 引擎官方并没有提供这个功能. 我在网上转了 ...

最新文章

  1. Java程序员的春天!java引用数据类型和基本数据类型区别
  2. 基于【CentOS-7+ Ambari 2.7.0 + HDP 3.0】HAWQ数据仓库 使用之 gpfdist协议
  3. 收集下阿里集团下的技术BLOG
  4. python框架 mysql数据库_在Python的框架中为MySQL实现restful接口的教程
  5. 关于CSS3实现响应式布局的一些概念和术语
  6. cuda加速的头文件_如何从C ++头文件调用CUDA文件?
  7. 分布式系统监视zabbix讲解十之监控tomcat--技术流ken
  8. python-实现栈结构
  9. Spring IoC-02
  10. 最新网卡驱动下载win7
  11. Uri Herrera 近日宣布 Nitrux 2.1 的发布和普遍可用性
  12. MySQL 导入数据 时间数据 不准确 解决办法
  13. 封装win7系统,安装系统时提示:windows无法完成系统配置,若要尝试恢复配置,请重新启动计算机?
  14. STM32L476 FLASH option bytes
  15. Ubuntu20.04电脑开启热点
  16. 如何从文件夹打开dos界面/命令行工具
  17. 2021csp/s初赛
  18. php 包含字母随机数_php随机生成数字字母组合的方法
  19. json字符串转成 json对象 json对象转换成java对象
  20. 15000 字的 SQL 语句大全!

热门文章

  1. android性能调优的工具,神兵利器-Android 性能调优工具 Hugo
  2. 利用Python进行数据分析--数据加载、存储与文件格式
  3. php加密密码解析,php密码加密解密
  4. bat 调用class文件_拯救写框架的程序员!用字节码替代反射,实现任意函数调用...
  5. envi栅格TIF数据进行分割_栅格数据镶嵌
  6. network reactnative_Chrome 调试 react-native 通过Network面板查看网络请求
  7. 7. 吴恩达机器学习课程-作业7-Kmeans and PCA
  8. 编译原理教程_4 语法分析
  9. html中心点缩放,html canvas 让物体随物体中心缩放
  10. js调用java_Js调用Java方法并互相传参的简单实例