一个游戏,主菜单是一个必不可少的。游戏的界面制作相对于主游戏的制作来说要简单的,只需要把界面控件加入布景层中,然后设置按钮的回调函数就可以了。下面我就先附上其实现的主要代码:
在GameMenuScene.cpp中
bool GameMenu::init()
{
if (!CCLayer::init())
{
return false;
}
CCSize size = CCDirector::sharedDirector()->getWinSize();
//初始化背景
CCSprite* bg = CCSprite::create("bg.png");
bg->setScale(0.5);
bg->setPosition(ccp(size.width/2 , size.height/2));
this->addChild(bg ,0, 0);
//初始化背景星球
CCSprite *bgstar = CCSprite::create("moon.png");
bgstar->setAnchorPoint(ccp(0.5 , 0));
bgstar->setScale(0.5);
bgstar->setPosition(ccp(size.width/3*2 ,0));
this->addChild(bgstar ,1 ,1);
//初始化标题
CCNode *title = CCNode::create();
title->setContentSize(CCSizeMake(size.width -40 , 50));
CCSprite *ptmLabel = CCSprite::create("meowstar.png");
ptmLabel->setScale(0.5);
ptmLabel->setPosition(ccp(0 ,30));
title->addChild(ptmLabel);
CCSprite *ptbLabel = CCSprite::create("battle.png");
ptbLabel->setScale(0.5);
ptbLabel->setPosition(ccp(0 , -30));
title->addChild(ptbLabel);
title->setPosition(ccp(size.width/2 , size.height - 80));
this->addChild(title ,2 ,2);
//初始化按钮
CCMenuItemImage *newGameItem = CCMenuItemImage::create("newGameA.png","newGameB.png", this, menu_selector(GameMenu::menuNewGameCallback));
newGameItem->setScale(0.5);
newGameItem->setPosition(ccp(size.width/2 ,size.height/2 -20));
newGameItem->setEnabled(false);
CCMenuItemImage *continueItem = CCMenuItemImage::create("continueA.png", "continueB.png", this,menu_selector(GameMenu::menuContinueCallback));
continueItem->setScale(0.5);
continueItem->setPosition(ccp(size.width/2 ,size.height/2 -80));
continueItem->setEnabled(false);
CCMenuItemImage *aboutItem = CCMenuItemImage::create("aboutA.png", "aboutB.png", this, menu_selector(GameMenu::menuAboutCallback));
aboutItem->setScale(0.5);
aboutItem->setPosition(ccp(size.width/2 ,size.height/2 - 140));
aboutItem->setEnabled(false);
soundItem = CCMenuItemImage::create("sound-on-A.png", "sound-on-B.png", this,menu_selector(GameMenu::menuSoundCallback));
soundItem->setScale(0.5);
soundItem->setEnabled(false);
soundItem->setPosition(ccp(40 ,40));
//使用按钮创建菜单
CCMenu* mainmenu = CCMenu::create(newGameItem, continueItem, aboutItem, soundItem, NULL);
mainmenu->setPosition(ccp(0, 0));
this->addChild(mainmenu, 1, 3);
//初始化声音部分
issound = true; //是否开启声音参数
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathForFilename("background.mp3")).c_str());
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(0.5);
SimpleAudioEngine::sharedEngine()->playBackgroundMusic(std::string(CCFileUtils::sharedFileUtils()->fullPathForFilename("background.mp3")).c_str(),true);
return true;
}
void GameMenu::onEnter()
{
CCLayer::onEnter();
CCSize size = CCDirector::sharedDirector()->getWinSize();
//界面进入时,运行菜单项进入动作
CCNode *mainmenu = this->getChildByTag(3);
mainmenu->setPositionX(-200);
mainmenu->runAction(CCSequence::create(CCEaseElasticIn::create(CCMoveTo::create(0.5, ccp(0, 0))),CCCallFuncN::create(this, callfuncN_selector(GameMenu::menuEnter)),NULL));
CCNode *title = this->getChildByTag(2);
title->setPositionY(size.height + 20);
this->runAction(CCEaseElasticIn::create(CCMoveBy::create(0.5 ,ccp(0, -100))));
CCNode *bgstar = this->getChildByTag(1);
bgstar->setPositionX(size.width/3);
bgstar->runAction(CCMoveBy::create(0.5 ,ccp(size.width/3 ,0)));
}
下面是新的知识点:
1.CCMenuItemImage::create(const char *normalImage, const char *selectedImage, CCObject* target, SEL_MenuHandler selector)
上次只是简单的介绍了下CCMenuItemImage的作用,现在介绍下其create函数的具体用法:
normallmage :是指正常状态下的图片;
selectedImage:是指按下时显示的图片;
target: 是指回调函数所在的类;
selector:是指在这个菜单项被按下时的回调函数,该函数设置为这个类的成员函数,返回为void类型。
2.SimpleAudioEngine:其是Cocos2d-x封装的一个用来跨平台的能够简单方便播放背景音乐和音效的音效引擎,其常使用方式如下:
1>准备工作:
引入头文件:#include "SimpleAudioEngine.h";
2>播放背景音乐:
SimpleAudioEngine::sharedEngine()->playBackgroundMusic(const char* pszFilePath, bool bLoop);
3>预先加载背景音乐:
SimpleAudioEngine::sharedEngine()->preloadBackgroundMusic(const char* pszFilePath);
4>设置播放音量大小:
SimpleAudioEngine::sharedEngine()->setBackgroundMusicVolume(float volume)//其参数值为0.0-1.0 ;
5>暂停背景音乐:
SimpleAudioEngine::sharedEngine()->stopBackgroundMusic();
还有一些其他播放控制,在这就不一一列举了。
3.CCFileUtils::sharedFileUtils()->fullPathForFilename(const char* pszFileName):
从该函数名就很容易看出该函数是通过文件名来获取相对路径的。
网上对这个CCFileUtils类的介绍比较少,需要详细了解的可以去查看下官方文档的介绍。