首页 > 代码库 > 06--触摸事件响应

06--触摸事件响应

Cocos2DX提供了加速度计和触屏的支持,两种操作方式为我们带来了不少新的乐趣。Cocos2DX对触屏的支持采用了事件驱动的方式:

                               image

上图反映了引擎在处理触屏的原理,目前的状况并不适合深入的原理性的东西。所有今天主要还是看看作为开发者如何响应触屏事件,首先看看引擎准备的函数

//CCLayer.h
    // default implements are used to call script callback if exist
    virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);
    virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);

    // default implements are used to call script callback if exist
    virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent);
    virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent);

         从CCLayer定义的接口来看,不难发现Cocos2DX支持单点和多点触摸操作,而多点触摸也能实现单点触摸操作的效果。上面的接口让我想起了WinFrom中支持拖拽操作的控件,需要响应拖拽开始、拖拽过程、拖拽结束。

         废话了,使用向导新建一个工程TouchDemo,然后删除菜单等相关代码,并复制ball.png图片到资源目录。HelloWorldScene.h中添加命名空间,添加需要重载的接口

#ifndef __HELLOWORLD_SCENE_H__
#define __HELLOWORLD_SCENE_H__

#include "cocos2d.h"

using namespace cocos2d;

class HelloWorld : public cocos2d::CCLayer
{
public:
    // Here‘s a difference. Method ‘init‘ in cocos2d-x returns bool, instead of returning ‘id‘ in cocos2d-iphone
  
  
    static cocos2d::CCScene* scene();
    
    // a selector callback
    void menuCloseCallback(CCObject* pSender);
public:
    virtual bool init();  

    //触屏开始事件
    virtual void ccTouchesBegan (CCSet *pTouches, CCEvent *pEvent);
    //触屏移动事件
    virtual void ccTouchesMoved (CCSet *pTouches, CCEvent *pEvent);
    //触屏结束事件
    virtual void ccTouchesEnded (CCSet *pTouches, CCEvent *pEvent);
    
    CREATE_FUNC(HelloWorld);
};

#endif  // __HELLOWORLD_SCENE_H__

然后修改HelloWorldScene.cpp中的init函数如下:

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !CCLayer::init() )
    {
        return false;
    }

    //开启多点触摸
    setTouchEnabled(true);

    CCSprite* pSprite = CCSprite::create("ball.png");
    pSprite->setPosition(ccp(100,200));
    addChild(pSprite,0 , 88);
    return true;
}

实现触屏操作,这里实现的功能是精灵根据移动到触摸点。这个功能重载ccTouchesMoved 函数即可,在开始和结束事件中输出触点坐标。

void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
    CCSetIterator iter = pTouches->begin();
    for (; iter!=pTouches->end(); iter++) {
        CCTouch * pTouch=(CCTouch * )(* iter);
        CCPoint loaction = pTouch->getLocation();
        CCLog("pTouch start :x=%f , y=%f",loaction.x ,loaction.y);
    }
}
void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
    CCSetIterator iter = pTouches->begin();
    for (; iter!=pTouches->end(); iter++) {
        CCTouch * pTouch = (CCTouch * )(* iter);
        CCPoint location = pTouch->getLocation();

        CCSprite * pSprite =  (CCSprite* )this->getChildByTag(88);
        pSprite->setPosition(location);        
    }
}
void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
    CCSetIterator iter = pTouches->begin();
    for (; iter!=pTouches->end(); iter++) {
        CCTouch * pTouch=(CCTouch * )(* iter);
        CCPoint loaction = pTouch->getLocation();
        CCLog("pTouch end :x=%f , y=%f",loaction.x ,loaction.y);
    }
}

最后运行程序(上了一个静态图,还不会做动态图哭泣的脸

image

 

后记:不是在Cocos2DX官方解决方案中添加项目可能会出现访问冲突错误,我在写代码过程中也遇到此问题,期初以为自己代码写错了,后来想起[转]Cocos2d-x建工程时避免copy文件夹和库回复中提到这个方案并不完美,然后将相关的dll复制到本项目中就OK。