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()) do

     v:pause()

end

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

分析:
* 仔细看代码pause函数,发现只会暂停当前节点的动作,看ActionManager就可以看到,没有遍历所有的子节点
* 定时器和触发事件暂停也只是跟自己有关,即调用没pause函数的那个Node,其他的依旧没有影响,但是因为这两个都是全局的,或者说跟调用的layer没有关系,所以也是没有效果
 
3. 测试代码(自己记录)
    --test page@2015/04/15 : pause
local moveBy = cc.MoveBy:create(, cc.p(, ))
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()
local bPaused = false;
local call = function(sender)
if not bPaused then
bPaused = true;
layer:pause();
print("pause ... ")
else
bPaused = false;
layer:resume();
print("resume ... ")
end
end
-- btnPause:addTouchEventListener(call)
btnPause:registerScriptTapHandler(call)
local menu = cc.Menu:create()
menu:setPosition(cc.p(, ))
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()
layer:addChild(sprite)
sprite:setPosition(VisibleRect:center())
local callRemove = function()
sprite:removeFromParent(true)
end
sprite:runAction(cc.Sequence:create(act, cc.CallFunc:create(callRemove)))
end
local scheduler = cc.Director:getInstance():getScheduler();
_schedule = scheduler:scheduleScriptFunc(layer.fnActionPause, , 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), );
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 target
element->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,自己循环

cocos2dx中node的pause函数(lua)的更多相关文章

  1. 【cocos2dx中Node类getParent和getChildByTag()】学习体会

    參考http://cn.cocos2d-x.org/doc/cocos2d-x-3.0/d3/d82/classcocos2d_1_1_node.html 当中和child.parent有关的成员函数 ...

  2. cocos2d-x中Node中重要的属性

    Node还有两个非常重要的属性:position和anchorPoint. position(位置)属性是Node对象的实际位置.position属性往往还要配合使用anchorPoint属性,为了将 ...

  3. cocos2d-x中Node与Node层级架构

    Cocos2d-x采用层级(树形)结构管理场景.层.精灵.菜单.文本.地图和粒子系统等节点(Node)对象.一个场景包含了多个层,一个层又包含多个精灵.菜单.文本.地图和粒子系统等对象.层级结构中的节 ...

  4. 【转载】cocos2d-x教程 Mac系统下搭建Lua的编码环境

    原文链接:http://blog.csdn.net/u012945598/article/details/17168831   在使用Lua写脚本的时候大家都会因为没有代码提示导致敲代码的效率有所下降 ...

  5. cocos2d-x 2.2.0 如何在lua中注册回调函数给C++

    cocos2d-x内部使用tolua进行lua绑定,但是引擎并没有提供一个通用的接口让我们可以把一个lua函数注册给C++层面的回调事件.翻看引擎的lua绑定代码,我们可以仿照引擎中的方法来做.值得吐 ...

  6. cocos2dx中使用tolua++使lua调用c++函数

    一直想学学cocos2dx中如何使用tolua++工具使得lua脚本调用C++函数,今天就来搞一下,顺便记录下来: 首先,我们打开cocos2dx-2.2.4中projects下的test的VS工程, ...

  7. Learning Lua Programming (4) Cocos2d-x中Lua编程(一)

    刚开始接触cocos2d-x 下的Lua编程,主要参看了李华明大神的博客中的介绍,http://blog.csdn.net/xiaominghimi/article/category/1155088  ...

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

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

  9. 在cocos2d-x中使用LUA

    在cocos2d-x中使用LUA 1.注冊LUA脚本引擎 CCLuaEngine* pEngine = CCLuaEngine::defaultEngine(); CCScriptEngineMana ...

随机推荐

  1. Spring Boot的filter简单使用

    过滤器(Filter)的注册方法和 Servlet 一样,有两种方式:代码注册或者注解注册 1.代码注册方式 通过代码方式注入过滤器 @Bean     public FilterRegistrati ...

  2. linux mint19 解决docker必须使用sudo问题

    1 安装完docker 使用时,提示权限不够 ~$ docker info Got permission denied while trying to connect to the Docker da ...

  3. Maven报错:maven-archetype-webapp:RELEASE from any of the configured repositories

    今天学习maven,在控制台下新建maven项目没有问题,但是在STS(eclipse)下创建maven项目老是报错,郁闷死了: ----------------------------------- ...

  4. Win7系统下网站发布IIS配置

    *本帖为个人收集贴,所有版权归:西门的后花园 http://ons.me* Technorati 标记: IIS,网站,发布,配置 一.首先是安装IIS.打开控制面板,找到“程序与功能”,点进去 二. ...

  5. 【原】Spring和Dubbo基于XML配置整合过程

    背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只需一个 ...

  6. input输入框限制(座机,手机号码)

    记录一下 座机input输入框: <input style="width:100px;" id="tel" type="text" o ...

  7. java中程序上线报错: tomcat中java.lang.OutOfMemoryError: PermGen space

    在程序测试没问题之后,上线试运行,在运行的过程中某个功能一点击就报如下错,然后重启服务器就好了,一会又是如此,解决方法如下(亲测) PermGen space的全称是Permanent Generat ...

  8. [LeetCode] Binary Tree Postorder题解

    Binary Tree Postorder Given a binary tree, return the postorder traversal of its nodes' values. For ...

  9. 学习Golang的步骤建议

    一.快速入门 通过快速入门可以宏观的了解Go相关知识.快速入门可以去学习 go-tour 国内可以访问的中文版的 go-tour 地址有下面一些: http://gotour.qizhanming.c ...

  10. NIO与Socket

    一.Socket 的使用 1.单线程Socket的使用 /** * 单线程版本 * 问题描述:只能服务单个客户端 * 解决方案:多线程版本 */ public class Socket_V1 { pu ...