要使精灵能够接收到触摸事件,无非要做三件事。

注册触摸事件;

接收触摸事件;

处理触摸事件。

下面就从这三点出发,来了解一下精灵如何响应触摸事件。

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));
} CCLog("Poker ccTouchBegan ");
return false;
}

如果发现当前触摸点在CCSprite的内部,则将当前CCSprite的Y坐标上移30个像素。




cocos2dx之触摸事件的更多相关文章

  1. cocos2d-x lua 触摸事件

    cocos2d-x lua 触摸事件 version: cocos2d-x 3.6 1.监听 function GameLayer:onEnter() local eventDispatcher = ...

  2. Cocos2d-x中触摸事件

    理解一个触摸事件可以从时间和空间两方面考虑. 1.触摸事件的时间方面 触摸事件的在时间方面,如下图所示,可以有不同的“按下”.“移动”和“抬起”等阶段,表示触摸是否刚刚开始.是否正在移动或处于静止状态 ...

  3. cocos2dx 中触摸事件分发一些解读

    触摸事件分发中几个代码解读: 怎么说呢,感觉cocos2dx中的消息分发机制,相对于android中触摸事件分发机制要简单的多.因为android中要做区域判断,过滤器,以及父子组件分发给谁等等的逻辑 ...

  4. cocos2d-x游戏引擎核心之五——触摸事件和触摸分发器机制

    一.触摸事件 为了处理屏幕触摸事件,Cocos2d-x 提供了非常方便.灵活的支持.在深入研究 Cocos2d-x 的触摸事件分发机制之前,我们利用 CCLayer 已经封装好的触摸接口来实现对简单的 ...

  5. Cocos2d-x开发实例:单点触摸事件

    下面我们通过一个实例详细了解一下,层中单点触摸事件的实现过程.感受一下它的缺点和优点.该实例场景如下图所示,场景中有两个方块精灵,我们可以点击和移动它们.   下面我们看看HelloWorldScen ...

  6. Cocos2d-x实例:单点触摸事件

    addChild(boxC,30, kBoxC_Tag);                                                                        ...

  7. cocos2d-x触摸事件优先级的探究与实践

    如何让自定义Layer触发触摸事件? bool LayerXXX::init() { this->setTouchEnabled(true); CCTouchDispatcher* td = C ...

  8. cocos2d-x jsb 防止触摸事件传递

    在游戏中要实现消息弹窗,让用户点击确认,其他区域产生遮罩,阻挡下层的事件被点击到,这是个很常用的功能,在cocos2d-x中,可以通过为layer添加事件代理来实现: pDirector->ge ...

  9. cocos2dX 事件之触摸事件和触摸事件集合

    今天, 我们来学习cocos2dX里面的触摸事件与触摸事件合集, 如今的手机游戏交互基本上都是通过触摸交互的, 所以大家明确这节的重要性了吧, 本节篇幅比較大, 所以我就不扯闲话了 先来看看经常使用函 ...

随机推荐

  1. 关于extern "C" 的用法

    而在C语言的头文件中,对其外部函数只能指定为extern类型,C语言中不支持extern "C"声明,在.c文件中包含了extern "C"时会出现编译语法错误 ...

  2. 解决mongodb ISODate相差8小时问题

    服务端使用mongoose操作mongodb,其中Schema中的日期字段定义如下: date: {type:Date, default:Date.now},//操作日期 插入到mongodb中adt ...

  3. Android 有趣味的GridView

    工作这么久以来,都是以解决需求为目标.渐渐发现这种学习方式不好,学到的知识能马上解决问题,但没有经过梳理归纳.故想系统总结下一些有趣味的知识点.在这篇博客中想以一个例子系统讲解下GridView控件涉 ...

  4. new Random().nextInt

    public static void main(String[] args) { System.out.println(new Random().nextInt(0)); } Exception in ...

  5. 【HDOJ】1208 Pascal's Travels

    记忆化搜索.注意当除右下角0外,其余搜索到0则返回. #include <algorithm> #include <cstdio> #include <cstring&g ...

  6. POJ Wormholes 3259

    题目描述: Farmer John 在探索农场的时候 惊奇的发现一些虫洞,虫洞是一个特殊的东西,他是一个单向通道,他能到达虫洞的另一端, 可以穿越到达之前的时间.Farmer John 的由N个农场组 ...

  7. File System Minifilter Drivers(文件系统微型过滤驱动)入门

    问题: 公司之前有一套文件过滤驱动,但是在实施过程中经常出现问题,现在交由我维护.于是在边看代码的过程中,一边查看官方资料,进行整理. 这套文件过滤驱动的目的只要是根据应用层下发的策略来控制对某些特定 ...

  8. 关于echo `git branch | grep \*`

    本来想返回一个git当前的分支.但会将这个文件夹下的所有目录与分支一起输出. 原因是  echo `git branch | grep \*`  等价于   echo * master  , 而  e ...

  9. K - Leapin' Lizards - HDU 2732(最大流)

    题意:在一个迷宫里面有一些蜥蜴,这个迷宫有一些柱子组成的,并且这些柱子都有一个耐久值,每当一只蜥蜴跳过耐久值就会减一,当耐久值为0的时候这个柱子就不能使用了,每个蜥蜴都有一个最大跳跃值d,现在想知道有 ...

  10. 让IE6,7,8支持HTML5新标签的方法

    很多网站对网页进行重构的时候,提高标签的语义性,在网页中大量使用了section,article,header等HTML5新标签.考虑到目前win7自带的IE浏览器版本是IE8,而IE8不支持HTML ...