cocos2dx之触摸事件
要使精灵能够接收到触摸事件,无非要做三件事。
注册触摸事件;
接收触摸事件;
处理触摸事件。
下面就从这三点出发,来了解一下精灵如何响应触摸事件。
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.接收触摸事件
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()
{
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
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));
} CCLog("Poker ccTouchBegan ");
return false;
}
如果发现当前触摸点在CCSprite的内部,则将当前CCSprite的Y坐标上移30个像素。
cocos2dx之触摸事件的更多相关文章
- cocos2d-x lua 触摸事件
cocos2d-x lua 触摸事件 version: cocos2d-x 3.6 1.监听 function GameLayer:onEnter() local eventDispatcher = ...
- Cocos2d-x中触摸事件
理解一个触摸事件可以从时间和空间两方面考虑. 1.触摸事件的时间方面 触摸事件的在时间方面,如下图所示,可以有不同的“按下”.“移动”和“抬起”等阶段,表示触摸是否刚刚开始.是否正在移动或处于静止状态 ...
- cocos2dx 中触摸事件分发一些解读
触摸事件分发中几个代码解读: 怎么说呢,感觉cocos2dx中的消息分发机制,相对于android中触摸事件分发机制要简单的多.因为android中要做区域判断,过滤器,以及父子组件分发给谁等等的逻辑 ...
- cocos2d-x游戏引擎核心之五——触摸事件和触摸分发器机制
一.触摸事件 为了处理屏幕触摸事件,Cocos2d-x 提供了非常方便.灵活的支持.在深入研究 Cocos2d-x 的触摸事件分发机制之前,我们利用 CCLayer 已经封装好的触摸接口来实现对简单的 ...
- Cocos2d-x开发实例:单点触摸事件
下面我们通过一个实例详细了解一下,层中单点触摸事件的实现过程.感受一下它的缺点和优点.该实例场景如下图所示,场景中有两个方块精灵,我们可以点击和移动它们. 下面我们看看HelloWorldScen ...
- Cocos2d-x实例:单点触摸事件
addChild(boxC,30, kBoxC_Tag); ...
- cocos2d-x触摸事件优先级的探究与实践
如何让自定义Layer触发触摸事件? bool LayerXXX::init() { this->setTouchEnabled(true); CCTouchDispatcher* td = C ...
- cocos2d-x jsb 防止触摸事件传递
在游戏中要实现消息弹窗,让用户点击确认,其他区域产生遮罩,阻挡下层的事件被点击到,这是个很常用的功能,在cocos2d-x中,可以通过为layer添加事件代理来实现: pDirector->ge ...
- cocos2dX 事件之触摸事件和触摸事件集合
今天, 我们来学习cocos2dX里面的触摸事件与触摸事件合集, 如今的手机游戏交互基本上都是通过触摸交互的, 所以大家明确这节的重要性了吧, 本节篇幅比較大, 所以我就不扯闲话了 先来看看经常使用函 ...
随机推荐
- LINUX搭建SVN客户端和多个项目的权限分组管理
搭建SVN服务,有效的管理代码,以下三步可以快速搞定.1.安装 #yum install subversion 判断是否安装成功 1 #subversion -v svnserve, version ...
- 转:微博"收藏/赞/转发"技术资料汇总
书籍 HTTP权威指南 <- @Fenng Introduction to Information Retrieval <- @陈利人 Lua 源码欣赏 <- @简悦云风 The A ...
- spring-boot 测试
在线项目构建:http://start.spring.io/ 下载:bookpub.zip 导入Idea15.0.1 运行: y@y:bookpub$ ./gradlew clean bootRun ...
- BAT带队烧钱圈地华为们猛追云计算
在和一位创业者交流时,他说现在创业者想从市场脱颖而出太难了,且不论创业本身的不易,更多时候是想做的事情都被BAT广撒网覆盖了. 现实也正是如此,包括影业.在线音乐.车联网等领域,BAT都已涉足.如今, ...
- How to Install Linux, Apache, MySQL, PHP (LAMP) stack on CentOS 6 【Reliable】
About LAMP LAMP stack is a group of open source software used to get web servers up and running. The ...
- RMQ算法讲解
RMQ算法 引入: 例1.题目描述 输入N个数和M次询问,每次询问一个区间[L,R],求第L个数到R个数之间的最大值. 第一种方法:大暴力之术. 但是……时间复杂度最坏会达到 $O(NM)$,一半 ...
- NEXT | 不错过任何一个新产品
NEXT | 不错过任何一个新产品 NEXT 不错过任何一个新产品
- K - Rochambeau - poj2912(类似食物链)
一群小孩玩一个简单石头布布游戏,这些小孩会分成三组(组内可能没有人)+一个自由人(比翻译成裁判合理多了),同一组的小孩只会出同一种手势(不会变的),不过裁判可以出任意的手势,这些小孩能就会相互猜拳玩, ...
- 对于AttributeError: 'Flask' object has no attribute 'cli'的解决办法
版权声明:本文为博主原创文章,未经博主允许不得转载. 环境flask-script2.0.5.flask0.10.1 运行官方文档sample 出现问题 c:\kk\flask\examples\fl ...
- 百度地图点聚合MarkerClusterer,性能优化
参考文献:http://www.cnblogs.com/lightnull/p/6184867.html 百度的点聚合算法 是基于方格和距离的聚合算法,即开始的时候地图上没有任何已知的聚合点,然后遍历 ...