一、创建菜单场景

我们在一个游戏中,通常打开游戏后都会有一个菜单场景,在菜单场景中你可以点击开始按钮,也可以点击其它例如设置等按钮。这是一个非常通用的场景,今天就来尝试创建一个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中创建菜单场景。

##文档信息