Cocos2d-x觸摸事宜實例。本站提示廣大學習愛好者:(Cocos2d-x觸摸事宜實例)文章只能為提供參考,不一定能成為您想要的結果。以下是Cocos2d-x觸摸事宜實例正文
在玩手機游戲的時刻,屏幕吸收我們的觸摸新聞是必弗成少的,依據我們的觸摸事宜,去完成響應的功效,這裡我們就來進修一下cocos2d-x中的觸摸是怎樣完成的。觸摸分為單點觸摸和多點觸摸,先來看單點觸摸,就是吸收一個點的觸摸。代碼將完成進程清晰的寫了上去,細心剖析代碼吧。
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //開啟觸摸 this->setTouchEnabled(true); bRet = true; } while (0); return bRet; } //開啟觸摸今後必需注冊觸摸事宜,告知引擎你支撐單點觸摸照樣多點觸摸 void HelloWorld::registerWithTouchDispatcher() { //addTargetedDelegate注冊單點觸摸,第一個參數代表為哪一個對象注冊觸摸事宜,第二個代表優先級,數字越 //小,優先級越高,第三個參數代表能否吞噬新聞,假如為true這個節點接收了新聞,處置後,優先級比它小的節點 //就接收不到新聞了 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true); } //ccTouchBegan是必需要完成的函數,也是在四個協定辦法中獨一一個前往值為bool類型的函數 //前往值是true的情形下,會接上去呼應ccTouchMoved和ccTouchEnded和ccTouchCancelled函數。 //CCTouch中封裝了關於觸摸點的一些屬性,例如坐標信息,CCEvent沒有甚麼用 bool HelloWorld::ccTouchBegan(CCTouch * pTouch,CCEvent * pEvent) { //取得opengl坐標下的點坐標 CCPoint point = pTouch->getLocation(); CCSprite * sprite = CCSprite::create("image.png"); this->addChild(sprite); sprite->setPosition(point); return true; } //當手指在屏幕上挪動的時刻赓續挪用的一個辦法 void HelloWorld::ccTouchMoved(CCTouch * touch,CCEvent * pEvent) { //取得opengl坐標下的點坐標 CCPoint point = touch->getLocation(); CCSprite * sprite = CCSprite::create("image.png"); this->addChild(sprite); sprite->setPosition(point); } //當手指抬起來的時刻會挪用的辦法 void HelloWorld::ccTouchEnded(CCTouch * pTouch,CCEvent * pEvent) { this->removeAllChildrenWithCleanup(true); } //還有一個ccTouchCancelled函數,在撤消觸摸事宜的時刻挪用,好比我們在觸屏的時刻忽然打來了德律風
接上去用我們方才學到的常識,來完成拖拽精靈挪動的後果。
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //完成拖拽精靈挪動的後果 CCSprite * sprite = CCSprite::create("image2.png"); sprite->setPosition(ccp(240,180)); this->addChild(sprite,0,0); //開啟觸摸 this->setTouchEnabled(true); bRet = true; } while (0); return bRet; } //開啟觸摸今後必需注冊觸摸事宜,告知引擎你支撐單點觸摸照樣多點觸摸 void HelloWorld::registerWithTouchDispatcher() { //addTargetedDelegate注冊單點觸摸,第一個參數代表為哪一個對象注冊觸摸事宜,第二個代表優先級,數字越 //小,優先級越高,第三個參數代表能否吞噬新聞,假如為true這個節點接收了新聞,處置後,優先級比它小的節點 //就接收不到新聞了 CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this,0,true); } bool HelloWorld::ccTouchBegan(CCTouch * touch,CCEvent * pEvent) { CCSprite * sprite = (CCSprite *)this->getChildByTag(0); //取得手指導擊的點的坐標 CCPoint point = touch->getLocation(); //取得精靈地點的區域,CCRect包含x,y,width,height CCRect rect = sprite->boundingBox(); //斷定手指導擊的點能否點在了精靈上 if(rect.containsPoint(point)) { //前往true則會接收其他的協定新聞 return true; } return false; } void HelloWorld::ccTouchMoved(CCTouch * touch,CCEvent * pEvent) { /* 這裡可以直接將精靈的坐標設置為手指地點點的坐標地位,然則如許的話會發生騰躍的後果,視覺上欠好看,這是 由於精靈是在用本身的錨點占領我們設置的坐標地位,而不是我們點擊在精靈身上的誰人點放到我們的手指地點的地位 */ //分離取得了手指如今的點擊點和手指前次的點擊點地位 CCPoint point = touch->getLocation(); CCPoint pointPre = touch->getPreviousLocation(); //ccpSub將倆個點相減,取得一個挪動偏向的向量 CCPoint direction = ccpSub(point,pointPre); CCSprite * sprite = (CCSprite *)this->getChildByTag(0); CCPoint spritePoint = sprite->getPosition(); //ccpAdd將精靈如今的地位點和挪動偏向的向量相加,取得精靈將要挪動到的地位點 CCPoint spriteDirection = ccpAdd(spritePoint,direction); sprite->setPosition(spriteDirection); }
接上去進修多點觸摸,多點觸摸和單點觸摸分歧的是它的優先級要低於單點觸摸,豈論注冊的時刻裡邊傳入的數字是若干,固然還有其它的一些差別,讓我們看代碼吧。以下是在windows演出示的後果,windows上沒法完成多點觸摸。
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //完成拖拽精靈挪動的後果 CCSprite * sprite = CCSprite::create("image2.png"); sprite->setPosition(ccp(240,180)); this->addChild(sprite,0,0); //開啟觸摸 this->setTouchEnabled(true); bRet = true; } while (0); return bRet; } void HelloWorld::registerWithTouchDispatcher() { //注冊多點觸摸,裡邊只要倆個參數 CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,0); } //在多點觸摸中,這四個協定函數在touch後邊都加了es,而且每一個協定函數不須要都完成,一切的前往值都是void //CCSet是CCTouch的聚集 void HelloWorld::ccTouchesBegan(CCSet * set,CCEvent * pEvent) { //CCSetIterator是一個迭代器 CCSetIterator iterator; //以下的辦法就是從CCSet中取得對象的辦法 for(iterator = set->begin();iterator != set->end();iterator++) { //將元素強迫轉化為CCTouch *類型 CCTouch * touch = (CCTouch *)(*iterator); CCPoint point = touch->getLocation(); CCSprite * sprite = CCSprite::create("image.png"); sprite->setPosition(point); this->addChild(sprite); } }
接上去應用上邊的多點觸摸新聞完成精靈的縮小和縮放後果,年夜家看到的相冊圖片縮小和減少的後果也是這麼完成的,然則windows不支撐多點,所以這裡只是解釋道理。
檢查源代碼打印贊助
bool HelloWorld::init() { bool bRet = false; do { CC_BREAK_IF(! CCLayer::init()); //完成拖拽精靈挪動的後果 CCSprite * sprite = CCSprite::create("image2.png"); sprite->setPosition(ccp(240,180)); this->addChild(sprite,0,0); //開啟觸摸 this->setTouchEnabled(true); bRet = true; } while (0); return bRet; } void HelloWorld::registerWithTouchDispatcher() { //注冊多點觸摸,裡邊只要倆個參數 CCDirector::sharedDirector()->getTouchDispatcher()->addStandardDelegate(this,0); } void HelloWorld::ccTouchesBegan(CCSet * set,CCEvent * pEvent) { CCSetIterator iterator = set->begin(); //取得第一個觸摸點 CCTouch * touch0 = (CCTouch *)(*iterator); iterator++; //法式履行到這裡會逝世失落,由於windows只支撐單點觸摸,不支撐多點,所以這裡是不會取得第二個點的 CCTouch * touch1 = (CCTouch *)(*iterator); length = ccpDistance(touch0->getLocation(),touch1->getLocation()); } void HelloWorld::ccTouchesMoved(CCSet * set,CCEvent * pEvent) { CCSetIterator iterator = set->begin(); CCTouch * touch0 = (CCTouch *)(*iterator); iterator++; CCTouch * touch1 = (CCTouch *)(*iterator); float length2 = ccpDistance(touch0->getLocation(),touch1->getLocation()); float times = length2/length; CCSprite * sprite = (CCSprite *)this->getChildByTag(0); sprite->setScale(times); }