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会跟着鼠标走。