zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    quagga源码学习--BGP协议的初始化
    Golang pprof heap profile is empty
    python requests 配置超时及重试次数
    SVN: bdb: BDB1538 Program version 5.3 doesn't match environment version 4.7
    OpenSSL Command-Line HOWTO
    树莓派保卫战--防止SSH暴力破解
    Mac OS X Tips
    Git Tips
    SQL分组多列统计(GROUP BY后按条件分列统计)
    Show Linux Package Sort By Size
  • 原文地址:https://www.cnblogs.com/BlueBeauty/p/3710538.html
Copyright © 2011-2022 走看看