cocos2d-x 游戏开发----给单个精灵绑定点击事件
2013-08-22 15:57
531 查看
在cocos2d-x游戏开发过程中.经常会遇到处理单个精灵被用户点击的问题。 一般情况下我们都是抓取单个场景中的点击事件根据坐标判断,遍历所有精灵,看是否存在点击的坐标和精灵的区域有碰撞。这种方法在精灵多了之后很费时,在学习testcpp的例子代码后发现一个很好的方法解决。就是继承 "CCTargetedTouchDelegate"
类,使精灵也有接收点击事件的功能,并且在精灵销毁时移除注册的点击功能。
工程代码在这里:http://download.csdn.net/detail/lkysz0000/5993617
类,使精灵也有接收点击事件的功能,并且在精灵销毁时移除注册的点击功能。
// // TempTouchSprite.h // TouchSprite // // Created by LangYi on 13-8-22. // // #ifndef __TouchSprite__TempTouchSprite__ #define __TouchSprite__TempTouchSprite__ #include "cocos2d.h" enum CLickType{ CLICK_DOWN,//按下状态 CLICK_NORMAL//正常状态 }; class CTempTouchSprite:public cocos2d::CCSprite,public cocos2d::CCTargetedTouchDelegate { public: CTempTouchSprite(); ~CTempTouchSprite(); virtual void onEnter(); virtual void onExit(); cocos2d::CCRect rect(); bool containsTouchLocation(cocos2d::CCTouch* touch); virtual bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); // optional virtual void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); virtual void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent); static CTempTouchSprite* touchSpriteCreateWithTexture(const char* pFilePath); private: bool initSprite(const char* pFilePath);//初始化sprite相关的功能 CLickType m_clickType; }; #endif /* defined(__TouchSprite__TempTouchSprite__) */// // TempTouchSprite.cpp // TouchSprite // // Created by LangYi on 13-8-22. // // #include "TempTouchSprite.h" USING_NS_CC; CTempTouchSprite::CTempTouchSprite() { } CTempTouchSprite::~CTempTouchSprite() { } void CTempTouchSprite::CTempTouchSprite::onEnter() { m_clickType = CLICK_NORMAL; CCDirector* pDirector = CCDirector::sharedDirector(); pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, true); //注册单击事件 CCSprite::onEnter(); } void CTempTouchSprite::CTempTouchSprite::onExit() { CCDirector* pDirector = CCDirector::sharedDirector(); pDirector->getTouchDispatcher()->removeDelegate(this); //注销单击事件 CCSprite::onExit(); } bool CTempTouchSprite::initSprite(const char* pFilePath) //初始化sprite相关的功能 { //可以设置sprite相关特性之类的 if( !CCSprite::initWithFile(pFilePath) ) { return false; } return true; } CTempTouchSprite* CTempTouchSprite::touchSpriteCreateWithTexture(const char* pFilePath) { CTempTouchSprite* pTouchSprite = new CTempTouchSprite; pTouchSprite->initSprite(pFilePath); pTouchSprite->autorelease(); return pTouchSprite; } CCRect CTempTouchSprite::rect() { CCSize s = getTexture()->getContentSize(); return CCRectMake(-s.width / 2, -s.height / 2, s.width, s.height); } bool CTempTouchSprite::containsTouchLocation(CCTouch* touch) { return rect().containsPoint(convertTouchToNodeSpaceAR(touch)); } bool CTempTouchSprite::ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { if(m_clickType != CLICK_NORMAL) { return false; } if(!containsTouchLocation(pTouch)) { return false; } CCLog("精灵被按下,点击开始!"); m_clickType = CLICK_DOWN; return true; } // optional void CTempTouchSprite::ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { CCAssert(m_clickType == CLICK_DOWN, L"Paddle - Unexpected state!"); static bool bMoveIn = true; if(!containsTouchLocation(pTouch)) { //鼠标按下后已经移出精灵 bMoveIn = false; CCLog("按下状态移动离开精灵!!!!"); return; } if(!bMoveIn) { bMoveIn = true; CCLog("按下状态移动进入精灵!!!!"); } CCLog("精灵按下点移动中!"); } void CTempTouchSprite::ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent) { CCAssert(m_clickType == CLICK_DOWN, L"Paddle - Unexpected state!"); m_clickType = CLICK_NORMAL; if(!containsTouchLocation(pTouch)) { CCLog("精灵点击结束单击位置不在精灵中!!!!"); return; } CCLog("精灵点击结束!!!!"); }
工程代码在这里:http://download.csdn.net/detail/lkysz0000/5993617
相关文章推荐
- Cocos2d-x游戏开发——九妹和按钮搭配和按钮点击事件
- quick-cocos2d-x游戏开发【13】——节点生命周期事件,帧事件等其他事件
- 【Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- Cocos2d-x游戏开发之单击事件_锁定触摸区域外的界面
- Cocos2d-x游戏开发之设置精灵的触摸范围
- 【转】Android开发20——单个监听器监听多个按钮点击事件
- jquery开发:jQuery实现当按下回车键时绑定点击事件
- 【Cocos2D-X 游戏引擎】初窥门径(4)Touch 事件:移动精灵
- 如何用cocos2d-x来开发简单的Uphone游戏:(二) 移动的精灵
- 【Cocos2d-x游戏引擎开发笔记(6)】触屏事件与多媒体 (转)
- Cocos2d-x虚拟摇杆控制精灵上下左右运动----之游戏开发《赵云要格斗》(1)
- 【iphone游戏开发】iphone-Cocos2d游戏开发之三:精灵表的详细讲解(二)小鸟眨眼睛
- 【iOS-Cocos2d游戏开发之九】讲解CCSpriteBatchNode与TP工具的".pvr.ccz",".plist"共用的终极精灵优化及注意事项!
- 【iOS-Cocos2d游戏开发之五】【1】多触点与触屏事件详解(单一监听、事件分发) 推荐
- 【Cocos2d游戏开发之六】对触屏事件追加讲解,解决无法触发ccTouchMoved事件[重要!]
- 【iOS-Cocos2d游戏开发之十七】灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint),并结合可视区域与锚点制作进度条!
- Swift游戏开发之俄罗斯方块:No.9 添加点击和移动事件
- Cocos2D-x游戏开发之二十:添加可以吃的精灵
- 【iOS-Cocos2d游戏开发】触屏事件处理机制
- 【iphone游戏开发】iphone-Cocos2D游戏开发之二:精灵表的详细讲解(一)和Zwoptex工具的使用