代码下载链接

http://download.csdn.net/detail/yincheng01/6864893

解压密码:c.itcast.cn

背景

上一篇博文提到appDelegate,在该类的重载函数applicationDidFinishLaunching函数中,程序进入CMMenuScene场景,我们顺藤摸瓜来学习CMMenuScene。

类定义头文件

class CMMenuScene : public cocos2d::CCLayerColor
{
private:
bool m_bIsBtnClicked; //是否点击上按钮 public:
static CCScene* CreateMenuScene(); //触摸函数
virtual bool ccTouchBegan(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchMoved(CCTouch *pTouch, CCEvent *pEvent);
virtual void ccTouchEnded(CCTouch *pTouch, CCEvent *pEvent); protected:
virtual bool init();
CREATE_FUNC(CMMenuScene); virtual void onEnter();
virtual void onExit(); //按钮回调:开始游戏
void OnStartCallBack(CCObject *pSender); //按钮回调:退出游戏
void OnQuitCallBack(CCObject *pSender); //按钮回调:关于
void OnAboutCallBack(CCObject *pSender);
protected:
//标签
enum
{
enTagMenu=100,
};
};

init函数

bool CMMenuScene::init()
{
do
{ CC_BREAK_IF(CCLayerColor::initWithColor(ccc4(0,50,0,50))==false);
//CC_BREAK_IF(CCLayerColor::initWithColor(ccc4(255,0,0,255))==false);
m_bIsBtnClicked = false; //添加背景
CCSprite* pPauseLayerBG = CCSprite::create("menuscene/background.png");
CC_BREAK_IF(pPauseLayerBG==NULL);
pPauseLayerBG->setPosition(ccp(SCREEN_WIDTH/2,SCREEN_HEIGHT/2 + 58));
this->addChild(pPauseLayerBG,enZOrderMiddle); //添加菜单
CCMenu * pMenu = CCMenu::create();
CC_BREAK_IF(pMenu==NULL);
pMenu->setPosition(CCPointZero);
this->addChild(pMenu,enZOrderFront,enTagMenu); //添加按钮
CCMenuItemImage * pStartButton = CCMenuItemImage::create("menuscene/startgame_normal.png","menuscene/startgame_select.png",this,menu_selector(CMMenuScene::OnStartCallBack));
CC_BREAK_IF(pStartButton==NULL);
pStartButton->setPosition(ccp(SCREEN_WIDTH/2,SCREEN_HEIGHT/2 - 28));
pMenu->addChild(pStartButton,enZOrderFront); //添加按钮
CCMenuItemImage * pQuitButton = CCMenuItemImage::create("menuscene/quitgame_normal.png","menuscene/quitgame_select.png",this,menu_selector(CMMenuScene::OnQuitCallBack));
CC_BREAK_IF(pQuitButton==NULL);
pQuitButton->setPosition(ccp(SCREEN_WIDTH/2,SCREEN_HEIGHT/2 - 78));
pMenu->addChild(pQuitButton,enZOrderFront); //添加按钮
CCMenuItemImage * pAboutButton = CCMenuItemImage::create("menuscene/about_normal.png","menuscene/about_select.png",this,menu_selector(CMMenuScene::OnAboutCallBack));
CC_BREAK_IF(pAboutButton==NULL);
pAboutButton->setPosition(ccp(SCREEN_WIDTH - 50,20));
pMenu->addChild(pAboutButton,enZOrderFront); return true;
} while (false);
CCLog("Fun CSMMenuSceneLayer::init Error!");
return false;
}

从init函数可以看出,在菜单场景中,主要是实现按钮控制。

在init函数里并没有启用触摸,所以,触摸函数并不会被调用。

这里的结构是,CMMenuScene -> CCMenu -> CCMenuItem,CCMenuItem控件的位置

是由CCMenuItem的setPosition来定位的,但是事实上也也已通过pMenu->alignItemsVertically来让控件对齐。

关注pStartButton,这个是开始游戏按钮,点击开始游戏,那么程序切换到游戏场景。

切换场景

void CMMenuScene::OnStartCallBack( CCObject *pSender )
{
CCDirector* pDirector = CCDirector::sharedDirector();
CCScene *pScene = CMGameScene::CreateGameScene();
pDirector->replaceScene(pScene);
}

切换场景是由导演类来发起的,通过导演雷的replaceScene将新的场景,覆盖旧的场景。

切换场景可以有切换动画,切换动画见特别专题。

cocos2d-x游戏开发系列教程-超级玛丽05-CMMenuScene的更多相关文章

  1. cocos2d-x游戏开发系列教程-超级玛丽10-怪物与马里奥冲突检测

    在超级玛丽游戏中,马里奥在移动,怪物也在移动,当他们遇见时,需要判断是马里奥身亡还是怪物身亡. 这个判断的代码在怪物类的检测函数实现中. 比如蘑菇怪的冲突检测函数: bool CMMonsterMus ...

  2. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap

    背景 在上一篇博客中,我们提到CMGameScene,但是CMGameScene只是个框架,实际担任游戏逻辑的是CMGameMap类,这个博文就来了解下CMGameMap 头文件 class CMGa ...

  3. cocos2d-x游戏开发系列教程-超级玛丽06-CMGameScene

    背景 在CMMenuScene中,当用户点击开始游戏时,导演让场景进入到CMGameScene 头文件 class CMGameScene : public cocos2d::CCLayer,publ ...

  4. cocos2d-x游戏开发系列教程-超级玛丽08-消息机制

    在超级玛丽游戏里,地图类CMGameMap负责所有的程序逻辑,它包含了背景地图,包含了游戏元素精灵,当游戏中的精灵之间发生碰撞时,比如马里奥撞上砖头这种事情发生时,马里奥对象本身不知道怎么处理这个逻辑 ...

  5. cocos2d-x游戏开发系列教程-超级玛丽09-怪物激活与移动

    在游戏中,很多怪物本身是会移动的,这里主要有蘑菇怪,乌龟等. 说起怪物的移动,首先在游戏里先要考虑怪物的抽象和设计. 在CMMonster.h中,有个类CMMonsterBasic,这个类抽象了所有的 ...

  6. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(五)-地图卷动

    马里奥在平移的过程中,涉及到地图的卷动问题. 在这个游戏里,地图比窗口大,窗口只是显示了地图的一部分,因此马里奥在移动的时候,移动到一定位置之后要卷动地图,否则马里奥移动到窗口右边之后......那结 ...

  7. cocos2d-x游戏开发系列教程-超级玛丽07-CMGameMap(三)-按键处理

    在地图初始化好了之后,就开始移动马里奥吧,我在windows下,是使用键盘来移动马里奥的 w是跳,d是前进,a是后退,那么在程序里是怎么来获取这个按键的呢? 普通的windows程序,在按键之后,会有 ...

  8. cocos2d-x游戏开发系列教程-超级玛丽04-AppDelegate

    代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 背景 上一篇博文提到在CCApplication: ...

  9. cocos2d-x游戏开发系列教程-超级玛丽02-代码结构

    代码下载链接 http://download.csdn.net/detail/yincheng01/6864893 解压密码:c.itcast.cn 前景回顾 上一篇博文提到超级马里奥的游戏效果,大家 ...

随机推荐

  1. android 点击下弹动画实现

    下弹动画的实现 下弹动画在很多应用都有使用,比如豌豆荚中的应用介绍界面,百度手机助手的应用介绍界面等. 只要熟悉android动画的使用接口,制作动画并不困难. 这里使用开源库nineoldandro ...

  2. String、StringBuffer和StringBuild的区别

    public class Test1 { public static void stringReplace (String text) { text = text.replace('j','i') ; ...

  3. Log4Net 使用总结

    在项目中要记录日志,便于程序调试.于是就想到了大名鼎鼎的Log4Net,这货可以方便地将日志信息记录到文件.控制台.Windows事件日志和数据库(包括MS SQL Server, Access, O ...

  4. iframe的一些简单记录

    //获取当前所在IFrame的id var frameId = window.frameElement && window.frameElement.id || ''; //Jquer ...

  5. [转]Ubuntu 软件安装、查找、卸载--apt-get、apt-cache命令安全

    # apt-get update——在修改/etc/apt/sources.list或者/etc/apt/preferences之後运行该命令.此外您需要定期运行这一命令以确保您的软件包列表是最新的. ...

  6. SQLite For .Net 已经整合了32位和64位

    以前引用SQLite.DLL的时候,如果是winform等桌面程序,还要分32位和64位不一样的DLL,但最近已经整合为一个包了 打开vs的程序包管理器控制器,输入: install-package ...

  7. IOS 定位服务与地图的应用开发

    1.定位服务 现在的移动设备很多都提供定位服务,IOS设备提供3种不同定位途径: (1)WiFi定位,通过查询一个WiFi路由器的地理位置的信息,比较省电:IPhone,IPod touch和IPad ...

  8. Nginx工作原理和优化、漏洞(转)

    查看安装了哪些模块命令: [root@RG-PowerCache-X xcache]# nginx/sbin/nginx -Vnginx version: nginx/1.2.3built by gc ...

  9. Spring Cache使用详解

    Spring Cache Spring Cache使用方法与Spring对事务管理的配置相似.Spring Cache的核心就是对某个方法进行缓存,其实质就是缓存该方法的返回结果,并把方法参数和结果用 ...

  10. BZOJ 2761 不重复数字 (Hash)

    题解:直接使用STL中的hash去重即可 #include <cstdio> #include <map> using namespace std; int ans[50010 ...