下面咱們看看HelloWorldScene.cpp具體的實現代碼以下:php
[html] view plaincopyhtml
bool HelloWorld::init() node
{ 函數
if( !Layer::init() ) 網站
{ this
returnfalse; spa
} .net
...... orm
setTouchEnabled(true); htm
//設置爲單點觸摸
setTouchMode(Touch::DispatchMode::ONE_BY_ONE);
returntrue;
}
bool HelloWorld::onTouchBegan(Touch*touch, Event* event) ①
{
log("onTouchBegan");
//經過tag(標籤)得到BoxA精靈
autoboxA = this->getChildByTag(kBoxA_Tag); ②
//若是BoxA精靈被點擊
if(this->isTap(boxA, touch)) ③
{
log("BoxAsprite Tap");
boxA->runAction(ScaleBy::create(0.06,1.06)); ④
returntrue; ⑤
}
//經過tag(標籤)得到BoxB精靈
autoboxB = this->getChildByTag(kBoxB_Tag); ⑥
//若是BoxB精靈被點擊
if(this->isTap(boxB, touch))
{
log("BoxBsprite Tap");
boxB->runAction(ScaleBy::create(0.06,1.06));
returntrue;
} ⑦
returnfalse;
}
void HelloWorld::onTouchMoved(Touch*touch, Event *event) ⑧
{
log("onTouchMoved");
//經過tag(標籤)得到BoxA精靈
autoboxA = this->getChildByTag(kBoxA_Tag);
//若是BoxA精靈被點擊
if(this->isTap(boxA, touch))
{
log("BoxAsprite Tap");
//移動當前按鈕精靈的座標位置
boxA->setPosition(boxA->getPosition()+ touch->getDelta());
return;
}
//經過tag(標籤)得到BoxB精靈
autoboxB = this->getChildByTag(kBoxB_Tag);
//若是BoxB精靈被點擊
if(this->isTap(boxB, touch))
{
log("BoxBsprite Tap");
//移動當前按鈕精靈的座標位置
boxB->setPosition(boxB->getPosition()+ touch->getDelta());
return;
}
}
void HelloWorld::onTouchEnded(Touch*touch, Event *event) ⑨
{
log("onTouchEnded");
//經過tag(標籤)得到BoxA精靈
autoboxA = this->getChildByTag(kBoxA_Tag);
//若是BoxA精靈被點擊
if(this->isTap(boxA, touch))
{
log("BoxAsprite Tap");
boxA->runAction(ScaleTo::create(0.06,1.0));
return;
}
//經過tag(標籤)得到BoxB精靈
autoboxB = this->getChildByTag(kBoxB_Tag);
//若是BoxB精靈被點擊
if(this->isTap(boxB, touch))
{
log("BoxBsprite Tap");
boxB->runAction(ScaleTo::create(0.06,1.0));
return;
}
}
bool HelloWorld::isTap(Node* node,Touch* touch) ⑩
{
//獲取觸摸點相對Node位置座標
PointlocationInNode = node->convertToNodeSpace(touch->getLocation()); ⑪
Sizes = node->getContentSize(); ⑫
Rectrect = Rect(0, 0, s.width, s.height); ⑬
//點擊範圍判斷檢測
if(rect.containsPoint(locationInNode)) ⑭
{
returntrue;
}
returnfalse;
}
上述代碼第①、⑧、⑨行分別定義了三個觸摸事件函數,函數的參數touch是在層中的觸摸點,event是觸摸事件,咱們不能使用8.1.3一節的auto target = static_cast<Sprite*>(event->getCurrentTarget())語句得到要點擊的精靈,事實上event->getCurrentTarget()函數得到的是事件源,這裏的事件源是當前的層,而不是精靈對象。那麼咱們如何判斷是否點擊了哪一個精靈呢?個人辦法是每個精靈逐一判斷。因此,咱們在第②~⑤行代碼判斷精靈BoxA是否被點擊,在第⑥~⑦行代碼判斷精靈BoxB是否被點擊。
代碼第③行用到了isTap函數,咱們在第⑩行定義了該函數,它是用來判斷觸摸點是否在精靈內,這個判斷主要是經過Rect的containsPoint函數判斷的。函數中第⑪行代碼獲取觸摸點相對精靈對象本地座標。第⑫行代碼是得到精靈對象的尺寸。第⑬行代碼是經過精靈對象的尺寸建立Rect變量。第⑭行代碼rect.containsPoint(locationInNode)是判斷是否觸摸點在精靈對象範圍。
更多內容請關注Cocos2d-x系列圖書《Cocos2d-x實戰(卷Ⅰ):C++開發》
本書交流討論網站:http://www.cocoagame.net
歡迎加入cocos2d-x技術討論羣:25776038六、327403678