Cocos2d-x学习之实现类似android的菜单栏tabbar效果
来源:互联网 发布:hadoop2.7.1 windows 编辑:程序博客网 时间:2024/05/22 09:01
直接上代码吧,参考了网上找的例子,自己做了小小的改动
主要实现代码:
CCMenuItemImage *pMainHome = CCMenuItemImage::create("main_1.png","main_1_sel.png", this,menu_selector(HelloWorld::menuCloseCallback));CC_BREAK_IF(! pMainHome);CCMenuItemImage *pMainLocation = CCMenuItemImage::create("main_2.png","main_2_sel.png", this,menu_selector(HelloWorld::menuCloseCallback));CC_BREAK_IF(! pMainLocation);CCMenuItemImage *pMainSearch = CCMenuItemImage::create("main_3.png","main_3_sel.png", this,menu_selector(HelloWorld::menuCloseCallback));CC_BREAK_IF(! pMainSearch);CCMenuItemImage *pMainLogin = CCMenuItemImage::create("main_4.png","main_4_sel.png", this,menu_selector(HelloWorld::menuCloseCallback));CC_BREAK_IF(! pMainLogin);CCMenuItemImage *pMainMore = CCMenuItemImage::create("main_5.png","main_5_sel.png", this,menu_selector(HelloWorld::menuCloseCallback));CC_BREAK_IF(! pMainMore);XYMenu* pMenu = XYMenu::create(pMainHome,pMainLocation,pMainSearch,pMainLogin,pMainMore,NULL);pMenu->setPosition(CCPointZero);CC_BREAK_IF(! pMenu);this->addChild(pMenu, 2);
用到的类
XYMenu.h
#ifndef __Test2__XYMenu__#define __Test2__XYMenu__#include "cocos2d.h"USING_NS_CC;class XYMenu : public CCMenu{public: int iCount; XYMenu(void); ~XYMenu(void); void setSelectedItem(CCMenuItem *item); bool getInit(CCArray* pArrayOfItems); static XYMenu *create(CCMenuItem *item, ...); static XYMenu* createWithItems(CCMenuItem *firstItem, va_list args); static XYMenu* createWithArray(CCArray* pArrayOfItems); virtual bool ccTouchBegan(CCTouch* touch,CCEvent* event); virtual void ccTouchEnded(CCTouch* touch, CCEvent* event); virtual void ccTouchCancelled(CCTouch *touch, CCEvent* event); virtual void ccTouchMoved(CCTouch* touch, CCEvent* event); private: CCMenuItem *m_curHighlighted;};#endif /* defined(__Test2__XYMenu__) */
XYMenu.cpp
#include "XYMenu.h"XYMenu::XYMenu(){}XYMenu::~XYMenu(){}bool XYMenu::getInit(CCArray* pArrayOfItems){ CCSize s = CCDirector::sharedDirector()->getWinSize(); CCMenuItem* m_pItem = NULL; CCObject* _object; CCArray* ItemArray = pArrayOfItems; int count = ItemArray->count(); int i = 0; CCARRAY_FOREACH(ItemArray, _object) { m_pItem = (CCMenuItem*)_object; if (m_pItem) { if (!i) { setSelectedItem(m_pItem); } m_pItem->setPosition(ccp(s.width/count/2+s.width/count*i,m_pItem->getContentSize().height/2)); m_pItem->setTag(i); i++; } } return true;}void XYMenu::setSelectedItem(CCMenuItem *item){ if (item != m_pSelectedItem) { if (m_pSelectedItem != NULL) { m_pSelectedItem->unselected(); } m_pSelectedItem = item; m_pSelectedItem->selected(); }}XYMenu* XYMenu::create(CCMenuItem *item, ...){ va_list args; va_start(args,item); XYMenu *pRet = XYMenu::createWithItems(item, args); pRet->iCount = 0; va_end(args); return pRet;}XYMenu* XYMenu::createWithItems(CCMenuItem* item, va_list args){ CCArray* pArray = NULL; if( item ) { pArray = CCArray::create(item, NULL); CCMenuItem *i = va_arg(args, CCMenuItem*); while(i) { pArray->addObject(i); i = va_arg(args, CCMenuItem*); } } return XYMenu::createWithArray(pArray);}XYMenu* XYMenu::createWithArray(CCArray* pArrayOfItems){ XYMenu *pRet = new XYMenu(); if (pRet && pRet->initWithArray(pArrayOfItems) && pRet->getInit(pArrayOfItems)) { pRet->autorelease(); } else { CC_SAFE_DELETE(pRet); } return pRet;}bool XYMenu::ccTouchBegan(CCTouch *touch,CCEvent *event){ CCLog("touched-----begin+++%d",iCount); iCount++; CC_UNUSED_PARAM(event); if (m_eState != kCCMenuStateWaiting ) return false; for (CCNode *c = this->m_pParent; c != NULL; c = c->getParent()) { if (c->isVisible() == false) return false; } CCMenuItem *curSelection = this->itemForTouch(touch); if (curSelection != NULL) { curSelection->selected(); m_curHighlighted = curSelection; if (m_curHighlighted) { if (m_pSelectedItem != curSelection) { m_pSelectedItem->unselected(); } m_eState = kCCMenuStateTrackingTouch; return true; } } return false;}void XYMenu::ccTouchMoved(CCTouch *touch,CCEvent *event){ CCLog("touched-----move"); CC_UNUSED_PARAM(event); CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchMoved] -- invalid state"); CCMenuItem *curSelection = this->itemForTouch(touch); if (m_curHighlighted != curSelection && curSelection != NULL) { m_curHighlighted->unselected(); curSelection->selected(); m_curHighlighted = curSelection; return; }}void XYMenu::ccTouchEnded(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){ CCLog("touched-----end+++%d",iCount); iCount++; CC_UNUSED_PARAM(touch); CC_UNUSED_PARAM(event); CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchEnded] -- invalid state"); CCMenuItem *curSelection = this->itemForTouch(touch); if (curSelection != m_curHighlighted && curSelection != NULL) { m_pSelectedItem->selected(); m_curHighlighted->unselected(); m_curHighlighted = NULL; m_eState = kCCMenuStateWaiting; return; } m_pSelectedItem = m_curHighlighted; m_curHighlighted->activate(); m_curHighlighted = NULL; m_eState = kCCMenuStateWaiting;}void XYMenu::ccTouchCancelled(cocos2d::CCTouch *touch, cocos2d::CCEvent *event){ CCLog("touched-----cancel+++%d",iCount); iCount++; CC_UNUSED_PARAM(touch); CC_UNUSED_PARAM(event); CCAssert(m_eState == kCCMenuStateTrackingTouch, "[Menu ccTouchCancelled] -- invalid state"); m_pSelectedItem->selected(); m_curHighlighted->unselected(); m_curHighlighted = NULL; m_eState = kCCMenuStateWaiting;}
- Cocos2d-x学习之实现类似android的菜单栏tabbar效果
- cocos2d-x着色器基础之类似水纹效果的实现
- Cocos2d-x实现android的Toast效果
- Cocos2d-x类似coverflow效果
- Cocos2d-x类似coverflow效果
- cocos2d-x-3.0学习笔记之如何设置滚动菜单栏
- Cocos2d-x 3.0 实现android的Toast效果
- Cocos2d-x:静态方法实现android的Toast效果
- Android UI之自定义——类似iOS的Tabbar
- cocos2d-x3.1 下实现类似Android下ExpandListView的效果
- 使用Fragment和RadioGroup实现类似ios的tabbar的效果
- Cocos2d-x 实现运动的尾巴效果
- Cocos2d-x 实现运动的尾巴效果
- Cocos2d-x能够实现的动画效果
- Cocos2d-x能够实现的效果总结
- Cocos2d-x能够实现的效果总结
- Cocos2d-x能够实现的效果总结
- Cocos2d-x能够实现的效果总结
- CityEngine创建不同类型的屋顶(二)
- 竞赛积分猜想
- 第二周hdu1282
- 简单查看和修改数据库的只读/读写属性
- XP安装VMware-viclient提示:microsoft virtual j# 2.0 second edition 安装程序返回错误代码“4121”
- Cocos2d-x学习之实现类似android的菜单栏tabbar效果
- 排序算法之归并排序
- php与oracle连接函数详解oci_connect
- 解决Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.-
- priority_queue用法
- socket 编程入门教程(一)TCP server 端:5、创建监听嵌套字
- linux定时任务的设置
- c/c++程序之_KMP字符串模式匹配详解
- UrlRewriteFilter 学习笔记