加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx增加front层并优先响应listener

发布时间:2020-12-14 17:17:16 所属栏目:百科 来源:网络整理
导读:需求 在游戏中会有一些提示性的消息需要显示在UI的最上层,即使是在 scene 切换的时候也不能消失掉。比如当服务器推送某个消息的时候,需求一个弹窗来展示,但这个时候游戏刚好进行了 scene 切换,就会导致添加在上一个 scene 的弹窗消失掉,导致该提示消息

需求

在游戏中会有一些提示性的消息需要显示在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)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读