在cocos2d-x中触屏事件有四种,即:
//触屏开始事件
virtual voidccTouchesBegan (CCSet *pTouches, CCEvent *pEvent)
//触屏移动事件
virtual void ccTouchesMoved (CCSet *pTouches, CCEvent *pEvent)
//触屏结束事件
virtual void ccTouchesEnded (CCSet *pTouches, CCEvent *pEvent)
//触屏取消事件
virtual void ccTouchesCancelled (CCSet *pTouches, CCEvent *pEvent)
我们这一篇文章实现点击屏幕后在点击的位置显示一张图片,新建一个项目并命名为“TouchEventTest”。图片资源还是使用TestCpp项目自带的资源,我的目录为D:\cocos2d-2.0-x-2.0.4\samples\TestCpp\Resources\Images(你的目录有可能不一样)找到ball.png复制到我们自己的项目中的Resources文件夹,然后在VS中右击项目选择添加->现有项,添加刚刚复制的图片到我们的项目SpriteTest即可。
(注意:我使用的cocos2d-x版本是2.0.4,系统是win7)下载地址
首先在HelloWorld.h文件中使用cocos2d的命名空间,即加入”using namespace cocos2d;“这句话。
然后在HelloWorld布景类中声明这四个函数,修改后的HelloWorld布景类代码如下
class HelloWorld : public cocos2d::CCLayer
{
public:
// Here's a difference. Method 'init' in cocos2d-x returns bool, instead of returning 'id' in cocos2d-iphone
virtual bool init();
// there's no 'id' in cpp, so we recommand to return the exactly class pointer
static cocos2d::CCScene* scene();
// a selector callback
void menuCloseCallback(CCObject* pSender);
//触屏开始事件
virtual void ccTouchesBegan (CCSet *pTouches, CCEvent *pEvent);
//触屏移动事件
virtual void ccTouchesMoved (CCSet *pTouches, CCEvent *pEvent);
//触屏结束事件
virtual void ccTouchesEnded (CCSet *pTouches, CCEvent *pEvent);
//触屏取消事件
virtual void ccTouchesCancelled (CCSet *pTouches, CCEvent *pEvent);
// implement the "static node()" method manually
CREATE_FUNC(HelloWorld);
};
打开HelloWorld.cpp文件,我们修改init函数如下,即删除了背景图和显示文字,并且设置屏幕支持触摸
bool HelloWorld::init()
{
bool bRet = false;
do
{
//////////////////////////////////////////////////////////////////////////
// super init first
//////////////////////////////////////////////////////////////////////////
CC_BREAK_IF(! CCLayer::init());
//////////////////////////////////////////////////////////////////////////
// add your codes below...
//////////////////////////////////////////////////////////////////////////
// 1. Add a menu item with "X" image, which is clicked to quit the program.
// Create a "close" menu item with close icon, it's an auto release object.
CCMenuItemImage *pCloseItem = CCMenuItemImage::create(
"CloseNormal.png",
"CloseSelected.png",
this,
menu_selector(HelloWorld::menuCloseCallback));
CC_BREAK_IF(! pCloseItem);
// Place the menu item bottom-right conner.
pCloseItem->setPosition(ccp(CCDirector::sharedDirector()->getWinSize().width - 20, 20));
// Create a menu with the "close" menu item, it's an auto release object.
CCMenu* pMenu = CCMenu::create(pCloseItem, NULL);
pMenu->setPosition(CCPointZero);
CC_BREAK_IF(! pMenu);
// Add the menu to HelloWorld layer as a child layer.
this->addChild(pMenu, 1);
//设置屏幕可以触摸
this->setTouchEnabled(true);
bRet = true;
} while (0);
return bRet;
}
然后在HelloWorld.cpp文件中实现我们声明的四个触摸函数,我们这里只对触摸结束函数进行了功能的实现,即触摸结束时在触摸点显示一张小球的图片,其他触摸事件不做处理,添加的四个函数如下
void HelloWorld::ccTouchesBegan(CCSet *pTouches, CCEvent *pEvent)
{
}
void HelloWorld::ccTouchesMoved(CCSet *pTouches, CCEvent *pEvent)
{
}
void HelloWorld::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
{
//我们用迭代器获得多点触摸的第一个触点
CCSetIterator it=pTouches->begin();
CCTouch* touch=(CCTouch*)(* it);
//得到第一个触点的位置
//(2.0之后不再需要对取得的位置进行坐标系的转换,即从屏幕坐标系转换GL坐标系)
CCPoint location=touch->getLocation();
//创建一个精灵,并将其显示在触摸点的位置
CCSprite* sprite=CCSprite::create("ball.png");
sprite->setPosition(ccp(location.x,location.y));
this->addChild(sprite,1);
}
void HelloWorld::ccTouchesCancelled(CCSet *pTouches, CCEvent *pEvent)
{
}
运行程序,我们分别在屏幕的四个角点击一次,那么在每个角上都会出现一个小球,效果如下
最后祝愿每一个奋斗在路上的人早日实现梦想!