cocos2dx之触摸事件
2013-07-25 21:16
260 查看
要使精灵能够接收到触摸事件,无非要做三件事。
注册触摸事件;
接收触摸事件;
处理触摸事件。
下面就从这三点出发,来了解一下精灵如何响应触摸事件。
同时加入辅助函数rect()和containTouchPoint(CCTouch* touch)用于后面的判断。
poker.h文件:
poker.cpp文件:
这里需要再poker.cpp中添加具体的注册行为,onEnter和onExit函数分别是精灵创建和销毁时调用,因为可以在这两个函数中添加注册和销毁注册。
以上,我们的触摸事件注册流程就完成了。
如此,接收流程已经完成,无意外的话,运行可以看到打印日志了。
也即是CCRect Poker::rect()需要做的事情。
请注意,这里获取的方式的前提是,精灵使用系统默认的锚点,也即是精灵的正中央,如果改变过精灵的锚点(setAnchorPoint),那么就需要改变计算方法了。
如果将当前精灵也看做一个坐标系,若精灵的长为100,宽为100,那么获取的矩形应该是x = -50 , y = -50 ,width = 100 ,height = 100
其次,将触摸事件的点转化为当前精灵内部坐标系的点。
(可能不是很好理解,但是我们每一个继承自CCNode的结点都可以看做一个坐标系)
在CCSprite内部使用convertTouchToNodeSpaceAR函数就可以将当前触摸点转化成精灵内部坐标系的点。
最后,判断触摸事件,并处理。
如果发现当前触摸点在CCSprite的内部,则将当前CCSprite的Y坐标上移30个像素。
注册触摸事件;
接收触摸事件;
处理触摸事件。
下面就从这三点出发,来了解一下精灵如何响应触摸事件。
1.注册触摸事件
精灵类Poker继承Sprite和CCTargetedTouchDelegate,并重写CCTargetedTouchDelegate的三个函数ccTouchBegan,ccTouchMoved,ccTouchEnded同时加入辅助函数rect()和containTouchPoint(CCTouch* touch)用于后面的判断。
poker.h文件:
class Poker : public CCSprite ,public CCTargetedTouchDelegate { PokerState m_state; public: Poker(void); CCRect rect(); virtual void onEnter(); virtual void onExit(); virtual ~Poker(void); boolean containTouchPoint(CCTouch* touch); virtual bool ccTouchBegan(CCTouch *touch ,CCEvent *event); virtual void ccTouchMoved(CCTouch *touch ,CCEvent *event); virtual void ccTouchEnded(CCTouch *touch ,CCEvent *event); };
poker.cpp文件:
这里需要再poker.cpp中添加具体的注册行为,onEnter和onExit函数分别是精灵创建和销毁时调用,因为可以在这两个函数中添加注册和销毁注册。
//CCNode进入场景时调用 void Poker::onEnter() { CCDirector* pDirector = CCDirector::sharedDirector(); pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true); CCSprite::onEnter(); } //CCNode退出场景时调用 void Poker::onExit() { CCDirector* pDirector = CCDirector::sharedDirector(); pDirector->getTouchDispatcher()->removeDelegate(this); CCSprite::onExit(); }
以上,我们的触摸事件注册流程就完成了。
2.接收触摸事件
接收触摸事件,实际上就是重写CCTargetedTouchDelegate的三个函数ccTouchBegan,ccTouchMoved,ccTouchEnded。bool Poker::ccTouchBegan(CCTouch *touch ,CCEvent *event) { CCLog("Poker ccTouchBegan "); return false; } void Poker::ccTouchMoved(CCTouch *touch ,CCEvent *event) { CCLog("Poker ccTouchMoved "); } void Poker::ccTouchEnded(CCTouch *touch ,CCEvent *event) { CCLog("Poker ccTouchEnded "); }
如此,接收流程已经完成,无意外的话,运行可以看到打印日志了。
3.处理触摸事件
首先要获取当前精灵所在的矩形。也即是CCRect Poker::rect()需要做的事情。
请注意,这里获取的方式的前提是,精灵使用系统默认的锚点,也即是精灵的正中央,如果改变过精灵的锚点(setAnchorPoint),那么就需要改变计算方法了。
CCRect Poker::rect() { CCSize size = getTexture()->getContentSize(); return CCRectMake(-size.width / 2 ,-size.height / 2, size.width ,size.height); }
如果将当前精灵也看做一个坐标系,若精灵的长为100,宽为100,那么获取的矩形应该是x = -50 , y = -50 ,width = 100 ,height = 100
其次,将触摸事件的点转化为当前精灵内部坐标系的点。
(可能不是很好理解,但是我们每一个继承自CCNode的结点都可以看做一个坐标系)
boolean Poker::containTouchPoint(CCTouch* touch) { return rect().containsPoint(convertTouchToNodeSpaceAR(touch)); }
在CCSprite内部使用convertTouchToNodeSpaceAR函数就可以将当前触摸点转化成精灵内部坐标系的点。
最后,判断触摸事件,并处理。
bool Poker::ccTouchBegan(CCTouch *touch ,CCEvent *event) { int x = getPositionX(); int y = getPositionY(); if (containTouchPoint(touch)) { setPosition(ccp(x , y + 30)); return true; } CCLog("Poker ccTouchBegan "); return false; }
如果发现当前触摸点在CCSprite的内部,则将当前CCSprite的Y坐标上移30个像素。
相关文章推荐
- cocos2dx 3.3 + lua 学习笔记(03)--- 触摸事件、定时器、进度条
- Cocos2dx-3.x触摸事件之实现人机交互(一)
- cocos2dX 事件之触摸事件和触摸事件集合
- cocos2dx3.x使用cocostudio触摸事件不响应的奇葩问题
- cocos2dx 自定义触摸事件的分发
- cocos2dx触摸事件的添加问题,触摸事件不起作用
- 10.cocos2dx C++为Sprite添加触摸事件监听器
- cocos2dx中使用触摸事件
- cocos2dx 单点触摸,按钮事件
- cocos2dx 接受触摸事件
- cocos2dx学习之路----第九篇(深入理解单点触摸的事件机制)
- cocos2dx为Sprite添加触摸事件监听器
- 4------关于在Cocos2dx中注册触摸事件——Lua(单点触摸)
- cocos2dx lua语言讲解 (动作,定时器,触摸事件,工程的类的讲解)
- Cocos2dx-3.x触摸事件之实现人机交互(二)
- cocos2dx-触摸事件
- cocos2dx 中触摸事件分发一些解读
- cocos2dx 3.x 屏幕触摸事件的认识
- quick-cocos2dx lua语言讲解 (动作,定时器,触摸事件,工程的类的讲解)
- cocos2dx 处理精灵触摸事件