3.cocos2dx之Menu,通过menu来实现场景的切换
1 頭文件
| TMenu.h |
| #ifndef __TMENU_H__ #define __TMENU_H__ ? #include "cocos2d.h" USING_NS_CC; ? class TMenu :public CCLayer { public: ??? static CCScene * scene(); ??? CREATE_FUNC(TMenu); ??? bool init(); ? ??? CCMenu * menu; ? ??? void menuCallback(CCObject * sender); ??? void closeCallback(CCObject * sender); ? ??? virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent); ??? virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent); }; ? #endif |
| TMenu.cpp |
| #include "TMenu.h" #include "AppMacros.h" #include "T02LayerSprite.h" #include "T03LayerZorder.h" #include "T04ColorLayer.h" #include "T05Coordinate.h" #include "T06BatchNode.h" #include "T07Schedule.h" #include "T08Touch.h" #include "T09Memory.h" #include "T10Label.h" ? //通過sizeof(menu_array)求出數(shù)組占用的總空間大小 //通過sizeof(*menu_array)求出數(shù)組中的每個(gè)元素的大小 static char * menu_array[] { ??? "T02LayerSprite.h", ??? "T03LayerZorder.h", ??? "T04ColorLayer.h", ??? "T05Coordinate.h", ??? "T06BatchNode.h", ??? "T07Schedule.h", ??? "T08Touch.h", ??? "T09Memory.h", ??? "T10Label.h" }; ? CCScene * TMenu::scene() { ??? CCScene * scene = CCScene::create(); ??? TMenu * layer = TMenu::create(); ??? scene->addChild(layer); ??? return scene; } ? bool TMenu::init() { ??? CCLayer::init(); ? ??? menu = CCMenu::create(); ??? //通過下面的方式實(shí)現(xiàn)將菜單項(xiàng)添加到menu中 ??? for (int i = 0; i < sizeof(menu_array) / sizeof(*menu_array); i++) ??? { ??????? CCMenuItem * item = CCMenuItemFont::create(menu_array[i], ??????????? this, ??????????? menu_selector(TMenu::menuCallback)); ??????? menu->addChild(item); ??? } ??? //設(shè)置菜單的顯示方向?yàn)榇怪狈较?/span> ??? menu->alignItemsVertically(); ??? addChild(menu); ? ??? CCArray * array = menu->getChildren(); ??? CCObject * obj; ??? int i = 0; ??? CCARRAY_FOREACH(array, obj) ??? { ??????? CCMenuItem * item = (CCMenuItem*)obj; ??????? item->setTag(i + 1 + 10000); ??????? i++; ??? } ??? CCMenuItem * closeItem = CCMenuItemImage::create("CloseNormal.png", "CloseSelected.png"); ??? closeItem->setTarget(this, menu_selector(TMenu::closeCallback)); ??? CCMenu * menu2 = CCMenu::create(closeItem, NULL); ??? menu2->setPosition(CCPointZero); ??? closeItem->setPosition(ccp(winSize.width - closeItem->getContentSize().width / 2, ??????? winSize.height - closeItem->getContentSize().height / 2)); ??? addChild(menu2); ? ??? //設(shè)置觸摸事件,為可touch ??? setTouchEnabled(true); ??? setTouchMode(kCCTouchesOneByOne); ? ??? return true; } ? //當(dāng)點(diǎn)擊到菜單之后跳轉(zhuǎn)到指定的CCScene中去 void TMenu::menuCallback(CCObject * sender) { ??? CCMenuItem * item = (CCMenuItem *)sender; ??? CCScene * pScene = NULL; ??? switch (item->getTag() - 10000) ??? { ??? case 1: ??????? pScene = T02LayerSprite::scene(); ??????? break; ??? case 2: ??????? pScene = T03LayerZorder::scene(); ??????? break; ??? case 3: ??????? pScene = T04ColorLayer::scene(); ??????? break; ??? case 4: ??????? pScene = T05Coordinate::scene(); ??????? break; ??? case 5: ??????? pScene = T06BatchNode::scene(); ??????? break; ??? case 6: ??????? pScene = T07Schedule::scene(); ??????? break; ??? case 7: ??????? pScene = T08Touch::scene(); ??????? break; ??? case 8: ??????? pScene = T09Memory::scene(); ??????? break; ??? case 9: ??????? pScene = T10Label::scene(); ??????? break; ??? } ??? if (pScene != NULL) ??? { ??????? //通過CCDirector的sharedDirector來實(shí)現(xiàn)場(chǎng)景的切換 ??????? CCDirector::sharedDirector()->replaceScene(pScene); ??? } } ? //當(dāng)點(diǎn)擊關(guān)閉的時(shí)候游戲退出 void TMenu::closeCallback(CCObject * sender) { ??? exit(0); } ? bool TMenu::ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent) { ??? return true; } ? void TMenu::ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent){ ??? CCRect rcWin = CCRect(0,40,winSize.width,winSize.height - 80); ??? CCMenuItem * firstItem = (CCMenuItem *)menu->getChildren()->objectAtIndex(0); ??? CCMenuItem * lastItem = (CCMenuItem *)menu->getChildren()->lastObject(); ? ??? CCPoint firstInWorld = menu->convertToWorldSpace(firstItem->getPosition()); ??? CCPoint lastInWorld = menu->convertToWorldSpace(lastItem->getPosition()); ? ??? //其中Delta的坐標(biāo)表示的是開始坐標(biāo)的減去最后坐標(biāo)的差值 ??? if (rcWin.containsPoint(firstInWorld) && pTouch->getDelta().y<0) ??????? return; ??? if (rcWin.containsPoint(lastInWorld) && pTouch->getDelta().y>0) ??????? return; ??? menu->setPositionY(menu->getPositionY() + pTouch->getDelta().y); } |
| 運(yùn)行結(jié)果:
|
?
總結(jié)
以上是生活随笔為你收集整理的3.cocos2dx之Menu,通过menu来实现场景的切换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我国各级国家权力机关是由什么选举的代表词
- 下一篇: 1cocos2dx扩展库UI控件,CCC