自定义CCNode
对Touch事件的获取与处理可以使用CCLayer, CCMenuItem等,但是如果我们需要一个虚拟按键或者需要对特定精灵进行拖动等等,我们就需要自定义Touch类。
自定义Touch事件处理类重要的步骤是:
1. 继承CCTargetedTouchDelegate
2. 添加addTargetedDelegate(pDelegate, nPriority, bSwallowsTouches),来获取Touch事件,第二个参数是优先级,越高越优先。
3. 根据自己的需要override Touch事件处理函数:
virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
如下是实例:这里添加一个自定义的Button到场景层。
- #include <cocos2d.h>
- USING_NS_CC;
- class MyButton : public CCNode, public CCTargetedTouchDelegate
- {
- public:
- MyButton(void);
- ~MyButton(void);
- virtual void onEnter();
- virtual void onExit();
- virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event);
- virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
- virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
- virtual bool init();
- CREATE_FUNC(MyButton);
- private:
- CCSprite *m_ShowPic;
- };
- #include "MyButton.h"
- MyButton::MyButton(void):m_ShowPic(NULL)
- {
- }
- MyButton::~MyButton(void)
- {
- }
- bool MyButton::init()
- {
- bool bRet = false;
- do
- {
- CCSize winSize = CCDirector::sharedDirector()->getWinSize();
- m_ShowPic = CCSprite::create("share.png");
- m_ShowPic->setPosition(ccp(winSize.width/2, winSize.height/2));
- this->addChild(m_ShowPic);
- bRet = true;
- } while(0);
- return bRet;
- }
- void MyButton::onEnter()
- {
- CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
- CCNode::onEnter();
- }
- void MyButton::onExit()
- {
- CCDirector::sharedDirector()->getTouchDispatcher()->removeDelegate(this);
- CCNode::onExit();
- }
- bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event)
- {
- CCLog("MyButton Touch Began!");
- return true;
- }
- void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
- {
- CCLog("MyButton Touch Move!");
- }
- void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
- {
- CCLog("MyButton Touch Ended!");
- }
将以下代码其添加到HelloWorldScene::init中,
- ////////////////////////////
- // Add MyButton
- MyButton *button = MyButton::create();
- this->addChild(button, 10);
- button->setPosition(CCPointZero);
运行测试:

在屏幕中点击可以看到Output中显示了我们的CCLog提示
可是我们没有点击到图片时也会提示出CCLog,这并不是我们想要的。
那么我们就需要添加自己需要的Touch事件处理代码了:
例如如下:
- bool MyButton::ccTouchBegan(CCTouch* touch, CCEvent* event)
- {
- CCPoint position = convertTouchToNodeSpaceAR(touch);
- if (!m_ShowPic->boundingBox().containsPoint(position))
- return false;
- CCLog("MyButton Touch Began!");
- // add your code...
- return true;
- }
- void MyButton::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)
- {
- CCLog("MyButton Touch Move!");
- // add your code...
- }
- void MyButton::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)
- {
- CCLog("MyButton Touch Ended!");
- // add your code...
- }
自定义CCNode的更多相关文章
- [原创]cocos2d-x研习录-第二阶 概念类之节点类(CCNode)
节点类CCNode在基本概念中并不存在,它是为了建立基本概念之间的关联关系而抽象出来的中间辅助类.这个类在Cocos2D-x中极为重要,它为概念类之间搭建了一座宏伟的桥梁.它的继承关系图如下: ...
- 使用tolua++编译pkg,从而创建自定义类让Lua脚本使用
步骤一:首先自定义类(这里Himi自定义类名 “MySprite”) MySprite.h 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 // // ...
- Cocos2d-x——CocosBuilder官方帮助文档翻译1 使用自定义类
原创:请注明转载! 在Cocos2d-x中使用CocosBuilder 使用自定义类 CocosBuilder的使用方法是通过自定义类.在CocosBuilder中选中一个对象并在属性栏中输入自定义类 ...
- Cocos2D-x权威指南:核心类成员CCNode
节点类(CCNode)是Cocos2D-x中的主要类,继承自CCObject.继承关系如图3-2所看到的. 不论什么须要画在屏幕上的对象都是节点类. 最经常使用的节点类包含场景类(CCScene).布 ...
- cocos2dx进阶学习之CCNode
继承关系 CCNode -> CCObject CCNode在cocos2dx中抽象舞台对象,需要渲染的对象都是从CCNode派生,包括CCScene,CCLayer,CCSprite等等 C ...
- 使用CCNode作为容器容易踩的坑
Cocos2dx中CCNode经常作为一个父容器,里面装一些UI控件,最后组成一个复杂的自定义的UI控件,但是在使用别人的自定义控件和自己写自定义问题的时候会踩一些坑. 首先拿到一个自定义的UI控件一 ...
- 【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pk创建自定义类
此篇基本[COCOS2DX(2.X)_LUA开发之三]在LUA中使用自定义精灵(LUA脚本与自创建类之间的访问)及LUA基础讲解 在Lua第三篇中介绍了,如何在cocos2dx中使用Lua创建自定义类 ...
- 关于Unity3D自定义编辑器的学习
被人物编辑器折腾了一个月,最终还是交了点成品上去(还要很多优化都还么做). 刚接手这项工作时觉得没概念,没想法,不知道.后来就去看<<Unity5.X从入门到精通>>中有关于 ...
- 一起学微软Power BI系列-使用技巧(5)自定义PowerBI时间日期表
1.日期函数表作用 经常使用Excel或者PowerBI,Power Pivot做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...
随机推荐
- 团队项目个人进展——Day06
一.昨天工作总结 冲刺第六天,深入学习了小程序官方文档,并看了几节小程序教程的视频 二.遇到的问题 对文档中的内容只是熟悉,理解并运用起来还存在问题 三.今日工作规划 学习微信小程序中WebSocke ...
- PostMan请求不到接口问题
在些接口的时候经常需要调试,调试的有很多选择,比如swagger.postman,我就是使用过两个都用:为了避免被swagger坑到就再去用postman试试确认看行不行,结果太小白了还是遇到了一些问 ...
- SQL Server 全文索引的硬伤(转载)
本文关键字:SQL Server全文索引.CONTAINS.FREETEXT.CONTAINSTABLE.FREETEXTTABLE等谓词. 想象这样一个场景:在DataBase_name.dbo.T ...
- mysqldump: Error 2013
最近在mysqldump时,遭遇mysqldump: Error 2013错误.以为是常见的参数设置有问题,调整之后,也没有任何成效.原来发生了OOM,以下是其具体描述. 一.故障现象 环境 # mo ...
- SELinux 关闭方法
临时关闭selinux,可执行: setenforce 0 // 设置selinux状态 1启用,0警告.不启用. getenforce //检查selinux状态是否生效 永久关闭selinu ...
- WPScan扫描Wordpress漏洞
一.什么是Wpscan?什么是Wordpres? 1.Wpscan WPScan是一个扫描WordPress漏洞的黑盒子扫描器,可以扫描出wordpress的版本,主题,插件,后台用户以及爆破后台用户 ...
- python解析式
一.列表解析式 列表解析是外面一对中括号,它返回的是列表. 一般形式为:[expr for item in itratoble] print([i+1 for i in range(10)]) #结果 ...
- 【Alpha】团队项目测试报告与用户反馈
测试报告 一 . WEB端测试 测试页面 测试功能/界面 功能/界面简述 测试预期效果 测试目的 是否完成(Y/N) Internet Explorer Google chrome Firefox S ...
- mac下idea 13 在tomcat 7控制台乱码
在mac或linux下idea 13(可能其它版本也会出现乱码) tomcat 7在输出到控制台的日志中文乱码,解决方式 加一个environment variable, 在如图绿色位置添加 JA ...
- python 爬取全量百度POI
在网上找了很多关于爬取百度POI的文章,但是对“全量”的做法并没有得到最终的解决方案,自己写了一个,但还是不能实现全量POI抓取,能够达到至少50%的信息抓取.注意:这里所指“全量”是能够达到100% ...