cocos2dx中node的pause函数(lua)

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 [email protected]/04/15 : pause
    local 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 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(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)
        end
        sprite:runAction(cc.Sequence:create(act, cc.CallFunc:create(callRemove)))
    end
    local 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 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,自己循环

时间: 2024-08-25 05:20:25

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

cocos2d-x中Node中重要的属性

cocos2d-x中Node中重要的属性 Node还有两个非常重要的属性:position和anchorPoint. position(位置)属性是Node对象的实际位置.position属性往往还要配合使用anchorPoint属性,为了将一个Node对象(标准矩形图形)精准的放置在屏幕某一个位置上,需要设置该矩形的锚点,anchorPoint是相对于position的比例,默认是(0.5,0.5).我们看看下面的几种情况: 以anchorPoint为(0.5,0.5)为例,这是默认情况. 下

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

参考http://cn.cocos2d-x.org/doc/cocos2d-x-3.0/d3/d82/classcocos2d_1_1_node.html 其中和child.parent有关的成员函数如下: Children and Parent virtual void  addChild (Node *child) 添加一个子节点到容器内,z-order是0. 更多... virtual void  addChild (Node *child, int localZOrder) 添加一个子节

cocos2d-x中Node与Node层级架构

Cocos2d-x采用层级(树形)结构管理场景.层.精灵.菜单.文本.地图和粒子系统等节点(Node)对象.一个场景包含了多个层,一个层又包含多个精灵.菜单.文本.地图和粒子系统等对象.层级结构中的节点可以是场景.层.精灵.菜单.文本.地图和粒子系统等任何对象. 节点的层级结构 这些节点有一个共同的父类Node.Node类是Cocos2d-x最为重要的根类,它是场景.层.精灵.菜单.文本.地图和粒子系统等类的根类.

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

一直想学学cocos2dx中如何使用tolua++工具使得lua脚本调用C++函数,今天就来搞一下,顺便记录下来: 首先,我们打开cocos2dx-2.2.4中projects下的test的VS工程,可以看到这个例子里面已经有一个HelloWorld的类,我们就用它来说明一下. 然后,我们照着HelloWorld类的定义来写pkg文件: //MyClass.pkg class HelloWorld : public cocos2d::CCLayer { virtual bool init();

改进cocos2dx中lua读ccb的方法

cocos2dx自带的CCBProxy真弱,还好提供了一个CCBReaderLoader.lua,但是也不好用, 于是修改了一下CCBReaderLoader,下面直接贴代码了. function NewCCBuilderReaderLoad(strFilePath,proxy,owner) if nil == proxy then return end --print("ccbnew") local ccbReader = proxy:createCCBReader() local

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

先看一张流程图如下: 第一步: 先把NDKHelper中的方法转成LUA中可以调用的,转得方法可参考quick中LUA的用法.这个类主要是中间桥梁的作用,它可以根据是什么平台调用IOSNDKHelper或者AndroidSNDKHelper,这些判断都是用C语言来写的.还有就是对一些回调函数的保存机制和平台要用LUA中一些方法的保存. 第二步: IOS平台需要处理的就是IOSNDKHelper,这个类主要就是接收和发送给NDKHelper数据的方法,还有一个就是加载IOS平台的BasePlatf

cocos2d-x 2.2.0 怎样在lua中注冊回调函数给C++

cocos2d-x内部使用tolua进行lua绑定.可是引擎并没有提供一个通用的接口让我们能够把一个lua函数注冊给C++层面的回调事件. 翻看引擎的lua绑定代码,我们能够仿照引擎中的方法来做. 值得吐槽的是.这套流程在开发中差点儿是不可避免的,而cocos2d-x居然不把它作为一个公用接口暴露给开发人员,而须要我自己动手,真是无奈. 以下以一个简单的消息分发类为样例,演示怎样完毕这一工作. MessageDispatcher.h class MessageDispather { public

Cocos2d-x从入门到精通第五课《Cocos2d-x中的Node》

Cocos2d-x中的Node 视频教程地址:http://edu.csdn.net/course/detail/1342/20983?auto_start=1 一.什么是结点 在介绍Cocos2d-x的结点系统之前,我们需要首先做一些启蒙,什么是树? 定义:   一棵树(tree)是由n(n>0)个元素组成的有限集合,其中: (1)每个元素称为结点(node): (2)有一个特定的结点,称为根结点或根(root): (3)除根结点外,其余结点被分成m(m>=0)个互不相交的有限集合,而每个子

Cocos2d-x中关于lua的坑

上周在项目开发中遇到一个奇怪的问题,某个c++模块解压完的字节流数据传递给lua后,lua在做基于字节流的反序列化时始终出错,刚开始以为是不是c++模块读取出来的字节流有问题,但是debug发现,c++拿到的字节流确实是正确的,于是跑到lua的接口中打印了字节流的内容和长度发现,在某些情况下C++中打印出来的字节流和lua拿到的字节流的长度不等,突然想起可能是lua和C++对string的支持不同导致的.因为C++中没有字节这个类型,所以存储字节流就一般存储到以char类型结构为基础类型的数组或