Cocos2d—X游戏开发之CCTouch屏幕触摸事件获取(九)
2013-07-10 12:12
411 查看
手持设备的一大革命和创新就是触摸技术的发展,那么作为手机游戏的开发,又怎么能不使用触摸技术呢?
Cocos2d—X封装了单点触摸和多点触摸,大家使用起来应该说是比较容易的哈。
好的,废话不说,先看下Cocos2d—X的代理源代码吧。
1.
如果需要使用这些触摸方法的,只需要在类里面重写这些方法,有一点要注意的地方是单点触摸和多点触摸有些继承方面的区别。
单点触摸的话,不用在继承里面写上 CCTouchDelegate ,只要在init()里面添加代理就OK。
好的,下面看下单点触摸的实现:
在类里面实现这些方法,一般cancelled只在电话等事务调用。
好的,然后在.cpp文件里面实现这些方法。
最重要的是在init()方法里面,添加下面的一句代码,将代理和目标绑定:
这样就不需要this->settouchEnabled();方法
这样就可以实现单点触摸事件的响应了。
2.
当然,这里还有一个要注意的地方是触摸点的坐标转化,分屏幕坐标,open gl坐标,手机坐标,通用open gl坐标。
下面有这几个方法获取触摸点。
看下输出结果,你会发现第二和第三个坐标是相同的,原因是第二个方法再次封装了一次,把第三个方法封装了进去,方便大家使用。
3.
好的,现在我们来看下多点触摸响应的事件处理。
首先需要在要实现的类里面重写多点触摸的方法:
现在在.cpp文件里面重写这些方法:
获取触摸点击的坐标呢,多了一条代码:
多点触摸的代理设置必须在类的继承里面写上
而且在init()方法里面需要将触摸有效设置为true;
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
而且在init()方法里面需要将触摸有效设置为true;
this->setTouchEnabled(true);
相关文章推荐
- Quick-Cocos2d-x游戏开发触摸捕获事件 cc.NODE_TOUCH_CAPTURE_EVENT
- quick-cocos2d-x游戏开发【10】——触摸捕获事件 cc.NODE_TOUCH_CAPTURE_EVENT
- quick-cocos2d-x游戏开发【10】——触摸捕获事件 cc.NODE_TOUCH_CAPTURE_EVENT
- Android开发-触屏事件的获取和触摸屏幕位置
- Android开发-触屏事件的获取和触摸屏幕位置
- Cocos2d-x游戏开发——屏幕触摸事件
- Android开发-触屏事件的获取和触摸屏幕位置
- Cocos2D-x游戏开发之八:事件连续执行:CCMoveBy CCCallFunc CCSequence
- cocos2d ccLayer响应触摸事件方法:CCStandardTouchDelegate 与 CCTargetedTouchDelegate
- JS事件监听手机屏幕触摸事件 Touch
- Android开发08_OnTouchevent触摸事件(手势监听)
- Android游戏开发教程之十九:屏幕双击事件的捕获
- 推箱子游戏开发(二) 键盘事件监听 角色在屏幕上移动
- JS事件监听手机屏幕触摸事件 Touch
- iPhone开发进阶(8)--- 检测屏幕触摸事件
- iPhone开发进阶(8)--- 检测屏幕触摸事件
- ios-cocos2d游戏开发基础-CCLayer和Touch事件-开发笔记
- Cocos2d-X游戏开发之CCTouchDelegate
- cocos2d-x ios游戏开发初认识(八) 触摸事件与碰撞检測