cocos2d-x處理單點觸控事件
這篇文章真的很菜鳥,但是出於考慮到cocos2d-x的資料真的不好查,網上又是千古文章一大抄,抄了很多還是很多的錯誤,所以還是寫一篇部落格。
cocos2d-x的觸控事件有多種方式,單點觸控最為簡單。
首先我們新建一個Cocos2d-win32 Application,轉到HelloWorldScene.cpp的bool HelloWorld::init()方法,裡邊有一個do...while(0)的迴圈,把迴圈裡邊bRet = true;之前的程式碼全部註釋掉,然後在bRet = true;之前的位置新增程式碼:
this->setIsTouchEnabled(true);//看名字是開啟觸控輸入,不過我試了不寫也可以,但是別的教程都說寫,先留著吧
CCTouchDispatcher::sharedDispatcher()->addTargetedDelegate(this,INT_MIN+1,true);
然後轉到HelloWorldScene.h,在最上邊新增using namespace cocos2d;,在類的public裡邊新增函式宣告:
virtual bool ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent);
virtual void registerWithTouchDispatcher(void);
然後再在cpp中寫上函式定義:
void HelloWorld::registerWithTouchDispatcher() {
}
bool HelloWorld::ccTouchBegan(CCTouch *pTouch,CCEvent *pEvent) {
return true;//返回true,就意味著不想讓這個觸控事件被傳送到其他優先順序更低的有針對性的觸控處理
}
void HelloWorld::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent) {
}
void HelloWorld::ccTouchEnded(CCTouch *pTouch,CCEvent *pEvent) {
}
void HelloWorld::ccTouchCancelled(CCTouch *pTouch, CCEvent *pEvent) {
}
然後除錯執行就可以了。
再來說一個滑鼠拖拽Sprite的例子,先在標頭檔案的public裡新增一個cocos2d::CCSprite* player;,這是咱們的角色。
再在cpp檔案init函式的迴圈裡的最前邊,新增如下程式碼:
player=CCSprite::spriteWithFile("CloseNormal.png");
CC_BREAK_IF(! player);
this->addChild(player,0,1);
CCSize screenSize = CCDirector::sharedDirector()->getWinSize();
float imageHeight=player->getTexture()->getContentSize().height;
player->setPosition(CCPointMake(screenSize.width/2,imageHeight/2));
這裡的CloseNormal.png是這個專案自帶的一個圖片。
再把ccTouchBegan函式和ccTouchMoved函式的裡邊的最前邊都新增如下程式碼:
player->setPositionX(pTouch->locationInView(pTouch->view()).x);
player->setPositionY(CCDirector::sharedDirector()->getWinSize().height-pTouch->locationInView(pTouch->view()).y);
//這裡為啥還要用視窗高度減去pTouch的y值呢?
//cocos2d-x比較奇特,y座標系是自下向上遞增的,最下邊是0,最上邊是最大
//所以這裡要減去一下,才可以的
//讀者可以去掉前邊的視窗高度減去的部分,試試
注意ccTouchBegan最後一定要有一個return true;的。
除錯執行,滑鼠點選並移動,一個關閉按鈕圖案的Sprite會跟著滑鼠走。