代码下载链接

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企业级程序完全退出的解决方案【转】

    http://blog.csdn.net/wangjinyu501/article/details/8763552 问题描述 在平常开发的过程中可以发现,很多开发者对于程序的退出都没有去认真的解决.一 ...

  2. PendingIntent详解

    Intent是一个意图,一个描述了想要启动一个Activity.Broadcast或是Service的意图.它主要持有的信息是它想要启动的组件(Activity.Broadcast或是Service) ...

  3. Auto-Layout 的各种坑Unable to create description in descriptionForLayoutAttribute_layoutItem_coefficient. Something is nil'

    我们的很多人现在都在使用autolayout,用着也是非常爽但是有了这个东西以后更爽 很省事,什么都不用自己搞.Xcode完全搞定了,但是我终于为自己的懒惰付出了代价,再iphone4怎么运行怎么cr ...

  4. Js闭包与循环

    目标:点击任何一个li,提示当前点击位置 <ul> <li>第1个</li> <li>第2个</li> <li>第3个</ ...

  5. Android应用开发基础篇(11)-----ViewFlipper

    链接地址:http://www.cnblogs.com/lknlfy/archive/2012/03/01/2376067.html 一.概述 ViewFlipper这个部件是用来实现多页显示的,多页 ...

  6. BZOJ 3224: Tyvj 1728 普通平衡树(BST)

    treap,算是模板题了...我中间还一次交错题... -------------------------------------------------------------------- #in ...

  7. bzoj 1007 : [HNOI2008]水平可见直线 计算几何

    题目链接 给出n条直线, 问从y轴上方向下看, 能看到哪些直线, 输出这些直线的编号. 首先我们按斜率排序, 然后依次加入一个栈里面, 如果刚加入的直线, 和之前的那条直线斜率相等, 那么显然之前的会 ...

  8. IOS UIActionSheet的使用方法

    在IOS的用户接口向导中,苹果提供了另外一种显示警告框的手法,叫做UIActionSheet.它和UIAlertView比起来不会显得过于急切和紧张.而是很温和地在继续流程之前给用户提供了诸多选择. ...

  9. 用JS画斐波那契螺旋线(黄金螺旋线)

    偶然看到斐波那契螺旋线(黄金螺旋线)的定义及画图方法,试着用JS画了一下,很漂亮,很好玩 具体定义及画法大家查一下就有了,很简单. 以下是代码: <!DOCTYPE html> <h ...

  10. NuGet安装软件包故障解决

    今晚在家工作,使用NuGet安装 Install-Package Microsoft.AspNet.Web.Optimization 时,一直提示无法连接到nuget.org. 搜索后,可使用如下方法 ...