一、創建菜單場景
我們在一個遊戲中,通常打開遊戲後都會有一個菜單場景,在菜單場景中你可以點擊開始按鈕,也可以點擊其它例如設置等按鈕。這是一個非常通用的場景,今天就來嘗試創建一個menu的場景。
二、簡單的例子 - hello Menu Scene
首先創建一個場景類:
MenuScene.h
- #ifndef __MENU_SCENE_H__
- #define __MENU_SCENE_H__
- #include "cocos2d.h"
- using namespace cocos2d;
- class MenuScene:public Scene{
- public:
- MenuScene();
- ~MenuScene();
- virtual bool init();
- CREATE_FUNC(MenuScene);
- };
- #endif
MenuScene.cpp
- #include "MenuScene.h"
- #include "MenuLayer.h"
- #include "BackgroundLayer.h"
- MenuScene::MenuScene(){};
- MenuScene::~MenuScene(){};
- bool MenuScene::init(){
- if(!Scene::init()){
- return false;
- }
- auto bgLayer = BackgroundLayer::create();
- if(bgLayer){
- this->addChild(bgLayer);
- }
- auto menuLayer = MenuLayer::create();
- if(menuLayer){
- this->addChild(menuLayer);
- }
- return true;
- }
可以看到在實現類中,我們在Scene中添加了兩個層,一個是背景層,一個是菜單層。背景層就不說了,和創建普通層沒什麼區別,只是在層中添加一個背景圖而已。下面看下菜單層: MenuLayer.h
- #ifndef __MENU_LAYER_H__
- #define __MENU_LAYER_H__
- #include "cocos2d.h"
- using namespace cocos2d;
- class MenuLayer:public Layer{
- public:
- virtual bool init();
- CREATE_FUNC(MenuLayer);
- void menuStartCallback(Object *sender);
- };
- #endif
MenuLayer.cpp
- #include "MenuLayer.h"
- #include "GameScene.h"
- bool MenuLayer::init(){
- if(!Layer::init()){
- return false;
- }
- Point origin = Director::getInstance()->getVisibleOrigin();
- Size visiableSize = Director::getInstance()->getVisibleSize();
- SpriteFrame *playBtnFrmae = SpriteFrameCache::getInstance()->getSpriteFrameByName("play_btn.png");
- auto playBtn = Sprite::createWithSpriteFrame(playBtnFrmae);
- auto activePlayBtn = Sprite::createWithSpriteFrame(playBtnFrmae);
- activePlayBtn->setPositionY(7);
- auto menuItem = MenuItemSprite::create(playBtn,activePlayBtn,NULL,CC_CALLBACK_1(MenuLayer::menuStartCallback, this));
- menuItem->setPosition(Point(origin.x + visiableSize.width/2 ,origin.y + visiableSize.height*2/5));
- auto menu = Menu::create(menuItem,NULL);
- menu->setPosition(Point(origin.x ,origin.y));
- this->addChild(menu,1);
- return true;
- }
- void MenuLayer::menuStartCallback(Object *sender){
- log("start game...");
- auto gameScene = GameScene::create();
- TransitionScene *transition = TransitionFade::create(1,gameScene);
- Director::getInstance()->replaceScene(transition);
- }
在菜單層中的init函數中,通過MenuItemSprite::create(playBtn,activePlayBtn,NULL,CC_CALLBACK_1(MenuLayer::menuStartCallback, this));創建了一個基於精靈的菜單項,其中第一個參數是一個精靈,第二個也是,只不過對第二個進行了Y方向的偏移。這樣做的目的是第一個參數是正常情況菜單項顯示的精靈(可以簡單認爲圖片),第二個是當選中菜單項時候菜單項顯示的精靈,這樣就形成了動態效果。第三個參數是無效時候的菜單項顯示,這裏不需要所以是NULL,第四個參數是一個回調函數,就是當點擊菜單項時候觸發的函數。於是當點擊的時候,就會調用:
- void MenuLayer::menuStartCallback(Object *sender){
- log("start game...");
- auto gameScene = GameScene::create();
- TransitionScene *transition = TransitionFade::create(1,gameScene);
- Director::getInstance()->replaceScene(transition);
- }
這裏除了打印log外,創建了一個主遊戲場景,並通過TransitionScene進行切換場景。還是回到上面,完成創建菜單項後,就可以創建菜單了,只要把菜單項放入菜單即可。當然這裏只有一個菜單項,你可以可以嘗試創建多個。最後將Menu對象放入層中,就好了。最後效果:
長得有點醜,哈哈,這裏只是通過一個簡單的例子來展示如何創建菜單場景的,你可以嘗試加入更好看的元素,創建一個更漂亮的菜單場景。當然創建菜單的過程類似。
總結
一個小例子,展示如何在cocos2d-x中創建菜單場景。