cocos2d-x 3.0学习-创建菜单场景

一、创建菜单场景

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

二、简单的例子 - hello Menu Scene

首先创建一个场景类:

MenuScene.h

 
 
  1. #ifndef __MENU_SCENE_H__
  2. #define __MENU_SCENE_H__
  3.  
  4.  
  5. #include "cocos2d.h"
  6.  
  7. using namespace cocos2d;
  8.  
  9. class MenuScene:public Scene{
  10. public:
  11. MenuScene();
  12. ~MenuScene();
  13. virtual bool init();
  14. CREATE_FUNC(MenuScene);
  15.  
  16. };
  17. #endif

MenuScene.cpp

 
 
  1. #include "MenuScene.h"
  2. #include "MenuLayer.h"
  3. #include "BackgroundLayer.h"
  4.  
  5. MenuScene::MenuScene(){};
  6. MenuScene::~MenuScene(){};
  7.  
  8. bool MenuScene::init(){
  9. if(!Scene::init()){
  10. return false;
  11. }
  12.  
  13. auto bgLayer = BackgroundLayer::create();
  14. if(bgLayer){
  15. this->addChild(bgLayer);
  16. }
  17.  
  18. auto menuLayer = MenuLayer::create();
  19. if(menuLayer){
  20. this->addChild(menuLayer);
  21. }
  22.  
  23. return true;
  24. }

可以看到在实现类中,我们在Scene中添加了两个层,一个是背景层,一个是菜单层。背景层就不说了,和创建普通层没什么区别,只是在层中添加一个背景图而已。下面看下菜单层: MenuLayer.h

 
 
  1. #ifndef __MENU_LAYER_H__
  2. #define __MENU_LAYER_H__
  3.  
  4. #include "cocos2d.h"
  5.  
  6. using namespace cocos2d;
  7.  
  8. class MenuLayer:public Layer{
  9. public:
  10. virtual bool init();
  11. CREATE_FUNC(MenuLayer);
  12. void menuStartCallback(Object *sender);
  13.  
  14. };
  15. #endif

MenuLayer.cpp

 
 
  1. #include "MenuLayer.h"
  2. #include "GameScene.h"
  3.  
  4. bool MenuLayer::init(){
  5. if(!Layer::init()){
  6. return false;
  7. }
  8. Point origin = Director::getInstance()->getVisibleOrigin();
  9. Size visiableSize = Director::getInstance()->getVisibleSize();
  10. SpriteFrame *playBtnFrmae = SpriteFrameCache::getInstance()->getSpriteFrameByName("play_btn.png");
  11. auto playBtn = Sprite::createWithSpriteFrame(playBtnFrmae);
  12. auto activePlayBtn = Sprite::createWithSpriteFrame(playBtnFrmae);
  13. activePlayBtn->setPositionY(7);
  14. auto menuItem = MenuItemSprite::create(playBtn,activePlayBtn,NULL,CC_CALLBACK_1(MenuLayer::menuStartCallback, this));
  15. menuItem->setPosition(Point(origin.x + visiableSize.width/2 ,origin.y + visiableSize.height*2/5));
  16.  
  17. auto menu = Menu::create(menuItem,NULL);
  18. menu->setPosition(Point(origin.x ,origin.y));
  19. this->addChild(menu,1);
  20. return true;
  21. }
  22.  
  23. void MenuLayer::menuStartCallback(Object *sender){
  24. log("start game...");
  25. auto gameScene = GameScene::create();
  26. TransitionScene *transition = TransitionFade::create(1,gameScene);
  27. Director::getInstance()->replaceScene(transition);
  28. }

在菜单层中的init函数中,通过MenuItemSprite::create(playBtn,activePlayBtn,NULL,CC_CALLBACK_1(MenuLayer::menuStartCallback, this));创建了一个基于精灵的菜单项,其中第一个参数是一个精灵,第二个也是,只不过对第二个进行了Y方向的偏移。这样做的目的是第一个参数是正常情况菜单项显示的精灵(可以简单认为图片),第二个是当选中菜单项时候菜单项显示的精灵,这样就形成了动态效果。第三个参数是无效时候的菜单项显示,这里不需要所以是NULL,第四个参数是一个回调函数,就是当点击菜单项时候触发的函数。于是当点击的时候,就会调用:

 
 
  1. void MenuLayer::menuStartCallback(Object *sender){
  2. log("start game...");
  3. auto gameScene = GameScene::create();
  4. TransitionScene *transition = TransitionFade::create(1,gameScene);
  5. Director::getInstance()->replaceScene(transition);
  6. }

这里除了打印log外,创建了一个主游戏场景,并通过TransitionScene进行切换场景。还是回到上面,完成创建菜单项后,就可以创建菜单了,只要把菜单项放入菜单即可。当然这里只有一个菜单项,你可以可以尝试创建多个。最后将Menu对象放入层中,就好了。最后效果:

长得有点丑,哈哈,这里只是通过一个简单的例子来展示如何创建菜单场景的,你可以尝试加入更好看的元素,创建一个更漂亮的菜单场景。当然创建菜单的过程类似。

总结

一个小例子,展示如何在cocos2d-x中创建菜单场景。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值