场景的UI图如下:
主开始菜单场景:
秘籍场景:
这一部分的主要内容也是三点:
•Menu家族及其成员构成
•Menu及各个成员的特点
•主开始菜单场景的分析和实现
下面是菜单Menu和菜单项MenuItem类图:
他们的关系就如名字一样,一个是容器Menu,一个是内容Item。
下面引用一段话:
菜单Menu是专门用来承载菜单按钮的Layer图层,图层中的子节点只能够是菜单项MenuItem或其子类。通常先创建菜单项MenuItem,然后使用一个或多个菜单项生成菜单Menu,最后把Menu加入当前Layer图层。
如果直接在层中添加MenuItem也可以正常显示,但是无法响应回调函数,因为Menu是继承至Layer,也就继承了触摸的相关事件,而MenuItem只是从Node继承而来,并不响应触摸,因此无法调用回调函数。
由于CCMenu的父类为Layer,所以锚点为(0,0),且无法设置锚点。Menu的默认原点坐标为屏幕正中心(winSize.width/2, winSize.height/2)。
而对于MenuItem是添加在Menu层中的,所以MenuItem的位置是相对于Menu层的偏移位置。MenuItem相对于Menu的偏移量默认为(0,0),且菜单项的锚点默认为(0.5,0.5)。
值得注意的是:Menu包含了多个子菜单项,每个子菜单项的位置都不一样,如果定义了Menu的位置,那它作为父节点会影响到所有的子菜单项的位置,所以一般我们都是吧Menu的位置设置在PointZero,然后设置MenuItem的位置(也就是相对父节点的偏移量)来定位整个菜单。

关于菜单项:

MenuItem继承自Node,所以它的子类菜单项都可以使用Node的相关操作。
MenuItem是所有菜单项的父类,建议不要直接使用该类,因为它并不包含具体显示的功能。
作为其它菜单项的父类,主要提供了一下三个功能:
        (1)提供了基本按钮的状态:正常、选中、禁用。
        (2)为按钮实现了基本的回调函数机制。当玩家点积按钮后,就会调用执行相应的回调函数。
        (3)触碰菜单项,附有自动放大效果。
菜单项的子类可以分成三类,总共六个:
        (1)文字菜单项:MenuItemLabel、MenuItemAtlasFont、MenuItemFont;
        (2)图片菜单项:MenuItemSprite、MenuItemImage;
        (3)切换菜单项:MenuItemToggle。

而关于各个菜单项之前的区别这里因为内容过多不再赘述,大家可以去查看他的源码和官方的文档获取相关知识,源码是最好的学习资料。

StartLayer.h
#ifndef __StartLayer_H__
#define __StartLayer_H__#include "cocos2d.h"
#include "cocos-ext.h"
#include "SimpleAudioEngine.h"USING_NS_CC;
USING_NS_CC_EXT;class StartLayer : public Layer
{
public:virtual bool init();static Scene* createScene();CREATE_FUNC(StartLayer);
private://开始主界面的按钮控件监控事件void touchSet(Ref* pSender);void touchLib(Ref* pSender);void touchMiJi(Ref* pSender);void touchCG(Ref* pSender);void touchTZ(Ref* pSender);void touchClose(Ref* pSender);void touchHelp(Ref* pSender);//图片精灵Sprite* title;Sprite* bgPic;
};#endif

StartLayer.cpp

#include "cocos2d.h"
#include "SimpleAudioEngine.h"
#include "GlobalDefine.h"
#include "StartLayer.h"
#include "HelloWorldScene.h"using namespace cocos2d;
using namespace CocosDenshion;Scene* StartLayer::createScene()
{Scene* startScene = Scene::create();StartLayer* layer = StartLayer::create();startScene->addChild(layer);return startScene;
}bool StartLayer::init()
{if(!Layer::init()){return false;}SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/galleryLayer.plist");SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/monster.plist");SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/resultLayer.plist");SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/mapBg.plist");SpriteFrameCache::getInstance()->addSpriteFramesWithFile("pnglist/mapMid.plist");if(getBoolFromXML(MUSIC_KEY)){float music = getFloatFromXML(MUSICVOL)*100.0f;aduioEngine->setBackgroundMusicVolume(getFloatFromXML(MUSICVOL));if(SimpleAudioEngine::getInstance()->isBackgroundMusicPlaying()){aduioEngine->pauseBackgroundMusic();aduioEngine->playBackgroundMusic("Sound/startBGM.mp3",true);}elseaduioEngine->playBackgroundMusic("Sound/startBGM.mp3",true);}elseaduioEngine->pauseBackgroundMusic();// 精灵初始化及位置设定title = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("Title.png"));title->setPosition(WINSIZE.width / 2 - 222, WINSIZE.height / 2 + 186);bgPic = Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("MainMenuBackground.png"));bgPic->setPosition(WINSIZE.width / 2, WINSIZE.height / 2);this->addChild(bgPic);this->addChild(title);// 按钮初始化以及时间绑定auto helpItem = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("HelpNormal.png")),Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("HelpSelected.png")),CC_CALLBACK_1(StartLayer::touchHelp, this)); // 帮助auto tujiItem = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("PhotoGalleryNormal.png")),Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("PhotoGallerySelected.png")),CC_CALLBACK_1(StartLayer::touchLib, this)); // 图籍auto setItem = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("SetNormal.png")),Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("SetSelected.png")),CC_CALLBACK_1(StartLayer::touchSet, this)); // 设置auto mijiItem = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("CheatsNormal.png")),Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("CheatsSelected.png")),CC_CALLBACK_1(StartLayer::touchMiJi, this)); // 秘籍auto chuangguanItem = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("EmigratedNormal.png")),Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("EmigratedSelected.png")),CC_CALLBACK_1(StartLayer::touchCG, this)); // 闯关auto tiaozhanItem = MenuItemSprite::create(Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ChallengeNormal.png")),Sprite::createWithSpriteFrame(SpriteFrameCache::getInstance()->getSpriteFrameByName("ChallengeSelected.png")),CC_CALLBACK_1(StartLayer::touchTZ, this)); // 挑战tujiItem->setPosition(WINSIZE.width - 62, WINSIZE.height - 73);mijiItem->setPosition(WINSIZE.width - 62, WINSIZE.height - 209);setItem->setPosition(WINSIZE.width - 62, WINSIZE.height - 346);helpItem->setPosition(WINSIZE.width - 62, WINSIZE.height - 473);chuangguanItem->setPosition(WINSIZE.width / 2 - 240, WINSIZE.height / 2 - 86);tiaozhanItem->setPosition(WINSIZE.width / 2 - 240, WINSIZE.height / 2 - 250);auto menu = Menu::create(tujiItem,mijiItem, setItem, helpItem, chuangguanItem, tiaozhanItem, NULL);menu->setPosition(Point::ZERO);this->addChild(menu, 2);return true;
}// 按钮事件实现
void StartLayer::touchSet(Ref* pSender)
{PLAYEFFECT;
//  Director::getInstance()->replaceScene(SetLayer::createScene());
}void StartLayer::touchLib(Ref* pSender)
{PLAYEFFECT;
//  Director::getInstance()->replaceScene(TujiLayer::createScene());
}void StartLayer::touchMiJi(Ref* pSender)
{PLAYEFFECT;//Director::getInstance()->replaceScene(MijiLayer::createScene());
}void StartLayer::touchCG(Ref* pSender)
{if (getBoolFromXML(SOUND_KEY)){aduioEngine->setEffectsVolume(getFloatFromXML(SOUNDVOL));aduioEngine->playEffect("Sound/button.mp3");}Director::getInstance()->replaceScene(HelloWorld::createScene());
}void StartLayer::touchTZ(Ref* pSender)
{PLAYEFFECT;
//  Director::getInstance()->replaceScene(GateMapLayer::createScene());
}void StartLayer::touchHelp(Ref* pSender)
{PLAYEFFECT;
//  Director::getInstance()->replaceScene(HelpLayer::createScene());
}

*图片来源见水印

功夫小子实践开发-Menu家族学习及开始菜单场景的实现相关推荐

  1. cocos2dx 3.10 功夫小子学习笔记

    一 目的 学习,并作为练习的一个案例 github 地址  https://github.com/baidang201/KungFuChild 教程地址: http://suool.net/2015/ ...

  2. Hadoop家族学习路线图--转载

    原文地址:http://blog.fens.me/hadoop-family-roadmap/ Sep 6, 2013 Tags: Hadoophadoop familyroadmap Comment ...

  3. Hadoop家族学习路线图

    Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, Avro, Ambari, ...

  4. 20169212 2016-2017-2 《网络攻防实践》第四周学习总结

    20169212 2016-2017-2 <网络攻防实践>第四周学习总结 教材学习中的问题和解决过程 wireshark学习 主机:Kali ip:192.168.1.117 目标:www ...

  5. [转]Hadoop家族学习路线图

    Hadoop家族学习路线图 Hadoop家族系列文章,主要介绍Hadoop家族产品,常用的项目包括Hadoop, Hive, Pig, HBase, Sqoop, Mahout, Zookeeper, ...

  6. html5实践开发教程,HTML5基础与实践教程

    HTML5基础与实践教程 语音 编辑 锁定 讨论 上传视频 <HTML5基础与实践教程>是2010年4月机械工业出版社出版的图书,作者是云翔,刘猛猛,欧阳植昊. 书    名 HTML5基 ...

  7. python网络编程视频教程_Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密)...

    Java网络开发视频教程 – 一站式学习Java网络编程视频教程 全面理解BIO(无密) 全面理解BIO/NIO/AIO 网络层编程,是每一个开发者都要面对的技术.课程为解决大家学习网络层知识的难题, ...

  8. 零基础学习Java开发,这些学习笔记送给你

    因为Java具备很多特点,并且在企业中被广泛应用为此很多小伙伴选择学习Java基础开发,但是零基础学习Java技术开发需要我们制定Java学习路线图对于我们之后的学习会非常有帮助. 零基础学习Java ...

  9. PHPWeb开发入门体验学习笔记

    PHPWeb开发入门体验学习笔记 4 一.PHP web应用开发须知 1.入门要点 程序员三个阶段:码农(速成技能)->工程师(长期知识)->专家(研究论文) 编程三要素:声明变量(系统. ...

  10. 学习英文-学以致用【场景:程序员英文-开发环境】

    学习英文-学以致用. 场景说明 本期讨论下程序员的日常英文-开发环境相关. 场景对话 场景1: Student: Hi, How are you doing ? 最近怎么样? DaLiang: I a ...

最新文章

  1. iOS 手机App消息推送功能(后台Java实现)
  2. 基于深度前馈序列记忆网络,如何将语音合成速度提升四倍?
  3. 39 MM配置-采购-采购订单-STO配置-定义工厂的装运数据
  4. WPF数据驱动应用程序上具有通用Lambda表达式的筛选器模式
  5. winform 让他间隔一段时间 执行事件 且只执行一次_记一次golang定时器引发的诡异错误...
  6. Android -- 屏幕适配
  7. Vue学习笔记之11-slot插槽
  8. QT 图片与base64互转
  9. spring cloud gateway 网关_33、Spring Cloud网关Gateway
  10. 移动先行之谁主沉浮? 带着你的Net飞奔吧!
  11. 计算 KL距离 (相对熵)
  12. sqlserver2000下载地址
  13. 如何去除html的flash,去除网站Flash动画效果,提升seo优化友好度
  14. 【Python】二分法求函数零点
  15. 微信小程序表格前后台分页
  16. 如何将已有项目导入SVN
  17. 2018.7.18 上半年课程总结 4- 高级英语
  18. 红蜻蜓抓图软件测试简历,红蜻蜓抓图精灵
  19. Excel中提取单元格中的部分内容或单元格中的数字公式大全(提取数字,提取前几位,提取指定文字之间的内容等等)
  20. 微信小程序全选,微信小程序checkbox,微信小程序购物车

热门文章

  1. Windows Server 2012 虚拟化实战:网络(一)
  2. 修改mongodb oplog size
  3. 做爬虫的一些技术观点-第450期
  4. CSS样式表初始化杂谈
  5. 文本相似度计算--余弦定理和广义Jaccard系数
  6. Redhat linux 5 Server相关介绍
  7. 既然Java反射可以访问和修改私有成员变量,那封装成private还有什么意义
  8. C语言数字转换为字符的问题
  9. 易改衣完成 5000 万 A 轮融资,唯品会战略投资
  10. ORA-00904:quot;T1quot;.quot;AREA_IDquot; :标识符无效