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

时间:2021-02-19 20:08:59
场景的UI图如下: 主开始菜单场景: 功夫小子实践开发-Menu家族学习及开始菜单场景的实现

秘籍场景: 功夫小子实践开发-Menu家族学习及开始菜单场景的实现
这一部分的主要内容也是三点:Menu家族及其成员构成Menu及各个成员的特点开始菜单场景的分析和实现下面是菜单Menu和菜单项MenuItem类图:功夫小子实践开发-Menu家族学习及开始菜单场景的实现
他们的关系就如名字一样,一个是容器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);
}
else
aduioEngine->playBackgroundMusic("Sound/startBGM.mp3",true);
}
else
aduioEngine->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());
}

*图片来源见水印