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