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);
}