1.cocos2dx之Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)
CCMenu
基本結構
CCMenu繼承自CCLayer,本質是一個容器。需要被addChild到父類中去。
CCMenuItem是菜單項,它有如下子類:
CCMenuItemFont;CCMenuItemImage;CCMenuItemLabel;CCMenuItemSprite;CCMenuItemToggle;
是真正的需要實例化的菜單項。需要addChild到CCMenu對象中去。
示例:
| CCMenuItem * item = CCMenuItemFont::create(“Start”); //這里的this表示的是調用者 Item->setTarget(this,menu_selector(MYMenu::menuCallBack)); CCMenu * menu = CCMenu::create(); menu->addChild(item); addChild(menu); |
CCMenuItem
A? CCMenuItemFont
| CCMenuItem * font = CCMenuItemFont::create(“Start”,this,menu_selector(MYMenu::menuCallBack)); CCMenu * menu = CCMenu::create(); menu->addChild(item); addChild(menu); |
| 第一個參數為標簽要顯示的文字,第二個參數表示回調函數的調用者,第三個參數表示回調函數。 |
| 關于回調 typedef void (CCObject::*SEL_MenuHandler)(CCObject *); #define menu_selector(_SELECTOR)(SEL_MenuHandler)(&_SELECTOR) |
?
B? CCMenu的坐標系統研究
| fontItem->setPosition(ccp(winSize.width – 50,30)); menu->setPosition(CCPointZero); |
| CCLog("fontItem = %g %g", fontItem->getPositionX(),fontItem->getPositionY()); CCLog("menu = %g, %g,width %g,height = %g",menu->getPositionX(),menu->getPositionY(), menu->getContentSize().width,menu->getContentSize().height); |
?
C?CCMenuItemImage
| CCMenuItem *imageItem = CCMenuItemImage::create(“CloseNormal.png”,”CloseSelected.png”); imageItem->setTarget(this,menu_selector(Menu::menuCallBack)); |
| 第1個參數為末點擊是顯示的圖片,第二個參數為點擊后顯示的圖片,最后參數可以放到setTarget中,意義同上。 |
D? CCMenuItemLabel
| CCLabelBMFont *bm = CCLabelBMFont::create("bmFontLabelMenu", "fonts/bitmapFontTest.fnt"); CCMenuItem * labelItem = CCMenuItemLabel::create(bm, this,menu_selector(MYMenu::menuCallBack)); menu->addChild(labelItem); |
??? 第一個參數為一個label,最后兩個參數同上。
E? CCMenuItemSprite
| CCSprite * normal = CCSprite::create(“gonormal.png”); CCSprite * selected = CCSprite::create(“goselected.png”); CCMenuItemSprite * spriteItem = CCMenuItemSprite::create(normal,selected,this,menu_selector(MYMenu::menuCallBack)); menu->addChild(spriteItem); |
第一個參數和第二個參數為CCSprite后面的參數,同上。
CCMenuItemToggle
| CCMenuItem *t1 = CCMenuItemFont::create("ON"); CCMenuItem *t2 = CCMenuItemFont::create("OFF"); CCMenuItem *t3 = CCMenuItemFont::create("10%"); CCMenuItem *t4 = CCMenuItemFont::create("50%"); CCMenuItemToggle * toggle = CCMenuItemToggle::createWithTarget(this, menu_selector(T11Menu::menuCallBack), t1, t2, t3, t4, NULL); menu->addChild(toggle); |
?? 第一個和第二個參數為回調函數調用者和回調函數,后面的參數為CCMenuItem.可以實現變化的菜單。
如何判斷哪個菜單被點
打Tag
| CCArray * array = menu->getChildren(); CCObject * obj; int i = 0; CCARRAY_FOREACH(array, obj) { CCMenuItem * item = (CCMenuItem *)obj; item->setTag(i + 1000); i++; } |
找Tag
| CCMenuItem * item = (CCMenuItem *)obj; Switch (item->getTag() - 1000) { Case FONT1: ??? CCLog(“CCMenuItemFont”); ??? break; case FONT2: ??? break; case IMAGE: ??? break; case BM: ??? break; case SPRITE: ??? break; case TOGGLE: { ??? int index = ((CCMenuItemToggle *)item)->getSelectedIndex(); ??? CCLog(“index = %d”,index); } break; } |
案例說明:
| MYMenu.h |
| #ifndef __MYMENU_H__ #define __MYMENU_H__ #include "cocos2d.h" USING_NS_CC; ? class MYMenu : public CCLayer { public: ??? CREATE_FUNC(MYMenu); ??? bool init(); ??? static CCScene * scene(); ??? void menuCallBack(CCObject * obj); ? ??? enum MENU ??? { ??????? FONT1, FONT2, IMAGE, LABELLABEL, SPRITE, TOGGLE ??? }; ? ??? CCMenu * menu; }; ? #endif ? |
| MYMenu.cpp |
| #include "MYMenu.h" #include "AppMacros.h" ? CCScene * MYMenu::scene() { ??? CCScene * scene = CCScene::create(); ??? MYMenu * layer = MYMenu::create(); ??? scene->addChild(layer); ??? return scene; } ? //五種菜單 #if 0 CCMenuItemFont; CCMenuItemImage; CCMenuItemLabel; CCMenuItemSprite; CCMenuItemToggle; #endif ? bool MYMenu::init() { ??? CCLayer::init(); ? ??? //第1步:創建一個菜單 ??? menu = CCMenu::create(); ? ??? //第2步:創建菜單項 ??? //可以將下面的兩行合并 ??? CCMenuItem * fontItem = CCMenuItemFont::create("fontmenu"); ??? fontItem->setTarget(this, menu_selector(MYMenu::menuCallBack)); ? ??? //顯示menuItem在界面中的顯示條項 ??? CCLog("first Item :x = %g y = %g", fontItem->getPositionX(), fontItem->getPositionY()); ??? CCLog("first Item Anchor x = %g,y = %g", fontItem->getAnchorPoint().x, fontItem->getAnchorPoint().y); ??? CCLog("first Item ContentSize width %g hight %g", ??????? fontItem->getContentSize().width,fontItem->getContentSize().height); ? ??? //創建第二個Menu條項 ??? CCMenuItem * fontItem2 = CCMenuItemFont::create("fontmenu2"); ??? fontItem2->setTarget(this, menu_selector(MYMenu::menuCallBack)); ? ??? //設置Menu在界面中的顯示狀態 ??? //menu->alignItemsVerticallyWithPadding(40); ? ??? //顯示menu在界面中的顯示特征 ??? CCLog("---------------------------------------------"); ??? CCLog("Menu:x = %g,y = %g", menu->getPositionX(), menu->getPositionY()); ??? CCLog("Menu Anchor x = %g y = %g", menu->getAnchorPoint().x, menu->getAnchorPoint().y); ??? CCLog("Menu ContentSize width %g high %g", ??????? menu->getContentSize().width, ??????? menu->getContentSize().height); ? ??? //第2步:創建CCMenuItemImage類型的菜單項 ??? CCMenuItem *imageItem = CCMenuItemImage::create("CloseNormal.png","CloseSelected.png"); ??? imageItem->setTarget(this, menu_selector(MYMenu::menuCallBack)); ? ??? //第2步:創建CCLabelBMFont類型的菜單項 ??? CCLabelBMFont * bm = CCLabelBMFont::create("bmMenu", "fonts/bitmapFontTest.fnt"); ??? CCMenuItem *labelItem = CCMenuItemLabel::create(bm); ??? labelItem->setTarget(this,menu_selector(MYMenu::menuCallBack)); ? ??? //第2步:創建CCSprite類型的菜單項 ??? CCSprite *nor = CCSprite::create("btn_go_1.png"); ??? CCSprite *sel = CCSprite::create("btn_go_0.png"); ??? CCMenuItem * sprItem = CCMenuItemSprite::create(nor,sel); ??? sprItem->setTarget(this, menu_selector(MYMenu::menuCallBack)); ? ??? //第2步:創建CCMenuItemToggle類型的菜單項 ??? CCMenuItem * t1 = CCMenuItemFont::create("ON"); ??? CCMenuItem * t2 = CCMenuItemFont::create("OFF"); ??? CCMenuItem * t3 = CCMenuItemFont::create("10%"); ??? CCMenuItem * t4 = CCMenuItemFont::create("%50%"); ??? CCMenuItem * toggle = CCMenuItemToggle::createWithTarget(this, ??????? ???????????????????????????????????????????????????? menu_selector(MYMenu::menuCallBack), ??????????????????????????????????????????????????????????? ?t1,t2,t3,t4,NULL); ? ??? //第3步:將菜單項添加到菜單中去 ??? menu->addChild(fontItem); ??? menu->addChild(fontItem2); ??? menu->addChild(imageItem); ??? menu->addChild(labelItem); ??? menu->addChild(sprItem); ??? menu->addChild(toggle); ??? this->addChild(menu); ??? ??? //第4步:設置菜單項的顯示方式,讓菜單項垂直顯示 ??? menu->alignItemsVertically(); ? ??? //CCMenu類有一個getChildren()方法可以得到菜單項 ??? CCArray * array = menu->getChildren(); ??? CCObject * obj; ??? int i = 0; ??? CCARRAY_FOREACH(array, obj) ??? { ??????? CCMenuItem *item = (CCMenuItem *)obj; ??????? item->setTag(i + 100); ??????? i++; ??? } ? ??? /* ??? for (int i = 0; i < array->count();++i) ??? { ??????? CCMenuItem *item = (CCMenuItem *)array->objectAtIndex(i); ??????? item->setTag(i); ??? } ??? */ ? ??? return true; } ? //回調函數 void MYMenu::menuCallBack(CCObject * obj) { ??? CCMenuItem * item = (CCMenuItem *)obj; ??? switch (item->getTag() - 1000) ??? { ??? case FONT1: ??????? CCLog("font menu call "); ??????? break; ??? case FONT2: ??????? break; ??? case IMAGE: ??????? break; ??? case LABELLABEL: ??????? break; ??? case TOGGLE: ??????? int idx = ((CCMenuItemToggle *)item)->getSelectedIndex(); ??????? CCLog("index = %d", idx); ??????? break; ??? } } |
| 運行結果:
|
?
總結
以上是生活随笔為你收集整理的1.cocos2dx之Menu(CCMenuItemFont,CCMenuItemImage,CCMenuItemLabel,CCMenuItemSprite,CCMenuItemToggle)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 现在部队文职是什么编制
- 下一篇: 3.cocos2dx之Menu,通过me