自定义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做报表,时间日期是一个重要的纬度,加上做一些钻取,时间日期函数表不可避免.所以今天就给大家分享一个自定义的做日期表的方法 ...
随机推荐
- Python习题(第3课)
一.独一无二的路 从前有一只小小的机器人叫小器,小器站在一个M*N的格子地板的最左上角,很孤单,世界辣么大,它也想去看看,经过不懈的努力它终于可以(只能)向下或者向右移动啦,它有一个宏伟的愿望就是要穿 ...
- jquery.validate,错误信息位置
好长时间没有用jquery.validate.js这个插件了,忘得差不多了.唉,好东西还是要经常拿出来看看的,今天用jquery.validate来做一个小东西,遇到一个问题,就是错误提示信息的位置问 ...
- KB和KiB的区别
差别是KB等单位以10为底数的指数,KiB是以2为底数的指数. K 与 Ki 分别表示 kilo-(千) 与 kibi-(二进制千) .作为前缀使用时, k 表示 1,000,Ki 表示1,024. ...
- MySQL主从延迟如何解决?
我们知道生产环境中经常会遇到MySQL主从延迟问题,从原理上也能看出主库的事务提交是并发模式,而从库只有一个SQL线程负责解析,所以本身上就可能存在延迟. 延迟的主要原因在于: 1.从库的配置往往没有 ...
- 内网DHCP攻击
局域网内DHCP攻击 实验环境:两个win2008 r2虚拟机(一台用作正常的DHCP服务器,另一台用作伪造DHCP服务器),两个win7虚拟机(用作客户机),一个kali虚拟机(用作攻击,耗尽DHC ...
- Win10更新后真正可用VC++6版本
1.首先,我并不支持继续用VC6,毕竟太老太老了...除了VS,如果只是学C,那你完全可以用其它一些工具...当然除非你也是像我一样被逼无奈. 2.本次找了N多个版本,问题就是Win10周年更新包后, ...
- 【Ansible 文档】【译文】Ad-Hoc 命令介绍
Introduction To Ad-Hoc Commands Ad-Hoc命令介绍 下面的例子展示了如何使用 /usr/bin/ansible 来运行ad hoc任务. 什么是ad hoc命令? 一 ...
- Tomcat设置虚拟目录的方法, 不修改server.xm
所在小组使用的就是这样的形式开发,这样切换开发环境,测试环境,正式环境就只需要修改project.xml文件就行了.project.xml命名是随意的,访问的时候就使用这个名字来访问. 在tomcat ...
- BZOJ4300:绝世好题(DP)
Description 给定一个长度为n的数列ai,求ai的子序列bi的最长长度,满足bi&bi-1!=0(2<=i<=len). Input 输入文件共2行. 第一行包括一个整数 ...
- Spring 加载Controller逻辑的源码笔记
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#initHandlerMethods 进行加载Controll ...