一、创建菜单场景
我们在一个游戏中,通常打开游戏后都会有一个菜单场景,在菜单场景中你可以点击开始按钮,也可以点击其它例如设置等按钮。这是一个非常通用的场景,今天就来尝试创建一个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中创建菜单场景。
##文档信息
- 版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
- 原文网址:http://www.cocosk.com/articles/2014⁄6/22/cocos2d-x-3-menu.html
- 作者:卧雪Sirk