quick-cocos2dx 悬浮节点(NotificationNode)
cocos2dx 开发游戏时,有时某些节点不需要随着场景的切换而销毁。但cocos2dx的机制只允许同时只有一个运行的场景,如果你的所有节点都是依附于这个场景的,那场景的切换必然带来节点的销毁。
比如,我们有一个悬浮图标,用来设置音乐音量,无论哪个场景都需要有这个按钮。就可以使用NotificationNode。
我遇到的问题是,收到服务器来的一条消息,客户端做一个提示,同时场景做一个切换。这就势必产生问题:提示文字首先加入到了要被销毁的场景,很快,新场景产生,就场景销毁,这个过程很短暂,所以你根本无法看到文字提示,就觉得莫名其妙切换了场景。
目前解决方法是收到这个提示消息后,延迟3秒钟显示,以保证场景已经切换完成。但觉得这个方法很不高大上,既然我有这个需求,别人肯定也会有,那么cocos本身就已经会提供更好的解决方法。
于是仔细查看Scene的C++代码,最终在Director的drawScene方法中,发现了这个片段
// draw the scene
if (_runningScene)
{
_runningScene->visit(_renderer, Mat4::IDENTITY, false);
_eventDispatcher->dispatchEvent(_eventAfterVisit);
} // draw the notifications node
if (_notificationNode)
{
_notificationNode->visit(_renderer, Mat4::IDENTITY, false);
}
_notificationNode 是一个亮点,于是各种百度google之后,觉得这才是最王道的解决方法。 于是我在quick中是这样调用的,myapp.lua 的ctor 方法 增加 如下代码:
cc.Director:getInstance():setNotificationNode(require("app.views.NotificationLayer").new())
NotificationLayer 源码是这样的
--
-- Created by IntelliJ IDEA.
-- User: Elan
-- Date: 15-7-27 下午5:37
-- To change this template use File | Settings | File Templates.
-- local NotificationLayer = class("NotificationLayer", function()
return display.newNode()
end) function NotificationLayer:ctor()
self:setNodeEventEnabled(true)
self:addSprite()
self:hide()
end function NotificationLayer:registerNotificationCenter()
self.showNotificationHandle = GameDataCenter:addEventListener("showNotification", handler(self, self.showAni))
end function NotificationLayer:unregisterNotificationCenter()
GameDataCenter:removeEventListener(self.showNotificationHandle)
end function NotificationLayer:onEnter()
self:registerNotificationCenter()
print("onEnter..............")
end function NotificationLayer:onExit()
self:unregisterNotificationCenter()
print("onExit..............")
end function NotificationLayer:addSprite()
self.bg = cc.ui.UIImage.new("#images/common/ui/shangfangtishi.png")
:align(display.BOTTOM_CENTER, display.cx, display.top)
:addTo(self) self.bgw = self.bg:getContentSize().width
self.bgh = self.bg:getContentSize().height self.txtLabel = cc.ui.UILabel.new({
text = "",
size = ,
color = ccYELLOW,
align = ui.TEXT_ALIGN_CENTER
})
:align(display.CENTER, self.bgw/, self.bgh/)
:addTo(self.bg)
end function NotificationLayer:showAni(data)
self.bg:stopAllActions()
self:show()
local msg = data.Responsedata
self.txtLabel:setString(msg)
local action = transition.sequence({
cc.MoveTo:create(0.5, cc.p(display.cx, display.top - self.bgh)),
cc.DelayTime:create(),
cc.MoveBy:create(0.1, cc.p(display.cx, display.top)),
cc.CallFunc:create(function()
self:hide()
end)
})
self.bg:runAction(action)
end return NotificationLayer
我在其他地方触发 showNotification 事件后,发现背景板并没有顺利的移动出来,就是说我的action并没有执行成功。于是单步调试,发现runAction调用时,node本身的_running是false,所以action并没有执行。
看网上很多童鞋说再调用一下onEnter方法,确实是,只有onEnter方法里面_running才会被设置为true。于是我在lua里面调用onEnter,真是笨到家了。因为lua里面的onEnter是C++里面的onEnter的回调,所以啥作用都没起。 于是我在Director里面增加调用onEnter()方法,然后很成功的执行了action。
void Director::setNotificationNode(Node *node)
{
CC_SAFE_RELEASE(_notificationNode);
_notificationNode = node;
node->onEnter(); // add by Elan 2015.7.27
CC_SAFE_RETAIN(_notificationNode);
}
但是,我关掉player的时候,又报错了:
Node still marked as running on node destruction! Was base class onExit() called in derived class onExit() implementations?
C++一看,node的析构函数报错,node 的_running 为true的时候销毁这个node就会报这个错。_running只在OnExit()的会被设为false。于是我在Director 的析构函数中又增加了一句。部分代码如下。
Director::~Director(void)
{
CCLOGINFO("deallocing Director: %p", this); if (_notificationNode)
{
_notificationNode->onExit(); // add by Elan 2015.7.27
} CC_SAFE_RELEASE(_FPSLabel);
CC_SAFE_RELEASE(_drawnVerticesLabel);
CC_SAFE_RELEASE(_drawnBatchesLabel); CC_SAFE_RELEASE(_runningScene);
CC_SAFE_RELEASE(_notificationNode);
CC_SAFE_RELEASE(_scheduler);
CC_SAFE_RELEASE(_actionManager); CC_SAFE_RELEASE(_scriptEventCenter);
现在就完美啦。性能神马的会不会有什么影响,只能后续测试啦。
quick-cocos2dx 悬浮节点(NotificationNode)的更多相关文章
- quick cocos2d-x 入门---井字棋
学习quick cocos2d-x 第二天 ,使用quick-x 做了一个井字棋游戏 . 我假设读者已经 http://wiki.quick-x.com/doku.php?id=zh_cn阅读了这个链 ...
- Mac下搭建quick cocos2d-x编译环境
一. 我知道在你的电脑中一定已经安装好了Xcode(没有自己下载去吧),打开Xcode,开启"偏好设置"对话框(commond + ,).假设打开之后出现的是这种一个对话框,那么直 ...
- Quick Cocos2dx Http通讯
服务端:Python 通讯协议:Http 参考文章: 1 用python实现一个基本的http server服务器 http://blog.sina.com.cn/s/blog_416e3063010 ...
- 用Quick Cocos2dx做一个连连看(一)
呵呵,不知道能不能坚持下来,先写着吧. 预备知识:Quick Cocos2dx 2.2.5基本知识 或者 Cocos2dx基本知识, lua入门 开发工具:Sublime Text 2.0/3.0 原 ...
- quick cocos2dx 3.x 配置win32工程
公司项目主体部分用c++,而ui部分用lua写,所以选择了用quick框架.项目先开发了ios/mac版,这两天试着配置其win32工程,遇到一些问题,记录一下(纯c++版本cocos2dx配置方法应 ...
- quick cocos2d-x 2.2.4 window环境调试
BabeLua简介 BabeLua是一款基于VS2012/2013(简称VS)的免费开源的Lua集成开发环境,在Lua编辑和调试方面,具有如下功能和特性: ●Lua语法高亮 ●语法检查 ●自动补全 ● ...
- quick cocos2dx lua 内存释放
前言 对于内存的优化,网上有很多例子和教程.总体来说,就那么几种解决方案,在最后我会简单提下,这里先说下在quick中,对于图片的处理. 1.查看内存调试信息 对于quick框架的了解,我们可以参考\ ...
- Mac在结构quick cocos2d-x编译环境
关于 Quick 很多其它的使用说明可參考安装文件夹下的 README 文件. Quick-Coco2d-x开发工具 普通情况下,我们通常都会採用Cocos Code IDE作为开发工具来高速开发游戏 ...
- Quick Cocos2dx MVC初步
今天看到了自己之前两年前写的一个地图编辑器, 写了不到一半就放弃了, 但是还是github上的小伙伴fork了, 真的感觉对不起那位伙计, 同时也鄙视一下一直以来懒得要死的自己, 希望这个demo不要 ...
随机推荐
- [git]基本用法1
一.实验说明 本节实验为 Git 入门第一个实验,可以帮助大家熟悉如何创建和使用 git 仓库. 二.git的初始化 在使用git进行代码管理之前,我们首先要对git进行初始化. 1.Git 配置 使 ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺-4
一.当天站立式会议照片: 二.项目进展 昨天已完成的工作: 完成程序副界面的设计与信息的输入统计 明天计划完成的工作: 日期等细致信息的处理 工作中遇到的困难: 对微信小程序开发的代码构成有了一些了解 ...
- 基于3D卷积神经网络的人体行为理解(论文笔记)(转)
基于3D卷积神经网络的人体行为理解(论文笔记) zouxy09@qq.com http://blog.csdn.net/zouxy09 最近看Deep Learning的论文,看到这篇论文:3D Co ...
- 伟大的淘宝IP库的API接口竟然提示503挂掉了
1 淘宝IP库惊现503错误 吃完晚饭,大概6点半了,天色已暗,太阳早就落山了.回到宿舍打开博客一看,傻眼了:博客每篇文章的评论者的地理信息全部处于“正在查询中……”的状态.这神马情况,不会是被淘宝封 ...
- [剑指Offer] 46.孩子们的游戏
题目描述 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此.HF作为牛客的资深元老,自然也准备了一些小游戏.其中,有个游戏是这样的:首先,让小朋友们围成一个大圈.然后,他随机指 ...
- 单选 name的值相同时候 就会产生互斥现象
- 【刷题】BZOJ 2038 [2009国家集训队]小Z的袜子(hose)
Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只 ...
- [NOI.AC省选模拟赛3.31] 星辰大海 [半平面交]
题面 传送门 思路 懒得解释了......也是比较简单的结论 但是自己看到几何就退缩了...... 下周之内写一个计算几何的学习笔记! Code #include<iostream> #i ...
- BZOJ3781:小B的询问——题解
https://www.luogu.org/problemnew/show/2709 http://www.lydsy.com/JudgeOnline/problem.php?id=3781 题目描述 ...
- [bzoj] 3669 NOI2014 魔法森林 || LCT
原题 copy一篇题解:原链接 将边按照a排序,然后从小到大枚举,加入图中. 在图中用lct维护一棵两点之间b最大值尽量小的生成树. 当加入一条边(u, v)时: 如果(u, v)不连通,则直接加入这 ...