[置顶] cocos2d实现类似CCMenu菜单类控件,在CCScrollView滚动, lua脚本控件
2013-08-19 19:17
656 查看
在CCScrollView中添加ccmenu实现滑动效果是不可能的,因为ccmenu的触发事件是你在touchBegan就全部捕获掉了,如果你想滑动CCScrollView取消选中这个菜单是无法实现的,.所以我们应该自己编写一个模拟ccmenu菜单的控件 ,在按下按钮后,如果不移动按钮的话,就触发触摸事件,移动的话就取消触摸事件,实现按钮在CCScrollView中的滚动效果。。。
开发人员:Jason's.Alex QQ:531401335
csdn博客:http://blog.csdn.net/RuShrooM
开发人员:Jason's.Alex QQ:531401335
csdn博客:http://blog.csdn.net/RuShrooM
// // CCButtonSptite.h // CCSpriteButton // // Created by jasonsalex on 13-8-6. // // #ifndef __CCSpriteButton__CCButtonSptite__ #define __CCSpriteButton__CCButtonSptite__ #include "cocos2d.h" #define TOUCH_SENSITIVITY 20 //触摸灵敏度 using namespace cocos2d; class ButtonSprite:public CCSprite,public CCTouchDelegate { public: ButtonSprite(); virtual bool init(CCSpriteFrame *selFile,CCSpriteFrame *disFile); static ButtonSprite *create(const char *selFile,const char *disFile ); static ButtonSprite *createWithSpriteFrame(CCSpriteFrame* selFrame,CCSpriteFrame *disFrame); static ButtonSprite *createWithSpriteFrameName(const char *selFile,const char * disFile); virtual ~ButtonSprite(); virtual void onEnter(); virtual void onExit(); virtual bool ccTouchBegan(CCTouch* touch, CCEvent* event); virtual void ccTouchMoved(CCTouch* touch, CCEvent* event); virtual void ccTouchEnded(CCTouch* touch, CCEvent* event); void registerScriptTapHandler(int nHandler); void unregisterScriptTapHandler(void); private: CCSprite *selSprite; //选择的精灵 CCSprite *disSprite;//不选择的精灵 int m_nScriptTapHandler;//脚本函数句柄 bool isEmitTouchEvent; //是否发射触摸事件 CCPoint startTouchPoint; //开始的触摸坐标 }; #endif /* defined(__CCSpriteButton__CCButtonSptite__) */
// // CCButtonSptite.cpp // CCSpriteButton // // Created by jasonsalex on 13-8-6. // // #include "ButtonSprite.h" ButtonSprite * ButtonSprite::create(const char *selFile,const char *disFile ) { ButtonSprite *pRet=new ButtonSprite(); if(pRet && pRet->init(CCSprite::create(selFile)->displayFrame(),CCSprite::create(disFile)->displayFrame())) { pRet->autorelease(); return pRet; } CC_SAFE_DELETE(pRet); return NULL; } ButtonSprite * ButtonSprite::createWithSpriteFrame(CCSpriteFrame* selFrame,CCSpriteFrame *disFrame) { ButtonSprite *pRet=new ButtonSprite(); if(pRet && pRet->init(selFrame,disFrame)) { pRet->autorelease(); return pRet; } CC_SAFE_DELETE(pRet); return NULL; } ButtonSprite * ButtonSprite::createWithSpriteFrameName(const char *selFile,const char * disFile) { ButtonSprite *pRet=new ButtonSprite(); CCSpriteFrame *selFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(selFile); CCSpriteFrame *disFrame=CCSpriteFrameCache::sharedSpriteFrameCache()->spriteFrameByName(disFile); if(pRet && pRet->init(selFrame,disFrame)) { pRet->autorelease(); return pRet; } CC_SAFE_DELETE(pRet); return NULL; } bool ButtonSprite::init(CCSpriteFrame* selFrame,CCSpriteFrame *disFrame) { this->disSprite=CCSprite::createWithSpriteFrame(disFrame); this->selSprite=CCSprite::createWithSpriteFrame(selFrame); this->selSprite->retain(); this->disSprite->retain(); if(!this->initWithSpriteFrame(selFrame)) return false; return true; } ButtonSprite::ButtonSprite():m_nScriptTapHandler(0),isEmitTouchEvent(false) { } ButtonSprite::~ButtonSprite() { CC_SAFE_DELETE(this->disSprite); CC_SAFE_DELETE(this->selSprite); } void ButtonSprite::onEnter() { CCDirector* pDirector = CCDirector::sharedDirector(); pDirector->getTouchDispatcher()->addTargetedDelegate(this, 0, false); } void ButtonSprite::onExit() { CCDirector* pDirector = CCDirector::sharedDirector(); pDirector->getTouchDispatcher()->removeDelegate(this); } bool ButtonSprite::ccTouchBegan(CCTouch* touch, CCEvent* event) { this->startTouchPoint = convertToNodeSpace(touch->getLocation()); this->isEmitTouchEvent= this->getTextureRect().containsPoint(this->startTouchPoint); if(isEmitTouchEvent) { //如果选择了就显示禁用图像 this->setDisplayFrame(disSprite->displayFrame()); return true; }else { return false; } } void ButtonSprite::ccTouchMoved(CCTouch* touch, CCEvent* event) { float distance=this->startTouchPoint.getDistance(convertToNodeSpace(touch->getLocation())); if(abs(distance)<TOUCH_SENSITIVITY) //判断是否超过了移动范围 { this->isEmitTouchEvent=true; }else { this->isEmitTouchEvent=false; } } void ButtonSprite::ccTouchEnded(CCTouch* touch, CCEvent* event) { if(this->isEmitTouchEvent) { CCScriptEngineManager::sharedManager()->getScriptEngine()->executeEvent(this->m_nScriptTapHandler,"end"); } this->setDisplayFrame(selSprite->displayFrame()); //恢复图像 } void ButtonSprite::registerScriptTapHandler(int nHandler) { unregisterScriptTapHandler(); m_nScriptTapHandler = nHandler; } void ButtonSprite::unregisterScriptTapHandler(void) { if (m_nScriptTapHandler) { CCScriptEngineManager::sharedManager()->getScriptEngine()->removeScriptHandler(m_nScriptTapHandler); m_nScriptTapHandler = 0; } }
相关文章推荐
- cocos2d实现类似CCMenu菜单类控件,在CCScrollView滚动, lua脚本控件
- cocos2d实现类似CCMenu菜单类控件,在CCScrollView滚动, lua脚本控件
- cocos2D中实现滑动菜单CCScrollView+CCMenu效果,(注意不是cocos2D-x)!!
- cocos2d-lua3.7控件篇(四)-ScrollView demo
- 【Cocos2d-x for WP8 学习整理】(3)CCScrollView 实现捕鱼达人一样的场景选择界面
- 【COCOS2DX-LUA 脚本开发之八】不用CCHttpClient而转用quick-cocos2d-x或cocos2dx-LuaProxy的Lua框架实现Lua-Http网络交互!
- quick-cocos2d-x-2.2.1-rc 中用lua编写一个CCScrollView
- 【COCOS2DX-LUA 脚本开发之八】不用CCHttpClient而转用quick-cocos2d-x或cocos2dx-LuaProxy的Lua框架实现Lua-Http网络交互!
- cocos2d-x 2.x 滚动视图 CCScrollView
- 【Cocos2d-x for WP8 学习整理】(3)CCScrollView 实现捕鱼达人一样的场景选择界面
- cocos2dx 在ccscrollview 实现滚动添加menu
- 【COCOS2DX-LUA 脚本开发之八】不用CCHttpClient而转用quick-cocos2d-x或cocos2dx-LuaProxy的Lua框架实现Lua-Http网络交互!
- cocos2dx- CCScrollLayer (cocos2d中实现的滚动层)
- ListView 实现类似listview + scrollview滚动效果
- RecyclerView实现滚动滑动以及点击改变控件颜色
- 安卓开发笔记——自定义HorizontalScrollView控件(实现QQ5.0侧滑效果)
- 利用HorizontalScrollView实现水平滚动
- 自定义View实现水平滚动控件
- 自定义View实现水平滚动控件
- ViewPager + HorizontalScrollView 实现可滚动的标签栏