實例介紹Cocos2d-x精靈菜單和圖片菜單
精靈菜單類是MenuItemSprite圖片菜單類是MenuItemImage。由於MenuItemImage繼承於MenuItemSprite所以圖片菜單也屬於精靈菜單。為什麼叫精靈菜單呢那是因為這些菜單項具有精靈的特點我們可以讓精靈動起來具體使用時候是把一個精靈放置到菜單中作為菜單項。
精靈菜單類MenuItemSprite它的其中一個創建函數create定義如下
static MenuItemSprite* create ( Node * normalSprite, //菜單項正常顯示時候的精靈
Node * selectedSprite, //選擇菜單項時候的精靈
Node * disabledSprite, //菜單項禁用時候的精靈
const ccMenuCallback & callback //菜單操作的回調函數指針
)
使用MenuItemSprite比較麻煩在創建MenuItemSprite之前要先創建三種狀態時候的精靈即normalSprite、selectedSprite和disabledSprite。MenuItemSprite還有一些create函數在這些函數中可以省略disabledSprite參數。
如果精靈是由圖片構成的我們可以使用圖片菜單MenuItemImage實現與精靈菜單同樣的效果。MenuItemImage類的其中一個創建函數create定義如下
static MenuItemImage* create ( const std::string & normalImage, //菜單項正常顯示時候的圖片
const std::string & selectedImage, //選擇菜單項時候的圖片
const std::string & disabledImage, //菜單項禁用時候的圖片
const ccMenuCallback & callback //菜單操作的回調函數指針
)
MenuItemImage還有一些create函數在這些函數中可以省略disabledImage參數。
我們通過一個實例介紹一下精靈菜單和圖片菜單的使用這個實例如下圖所示。
下麵我們看看HelloWorldScene.cpp中init函數如下
bool HelloWorld::init()
{
if ( !Layer::init() )
{
return false;
}
Size visibleSize = Director::getInstance()->getVisibleSize();
Point origin = Director::getInstance()->getVisibleOrigin();
Sprite *bg = Sprite::create("menu/background.png");
bg->setPosition(Point(origin.x + visibleSize.width/2,
origin.y + visibleSize.height/2));
this->addChild(bg);
//開始精靈
Sprite *startSpriteNormal =Sprite::create("menu/start-up.png"); ①
Sprite *startSpriteSelected =Sprite::create("menu/start-down.png"); ②
MenuItemSprite*startMenuItem = MenuItemSprite::create(startSpriteNormal,
startSpriteSelected,
CC_CALLBACK_1(HelloWorld::menuItemStartCallback,this)); ③
startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700,170))); ④
//設置圖片菜單
MenuItemImage *settingMenuItem = MenuItemImage::create(
"menu/setting-up.png",
"menu/setting-down.png",
CC_CALLBACK_1(HelloWorld::menuItemSettingCallback,this)); ⑤
settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480,400))); ⑥
//幫助圖片菜單
MenuItemImage *helpMenuItem = MenuItemImage::create(
"menu/help-up.png",
"menu/help-down.png",
CC_CALLBACK_1(HelloWorld::menuItemHelpCallback,this)); ⑦
helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860,480))); ⑧
Menu*mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL); ⑨
mu->setPosition(Point::ZERO); ⑩
this->addChild(mu);
return true;
}
在上麵的代碼中第①②行是創建兩種不同狀態的精靈第③行代碼是創建精靈菜單MenuItemSprite對象第④行代碼是設置開始菜單項startMenuItem位置注意這個坐標是(700,170)由於(700, 170)的坐標是UI坐標需要轉換為OpenGL坐標。
第⑤和⑦行代碼是創建圖片菜單MenuItemImage對象第⑥和⑧行代碼是設置圖片菜單位置。第⑨行代碼是菜單Menu對象第⑩行代碼是菜單的位置mu->setPosition(Point::ZERO)設置的位置是Point::ZERO它等價於Point(0.0f,0.0f)。
還有由於背景圖片大小是1136 x 640而Win32默認窗口大小是960 x 640我們需要重新設置大小修改AppDelegate.cpp代碼如下
bool HelloWorld::init() { if ( !Layer::init() ) { return false; } Size visibleSize = Director::getInstance()->getVisibleSize(); Point origin = Director::getInstance()->getVisibleOrigin(); Sprite *bg = Sprite::create("menu/background.png"); bg->setPosition(Point(origin.x + visibleSize.width/2, origin.y + visibleSize.height/2)); this->addChild(bg); //開始精靈 Sprite *startSpriteNormal =Sprite::create("menu/start-up.png"); ① Sprite *startSpriteSelected =Sprite::create("menu/start-down.png"); ② MenuItemSprite*startMenuItem = MenuItemSprite::create(startSpriteNormal, startSpriteSelected, CC_CALLBACK_1(HelloWorld::menuItemStartCallback,this)); ③ startMenuItem->setPosition(Director::getInstance()->convertToGL(Point(700,170))); ④ //設置圖片菜單 MenuItemImage *settingMenuItem = MenuItemImage::create( "menu/setting-up.png", "menu/setting-down.png", CC_CALLBACK_1(HelloWorld::menuItemSettingCallback,this)); ⑤ settingMenuItem->setPosition(Director::getInstance()->convertToGL(Point(480,400))); ⑥ //幫助圖片菜單 MenuItemImage *helpMenuItem = MenuItemImage::create( "menu/help-up.png", "menu/help-down.png", CC_CALLBACK_1(HelloWorld::menuItemHelpCallback,this)); ⑦ helpMenuItem->setPosition(Director::getInstance()->convertToGL(Point(860,480))); ⑧ Menu*mu = Menu::create(startMenuItem, settingMenuItem, helpMenuItem, NULL); ⑨ mu->setPosition(Point::ZERO); ⑩ this->addChild(mu); return true; }
在上麵的代碼中第①②行是創建兩種不同狀態的精靈第③行代碼是創建精靈菜單MenuItemSprite對象第④行代碼是設置開始菜單項startMenuItem位置注意這個坐標是(700,170)由於(700, 170)的坐標是UI坐標需要轉換為OpenGL坐標。
第⑤和⑦行代碼是創建圖片菜單MenuItemImage對象第⑥和⑧行代碼是設置圖片菜單位置。第⑨行代碼是菜單Menu對象第⑩行代碼是菜單的位置mu->setPosition(Point::ZERO)設置的位置是Point::ZERO它等價於Point(0.0f,0.0f)。
還有由於背景圖片大小是1136 x 640而Win32默認窗口大小是960 x 640我們需要重新設置大小修改AppDelegate.cpp代碼如下
boolAppDelegate::applicationDidFinishLaunching() { // initialize director auto director = Director::getInstance(); auto glview = director->getOpenGLView(); if(!glview) { glview = GLView::create("My Game"); glview->setFrameSize(1136, 640); ① director->setOpenGLView(glview); } … … }
我們需要在第①行添加glview->setFrameSize(1136, 640)代碼。
上述代碼中的第①行定義的函數menuOkCallback是在用戶在設置場景點擊“OK”菜單時候回調。第②行代碼是使用popScene函數返回HelloWorld場景。
《Cocos2d-x實戰 C++卷》現已上線各大商店均已開售
京東https://item.jd.com/11584534.html
當當https://product.dangdang.com/23606265.html
互動出版網https://product.china-pub.com/3770734
《Cocos2d-x實戰 C++卷》源碼及樣章下載地址
源碼下載地址https://51work6.com/forum.php?mod=viewthread&tid=1155&extra=page%3D1
樣章下載地址https://51work6.com/forum.php?mod=viewthread&tid=1157&extra=page%3D1

最後更新:2017-04-03 12:56:38
上一篇:
Java中接口定義成員變量
下一篇:
微信之父張小龍:怎樣做簡單的產品經理?二
cocos2d-lua網狐手機遊戲(仿719遊戲(多款牛牛鬥地主神獸轉盤等))手機端源碼
servlet注意事項
java中使用switch case報錯case expressions must be constant expressions
同步/異步 阻塞/非阻塞 .
《大數據算法》一2.3 時間亞線性判定算法概述
tomcat中conf\Catalina\localhost目錄下的J2EE項目META-INF配置文件
“治理”微信們:國家“專項行動”的商業反響
手機dpi換算方法,以iPhone4為例
英特爾揭示四核心筆記本電腦處理器藍圖
7.1.2 DatePicker結合案例詳解