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; class Touch :public CCLayerColor { public: static CCScene * scene(); CREATE_FUNC(Touch); bool init(); enum MyEnum { BN747 };
bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); void ccTouchCancelled(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); return scene; }
bool Touch::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);
return true; }
bool Touch::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { CCSprite * plane = (CCSprite *)getChildByTag(BN747); CCPoint pt = pTouch->getLocation(); if (plane->boundingBox().containsPoint(pt)) { CCLOG("touched"); return true; } //决定消息是否往下传递 return false; }
void Touch::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) { CCSprite * plane = (CCSprite *)getChildByTag(BN747); CCPoint pt = 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); }
void Touch::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent) { CCLog("ccTouchEnded"); }
void Touch::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) { CCLog("ccTouchCancelled"); } |
执行结果:
|