首页 > 代码库 > cocos2d-x学习记录3——CCTouch触摸响应
cocos2d-x学习记录3——CCTouch触摸响应
游戏不同于影音,强交互性是其一大特色,在游戏中主要体现为接受用户的输入并响应。智能手机触摸是其重要的输入方式。
在cocos2d-x中,触摸分为单点触摸和多点触摸。
单点触摸:主要继承CCTargetedTouchDelegate 实现。
多点触摸:主要继承CCStandardTouchDelegate实现。
MyScene.h
1 #ifndef MyScene_H_H 2 #define MyScene_H_H 3 4 #include "cocos2d.h" 5 using namespace cocos2d; 6 7 class MyScene : public CCLayer 8 { 9 public:10 static CCScene* createScene();11 virtual bool init();12 CREATE_FUNC( MyScene );13 14 virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);15 virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);16 virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent);17 virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);18 19 virtual void registerWithTouchDispatcher();20 21 22 private:23 };24 25 #endif
MyScene.cpp
1 #include "MyScene.h" 2 3 CCScene* MyScene::createScene() 4 { 5 CCScene *scene = CCScene::create(); 6 MyScene *layer = MyScene::create(); 7 scene->addChild(layer); 8 return scene; 9 };10 11 12 bool MyScene::init()13 {14 if( !CCLayer::init() ){15 return false;16 }17 18 CCSize size = CCDirector::sharedDirector()->getWinSize();19 CCSprite *sprite = CCSprite::create("pal4.png");20 sprite->setAnchorPoint( ccp(0.5, 0.5) );21 //sprite->setPosition( ccp(size.width/2, size.height/2) );22 sprite->setPosition( ccp(size.width/2, size.height/2) );23 sprite->setScale(0.5f);24 sprite->setTag(2345);25 addChild(sprite);26 27 setTouchEnabled(true);28 29 return true;30 }31 32 bool MyScene::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent)33 {34 CCPoint point = pTouch->getLocationInView();35 point = CCDirector::sharedDirector()->convertToGL(point);36 CCNode *node = getChildByTag(2345);37 float x = node->getPositionX();38 float y = node->getPositionY();39 float width = node->getContentSize().width*node->getScale();40 float height = node->getContentSize().height*node->getScale();41 //CCRect rect = CCRectMake(node->getPositionX()-node->getContentSize().width/2, node->getPositionY()-node->getContentSize().height/2,42 // node->getContentSize().width, node->getContentSize().height);43 CCRect rect = CCRectMake(x-width/2, y-height/2, width, height);44 45 //CCLog("Touch start! %.1f,%.1f", point.x, point.y);46 //CCMessageBox("start","info");47 //return true;48 49 if( rect.containsPoint(point) ){50 CCLog("Touch start! %.1f,%.1f", point.x, point.y);51 return true;52 }53 54 return false;55 }56 57 void MyScene::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent)58 {59 CCPoint point = pTouch->getLocation();60 CCLog("Touch moved! %.1f,%.1f", point.x, point.y);61 }62 63 void MyScene::ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent)64 {65 CCPoint point = pTouch->getLocation();66 CCLog("Touch ended! %.1f, %.1f", point.x, point.y);67 }68 69 void MyScene::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent)70 {71 CCPoint point = pTouch->getLocation();72 CCLog("Touch canceled! %.1f, %.1f", point.x, point.y);73 }74 75 void MyScene::registerWithTouchDispatcher()76 {77 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);78 }
运行结果:
在TouchStart中,判断按下的点是否在图片显示区域内。如果在,则打出log,并返回true,然后CCTouchMove、CCTouchEnded等事件才会被响应;否则,不会响应。
Touches标准型。多点触摸时,会将所有的触摸点放进一个CCSet中。
1 void MyScene::registerWithTouchDispatcher() 2 { 3 //CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true); 4 CCLayer::registerWithTouchDispatcher(); 5 } 6 7 8 void MyScene::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent) 9 {10 if( pTouches->count() == 1 ){11 CCTouch *touch = (CCTouch*)(*( pTouches->begin() ));12 13 CCPoint point = touch->getLocationInView();14 point = CCDirector::sharedDirector()->convertToGL(point);15 CCNode *node = getChildByTag(2345);16 float x = node->getPositionX();17 float y = node->getPositionY();18 float width = node->getContentSize().width*node->getScale();19 float height = node->getContentSize().height*node->getScale();20 CCRect rect = CCRectMake(x-width/2, y-height/2, width, height);21 22 //CCLog("Touches start! %.1f,%.1f", point.x, point.y);23 24 if( rect.containsPoint(point) ){25 CCLog("Touches start! %.1f,%.1f", point.x, point.y);26 }27 }28 29 //return false; 30 }31 32 void MyScene::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)33 {34 if( pTouches->count() == 1 ){35 CCTouch *touch = (CCTouch*)(*( pTouches->begin() ));36 CCPoint point = touch->getLocationInView();37 CCLog("Touches moved! %.1f,%.1f", point.x, point.y);38 }39 }40 41 void MyScene::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)42 {43 if( pTouches->count() == 1 ){44 CCTouch *touch = (CCTouch*)(*( pTouches->begin() ));45 CCPoint point = touch->getLocationInView();46 CCLog("Touches ended! %.1f,%.1f", point.x, point.y);47 }48 }49 50 void MyScene::ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent)51 {52 if( pTouches->count() == 1 ){53 CCTouch *touch = (CCTouch*)(*( pTouches->begin() ));54 CCPoint point = touch->getLocationInView();55 CCLog("Touches canceled! %.1f,%.1f", point.x, point.y);56 }57 }
和标准CCTouch基本相同,只是在注册时,调用一次CCLayer的触摸注册函数即可。
运行结果:
cocos2d-x学习记录3——CCTouch触摸响应
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。