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-iphonestatic 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。