Cocos2DX提供了加速度计和触屏的支持,两种操作方式为我们带来了不少新的乐趣。Cocos2DX对触屏的支持采用了事件驱动的方式:
上图反映了引擎在处理触屏的原理,目前的状况并不适合深入的原理性的东西。所有今天主要还是看看作为开发者如何响应触屏事件,首先看看引擎准备的函数
//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); } }
最后运行程序(上了一个静态图,还不会做动态图)
后记:不是在Cocos2DX官方解决方案中添加项目可能会出现访问冲突错误,我在写代码过程中也遇到此问题,期初以为自己代码写错了,后来想起[转]Cocos2d-x建工程时避免copy文件夹和库回复中提到这个方案并不完美,然后将相关的dll复制到本项目中就OK。
原文:http://www.cnblogs.com/BlueBeauty/p/3710538.html