首页 > 代码库 > 5.触摸touch,单点触摸,多点触摸,触摸优先和触摸事件的吞噬
5.触摸touch,单点触摸,多点触摸,触摸优先和触摸事件的吞噬
1触摸
Coco2dx默认只有CCLayer及其派生类才有触摸的功能。
2单点触摸
打开触摸开关和触摸方式
setTouchEnabled(true);
setTouchMode(kCCTouchesOneByOne);
Cocos2dx对触摸分三布来处理。分是是点触,移动,离开。或是中间被打断。其功能皆有相应的virtual函数进行override的。
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); |
获取点击的坐标点
CCPoint pt = pTouch->getLocation(); CCLog(“x=%f y=%f”,pt.x,pt.y); |
理解getDelta();
ccTouchBegan start x = 67.309761 y = 180.989975 ccTouchMoved delta x = 1.013191, y = 0.000000 ccTouchMoved delta x = 5.977837, y = 0.000000 ccTouchMoved delta x = 3.985229, y = 0.000000 ccTouchMoved delta x = 1.013184, y = 0.000000 ccTouchMoved delta x = 1.992615, y = 0.000000 ccTouchMoved ................................... ................................... delta x = 1.013184, y = 0.000000 ccTouchMoved delta x = 0.979431, y = 0.000000 ccTouchMoved delta x = 1.992615, y = 0.000000 ccTouchMoved delta x = 3.005798, y = 0.000000 ccTouchMoved delta x = 3.005798, y = 0.000000 ccTouchMoved delta x = 2.972015, y = 0.000000 ccTouchMoved delta x = 1.013214, y = 0.000000 ccTouchMoved delta x = 3.005798, y = 0.000000 ccTouchMoved delta x = 0.979431, y = 0.000000 ccTouchEnded |
3多点触摸
打开触摸开关,系统默认为单点触摸。
setTouchEnabled(true); |
cocos2dx对触摸分三部来处理。分别是点触,移动,离开。或是中间被打断。其功能皆有相应的virtual函数进行override的。
virtual bool 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); |
获取点击的坐标点。
4案例(打飞机)
Touch.h |
#ifndef__TOUCH_H__ #define__TOUCH_H__
#include"cocos2d.h" USING_NS_CC; classTouch :publicCCLayerColor { public: staticCCScene *scene(); CREATE_FUNC(Touch); boolinit(); enumMyEnum { BN747 };
boolccTouchBegan(CCTouch *pTouch,CCEvent *pEvent); voidccTouchMoved(CCTouch *pTouch,CCEvent *pEvent); voidccTouchEnded(CCTouch *pTouch,CCEvent *pEvent); voidccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent); };
#endif |
Touch.cpp |
#include"Touch.h" #include"AppMacros.h"
CCScene *Touch::scene() { CCScene *scene =CCScene::create(); Touch *layer =Touch::create(); scene->addChild(layer); returnscene; }
boolTouch::init() { CCLayerColor::initWithColor(ccc4(255, 255, 255, 255));
setTouchEnabled(true); setTouchMode(kCCTouchesOneByOne);
CCSprite *plane =CCSprite::create("hero1.png"); plane->setPosition(ccp(100, 100)); addChild(plane); plane->setTag(BN747);
returntrue; }
boolTouch::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent) { CCSprite *plane = (CCSprite *)getChildByTag(BN747); CCPointpt =pTouch->getLocation(); if (plane->boundingBox().containsPoint(pt)) { CCLOG("touched"); returntrue; } //决定消息是否往下传递 returnfalse; }
voidTouch::ccTouchMoved(CCTouch *pTouch,CCEvent *pEvent) { CCSprite *plane = (CCSprite *)getChildByTag(BN747); CCPointpt =plane->getPosition() + pTouch->getDelta(); if (pt.x > plane->getContentSize().width / 2 && pt.x < winSize.width - plane->getContentSize().width / 2 && pt.y > plane->getContentSize().height / 2 && pt.y < winSize.height - plane->getContentSize().height / 2) { plane->setPosition(pt); } CCLog("ccTouchMoved x = %g y = %g",pt.x,pt.y); }
voidTouch::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent) { CCLog("ccTouchEnded"); }
voidTouch::ccTouchCancelled(CCTouch *pTouch,CCEvent *pEvent) { CCLog("ccTouchCancelled"); } |
运行结果: |
5.触摸touch,单点触摸,多点触摸,触摸优先和触摸事件的吞噬