代码下载链接

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. POJ 1459 Power Network(网络流 最大流 多起点,多汇点)

    Power Network Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 22987   Accepted: 12039 D ...

  2. C#复习三(Day 22)

    哈哈,又到了总结的时间了.今天还是在继续复习C#的基础语法.这次总结主要以一下小程序为主. Split()的运用 123-456---789-----123-2把类似的字符串中重复符号去掉,得到123 ...

  3. 面试题之请写出用于校验 HTML 文本框中输入的内容全部为数字 的 javascript 代码

    <input type="text" id="d1" onblur=" chkNumber(this)"/> <scrip ...

  4. 使用iscroll4可能会遇到的问题(转:记录)

    1.在iscroll4的滚动容器范围内,点击input框.select等表单元素时没有响应这个问题原因在于iscroll需要一直监听用户的touch操作,以便灵敏的做出对应效果,所以它把其余的默认事件 ...

  5. C#代码模拟http发送get和post请求

    private string HttpPost(string Url, string postDataStr) { HttpWebRequest request = (HttpWebRequest)W ...

  6. 11.PHP 教程_PHP Switch 语句

    switch 语句用于根据多个不同条件执行不同动作. PHP Switch 语句 如果您希望有选择地执行若干代码块之一,请使用 switch 语句. 语法 switch (n) { case labe ...

  7. bzoj 1042: [HAOI2008]硬币购物 dp+容斥原理

    题目链接 1042: [HAOI2008]硬币购物 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1706  Solved: 985[Submit][ ...

  8. [转] iOS多线程编程之NSOperation和NSOperationQueue的使用

    <iOS多线程编程之NSThread的使用> 介绍三种多线程编程和NSThread的使用,这篇介绍NSOperation的使用. 使用 NSOperation的方式有两种, 一种是用定义好 ...

  9. java牛人给新人的几点建议

    展望未来,总结过去10年的程序员生涯,给程序员小弟弟小妹妹们的一些总结性忠告 走过的路,回忆起来是那么曲折,把自己的一些心得体会分享给程序员兄弟姐妹们,虽然时代在变化,但是很可能你也会走我已经做过的1 ...

  10. 阿里云ECS每天一件事D1:配置SSH

    近期因为项目需求,采购了两台阿里云ECS,选择的系统为CentOS 6.3 X64 安全加固版,额外买了160G的硬盘,应该够应付此项目的需求了. ECS默认已经配置好了sshd服务,可以使用root ...