手持设备的一大革命和创新就是触摸技术的发展,那么作为手机游戏的开发,又怎么能不使用触摸技术呢?
Cocos2d—X封装了单点触摸和多点触摸,大家使用起来应该说是比较容易的哈。
好的,废话不说,先看下Cocos2d—X的代理源代码吧。
1.
class CC_DLL CCTouchDelegate
{
public:
CCTouchDelegate() {}
virtual ~CCTouchDelegate()
{
}
//单点触摸响应方法
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent); return false;};
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouch); CC_UNUSED_PARAM(pEvent);}
//多点触摸响应方法
virtual void ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
virtual void ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent) {CC_UNUSED_PARAM(pTouches); CC_UNUSED_PARAM(pEvent);}
};
单点触摸的话,不用在继承里面写上 CCTouchDelegate ,只要在init()里面添加代理就OK。
好的,下面看下单点触摸的实现:
在类里面实现这些方法,一般cancelled只在电话等事务调用。
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);
好的,然后在.cpp文件里面实现这些方法。
bool HelloWorld::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
static int flag ;
CCLOG("ccTouchBegan,%d",++flag);
return true;
}
void HelloWorld::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
static int flag ;
CCLOG("ccTouchEnded,%d",++flag);
}
void HelloWorld::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
static int flag ;
CCLOG("ccTouchMoved,%d",++flag);
}
void HelloWorld::ccTouchCancelled(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent)
{
static int flag ;
CCLOG("ccTouchCancelled,%d",++flag);
}
最重要的是在init()方法里面,添加下面的一句代码,将代理和目标绑定:
CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 1, true);
这样就不需要this->settouchEnabled();方法
这样就可以实现单点触摸事件的响应了。
2.
当然,这里还有一个要注意的地方是触摸点的坐标转化,分屏幕坐标,open gl坐标,手机坐标,通用open gl坐标。
下面有这几个方法获取触摸点。
CCPoint click = pTouch->getLocationInView();
CCLog("%f %f",click.x,click.y);
CCPoint click2 = pTouch->getLocation();
CCLog("%f %f",click2.x,click2.y);
CCPoint click3 = CCDirector::sharedDirector()->convertToGL(pTouch->getLocationInView());
CCLog("%f %f",click3.x,click3.y);
看下输出结果,你会发现第二和第三个坐标是相同的,原因是第二个方法再次封装了一次,把第三个方法封装了进去,方便大家使用。
// returns the current touch location in OpenGL coordinates
CCPoint CCTouch::getLocation() const
{
return CCDirector::sharedDirector()->convertToGL(m_point);
}
3.
好的,现在我们来看下多点触摸响应的事件处理。
首先需要在要实现的类里面重写多点触摸的方法:
virtual void ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
virtual void ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
virtual void ccTouchesMoved(cocos2d::CCSet* touches, cocos2d::CCEvent* event);
现在在.cpp文件里面重写这些方法:
//下面是三个触摸函数,开始,移动,和结束。从各个函数中可获取不同点的位置
void HelloWorld::ccTouchesBegan(cocos2d::CCSet* touches, cocos2d::CCEvent* event)
{
static int flag;
CCLOG("ccTouchesBegan,第%d次",++flag);
CCTouch *pTouch = (CCTouch*)touches->anyObject();
CCPoint click2 = pTouch->getLocation();
CCLog("%f %f",click2.x,click2.y);
}
void HelloWorld::ccTouchesMoved(cocos2d::CCSet* touches, cocos2d::CCEvent* event)
{
static int flag;
CCLOG("ccTouchesMoved,第%d次",++flag);
}
void HelloWorld::ccTouchesEnded(cocos2d::CCSet* touches, cocos2d::CCEvent* event)
{
static int flag;
CCLOG("ccTouchesEnded,第%d次",++flag);
}
获取触摸点击的坐标呢,多了一条代码:
CCTouch *pTouch = (CCTouch*)touches->anyObject();
多点触摸的代理设置必须在类的继承里面写上
public cocos2d::CCTargetedTouchDelegate
this->setTouchEnabled(true);