在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); };
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; }
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) { }
最后祝愿每一个奋斗在路上的人早日实现梦想!