cocos2dx 2.2 之触摸事件

cocos2dx  2.2  之触摸事件

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

注册触摸事件;

接收触摸事件;

处理触摸事件。

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

1.注册触摸事件

精灵类Poker继承Sprite和CCTargetedTouchDelegate,并重写CCTargetedTouchDelegate的三个函数ccTouchBegan,ccTouchMoved,ccTouchEnded

同时加入辅助函数rect()和containTouchPoint(CCTouch* touch)用于后面的判断。

poker.h文件:

[cpp] view plaincopyprint?

  1. class Poker : public CCSprite ,public CCTargetedTouchDelegate
  2. {
  3. PokerState m_state;
  4. public:
  5. Poker(void);
  6. CCRect rect();
  7. virtual void onEnter();
  8. virtual void onExit();
  9. virtual ~Poker(void);
  10. boolean containTouchPoint(CCTouch* touch);
  11. virtual bool ccTouchBegan(CCTouch *touch ,CCEvent *event);
  12. virtual void ccTouchMoved(CCTouch *touch ,CCEvent *event);
  13. virtual void ccTouchEnded(CCTouch *touch ,CCEvent *event);
  14. };

poker.cpp文件:

这里需要再poker.cpp中添加具体的注册行为,onEnter和onExit函数分别是精灵创建和销毁时调用,因为可以在这两个函数中添加注册和销毁注册。

[cpp] view plaincopyprint?

  1. //CCNode进入场景时调用
  2. void Poker::onEnter()
  3. {
  4. CCDirector* pDirector = CCDirector::sharedDirector();
  5. pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
  6. CCSprite::onEnter();
  7. }
  8. //CCNode退出场景时调用
  9. void Poker::onExit()
  10. {
  11. CCDirector* pDirector = CCDirector::sharedDirector();
  12. pDirector->getTouchDispatcher()->removeDelegate(this);
  13. CCSprite::onExit();
  14. }

以上,我们的触摸事件注册流程就完成了。

2.接收触摸事件

接收触摸事件,实际上就是重写CCTargetedTouchDelegate的三个函数ccTouchBegan,ccTouchMoved,ccTouchEnded。

[cpp] view plaincopyprint?

  1. bool Poker::ccTouchBegan(CCTouch *touch ,CCEvent *event)
  2. {
  3. CCLog("Poker ccTouchBegan ");
  4. return false;
  5. }
  6. void Poker::ccTouchMoved(CCTouch *touch ,CCEvent *event)
  7. {
  8. CCLog("Poker ccTouchMoved ");
  9. }
  10. void Poker::ccTouchEnded(CCTouch *touch ,CCEvent *event)
  11. {
  12. CCLog("Poker ccTouchEnded ");
  13. }

如此,接收流程已经完成,无意外的话,运行可以看到打印日志了。

3.处理触摸事件

首先要获取当前精灵所在的矩形

也即是CCRect Poker::rect()需要做的事情。

请注意,这里获取的方式的前提是,精灵使用系统默认的锚点,也即是精灵的正中央,如果改变过精灵的锚点(setAnchorPoint),那么就需要改变计算方法了。

[cpp] view plaincopyprint?

  1. CCRect Poker::rect()
  2. {
  3. CCSize size = getTexture()->getContentSize();
  4. return CCRectMake(-size.width / 2 ,-size.height / 2, size.width ,size.height);
  5. }

如果将当前精灵也看做一个坐标系,若精灵的长为100,宽为100,那么获取的矩形应该是x = -50 , y = -50 ,width = 100 ,height = 100

其次,将触摸事件的点转化为当前精灵内部坐标系的点。

(可能不是很好理解,但是我们每一个继承自CCNode的结点都可以看做一个坐标系)

[cpp] view plaincopyprint?

  1. boolean  Poker::containTouchPoint(CCTouch* touch)
  2. {
  3. return rect().containsPoint(convertTouchToNodeSpaceAR(touch));
  4. }

在CCSprite内部使用convertTouchToNodeSpaceAR函数就可以将当前触摸点转化成精灵内部坐标系的点。

最后,判断触摸事件,并处理。

[cpp] view plaincopyprint?

  1. bool Poker::ccTouchBegan(CCTouch *touch ,CCEvent *event)
  2. {
  3. int x = getPositionX();
  4. int y = getPositionY();
  5. if (containTouchPoint(touch))
  6. {
  7. setPosition(ccp(x , y + 30));
  8. }
  9. CCLog("Poker ccTouchBegan ");
  10. return false;
  11. }

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

时间: 2024-10-13 20:00:35

cocos2dx 2.2 之触摸事件的相关文章

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

addChild(boxC,30, kBoxC_Tag);                                                                                         ⑥ returntrue; } 我们在HelloWorld::init()函数中初始化了场景中的背景和三个方块精灵.代码第①~④行是创建并添加背景,图8-3所示的背景是由一个128x128纹理图片(BackgroundTile.png)反复贴图上,这样可以减少内存

cocos2d-x 3.x之触摸事件

Layer类的一个重要作用就是接受输入事件,它封装了触摸输入的处理接口.一般情况下,我们可以通过setTouchEnabled方法来开启或关闭接收触摸输入.事实上并不是只有Layer才支持接收触摸事件,任何一个游戏元素都可以接收事件,只不过Layer提供了现成的支持. 我们只需通过创建一个事件监听器用来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher中,所有事件监听器由这个分发器统一管理,即可完成事件响应. 为一个精灵添加触摸事件的四个步骤 1.创建一个精灵 2.创建一

cocos2dx为Sprite添加触摸事件监听器

1.首先头文件定义事件处理的函数原型 private: bool onTouchBegan(Touch* tTouch,Event* eEvent);//手指按下事件 void onTouchMoved(Touch* tTouch,Event* eEvent);//手指移动事件 void onTouchEnded(Touch* tTouch,Event* eEvent);//手指离开事件 2.实现原型 bool ShopItem::onTouchBegan(Touch* tTouch,Event

cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检测

玩过植物大战僵尸都知道,要在草坪里放一朵向日葵或者其它的植物只需触摸那个植物将其拖入到想要摆放的位置,这其实就是这节要写的触摸事件.还可以发现当我们的僵尸出来的时候,我们的小豌豆会发子弹攻击僵尸,当子弹与僵尸碰撞的时候子弹自动消失,这就这节要说的碰撞检测. 下面具体看代码的实现: 做ios开发有触摸事件cocos2d同样也有 一.先覆写touch事件 .h文件 using namespace cocos2d; class MainScene:public CCLayer { private: v

Cocos2d-x中触摸事件

理解一个触摸事件可以从时间和空间两方面考虑. 1.触摸事件的时间方面 触摸事件的在时间方面,如下图所示,可以有不同的"按下"."移动"和"抬起"等阶段,表示触摸是否刚刚开始.是否正在移动或处于静止状态,以及何时结束,也就是手指何时从屏幕抬起.此外,触摸事件的不同阶段都可以有单点触摸或多点触摸,是否支持多点触摸还要看设备和平台. 触摸事件有两个事件监听器:EventListenerTouchOneByOne和EventListenerTouchAl

cocos2d-x项目101次相遇:使用触摸事件移动 精灵

cocos2d-x 101次相遇 / 文件夹 1   安装和环境搭建 -xcode 2   Scenes , Director, Layers, Sprites3   建立图片菜单 4   在HelloWorld上--建立新场景 5   添加一个精灵sprite 5.1   缩小sprite并使之完整显示6   action ,移动sprite 7   3.0 的点击事件,CCTouchDelegate已经停用了 8   使用触摸事件移动 精灵 void CMyFirstScene::onTou

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

下面我们通过一个实例详细了解一下,层中单点触摸事件的实现过程.感受一下它的缺点和优点.该实例场景如下图所示,场景中有两个方块精灵,我们可以点击和移动它们. 下面我们看看HelloWorldScene.cpp具体的实现代码如下: [html] view plaincopy bool HelloWorld::init() { if( !Layer::init() ) { returnfalse; } ...... setTouchEnabled(true); //设置为单点触摸 setTouchMo

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

今天, 我们来学习cocos2dX里面的触摸事件与触摸事件合集, 现在的手机游戏交互基本上都是通过触摸交互的, 所以大家明白这节的重要性了吧, 本节篇幅比较大, 所以我就不扯闲话了 先来看看常用函数: 触摸事件: addTargeteDelegate( 谁使用, 优先级, 是否拦截触摸消息); //注册单点触摸 virtual bool ccTouchBegan(CCTouch * touch,CCEvent * event); //触摸开始 virtual void ccTouchMoved(

cocos2d-x 事件分发机制 ——触摸事件监听

cocos2d-x 3.0 出来已经好久了,也已经用3.0写了几个小游戏,感觉3.0的事件触发机制太赞了,随这里总结一下,也算是对知识的一种回忆和加深理解. 3.0的事件分发机制中,需要也仅仅需要通过创建一个事件监听器来实现各种触发后的逻辑,然后添加到事件分发器_eventDispatcher,所有的事件监听器由这个分发器统一管理,即可完成事件响应. 事件监听器有以下几种: 1.EventListenerTouch(触摸事件) 2.EventListenerKeyboard(键盘响应事件) 3.