您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx增加front层并优先响应listener

2017-01-11 09:14 316 查看

需求

在游戏中会有一些提示性的消息需要显示在UI的最上层,即使是在
scene
切换的时候也不能消失掉。比如当服务器推送某个消息的时候,需求一个弹窗来展示,但这个时候游戏刚好进行了
scene
切换,就会导致添加在上一个
scene
的弹窗消失掉,导致该提示消息无法展示。

解决方法

我们可以为看到cocos2dx中的调试时候的帧率就是一直显示,哪怕切换场景。这里也使用与之相同的方法。

显示

修改Director使之包含一个超前层节点,并提供接口访问

Node* getFrontNode()
{
return m_fronNode;
}
Node* m_fronNode;


在CCDirector.h中增加上面的代码,然后在
CCDirector.cpp
中增加下面的代码

Director::init
中增加下面的代码

m_fronNode = Node::create();
m_fronNode->retain();
m_fronNode->onEnter();


Director::~Director
中增加下面的代码

CC_SAFE_RELEASE(m_fronNode);


Director::drawScene
函数的
showStats
下面增加

if (_displayStats)
{
showStats();
}
const Mat4& identity = Mat4::IDENTITY;
m_fronNode->visit(_renderer, identity, 0);


这样就可以让添加在
m_frontNode
上面的子节点可以被显示了,但是只是显示显然是不够的,因为我们的提示信息还需要能够点击且响应事件必须也是在最前面,因此还需要在
listener
排序的时候确保
m_frontNode
子节点上的
listener
被排序在前面。

点击事件响应

对于SceneGraphPriority的事件,在CCEventDispatcher.cpp的

EventDispatcher::sortEventListenersOfSceneGraphPriority
函数中添加下面的代码

visitTarget(rootNode, true);
visitTarget(Director::getInstance()->getFrontNode(), true);  //新增


通过以上修改之后,当需要添加全局通知的时候,就可以通过下面的代码将通知UI添加上去了,并且保证node的listener优先响应。

Director::getInstance()->getFrontNode()->addChild(node)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐