zoukankan      html  css  js  c++  java
  • cocos2dx 2.2 之触摸事件

     cocos2dx  2.2  之触摸事件

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

    注册触摸事件;

    接收触摸事件;

    处理触摸事件。

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

    1.注册触摸事件

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

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

    poker.h文件:

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

    poker.cpp文件:

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

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

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

    2.接收触摸事件

    接收触摸事件,实际上就是重写CCTargetedTouchDelegate的三个函数ccTouchBegan,ccTouchMoved,ccTouchEnded。
    1. bool Poker::ccTouchBegan(CCTouch *touch ,CCEvent *event)  
    2. {  
    3.     CCLog("Poker ccTouchBegan ");  
    4.     return false;  
    5. }  
    6.   
    7.   
    8. void Poker::ccTouchMoved(CCTouch *touch ,CCEvent *event)  
    9. {  
    10.     CCLog("Poker ccTouchMoved ");  
    11. }  
    12.   
    13.   
    14.   
    15. void Poker::ccTouchEnded(CCTouch *touch ,CCEvent *event)  
    16. {  
    17.       
    18.     CCLog("Poker ccTouchEnded ");  
    19. }  
    如此,接收流程已经完成,无意外的话,运行可以看到打印日志了。

    3.处理触摸事件

    首先要获取当前精灵所在的矩形
    也即是CCRect Poker::rect()需要做的事情。
    请注意,这里获取的方式的前提是,精灵使用系统默认的锚点,也即是精灵的正中央,如果改变过精灵的锚点(setAnchorPoint),那么就需要改变计算方法了。
    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的结点都可以看做一个坐标系)
    1. boolean  Poker::containTouchPoint(CCTouch* touch)  
    2. {  
    3.     return rect().containsPoint(convertTouchToNodeSpaceAR(touch));  
    4. }  
    在CCSprite内部使用convertTouchToNodeSpaceAR函数就可以将当前触摸点转化成精灵内部坐标系的点。
    最后,判断触摸事件,并处理。
    1. bool Poker::ccTouchBegan(CCTouch *touch ,CCEvent *event)  
    2. {  
    3.       
    4.     int x = getPositionX();  
    5.     int y = getPositionY();  
    6.     if (containTouchPoint(touch))  
    7.     {  
    8.         setPosition(ccp(x , y + 30));  
    9.     }  
    10.       
    11.     CCLog("Poker ccTouchBegan ");  
    12.     return false;  
    13. }  
    如果发现当前触摸点在CCSprite的内部,则将当前CCSprite的Y坐标上移30个像素。

  • 相关阅读:
    ES6 class -- Class 的基本语法
    ES6 Promise --回调与Promise的对比、信任问题、错误处理、Promise的状态、以及Promise对象的常用方法
    移动端调试,手机缓存清不掉
    JAR 介绍-百度百科
    一致性哈希的基本概念
    Java线程池的配置
    java多线程面试题整理及答案(2018年)
    Java多线程面试题整理
    IntelliJ Idea 常用快捷键
    RESTful规范
  • 原文地址:https://www.cnblogs.com/dudu580231/p/4826968.html
Copyright © 2011-2022 走看看