【捕鱼达人】游戏实战开发之主菜单场景
大家好,我是Lampard!!!
今天迎来捕鱼达人系列的第一篇博客更新,希望大家多多支持。
今天要实现的是主菜单场景:
从界面中我们就可以管中窥豹,其实所谓的主菜单场景,不过是包含了一个背景图片,一个游戏的logo以及两个用于切换场景的菜单项。图片我已经为大家准备好了,接下来只需要写简单的init就可以了:
(一)StartLayer.h
为了实现这个主菜单场景,我们需要创建两个文件,分别是主菜单场景的头文件以及cpp文件。头文件的实现很简单,只需要定义一个创建场景的函数,填充场景的函数,调用cocos层的静态创建方法,以及设置一个播放音乐的函数就完成了。
#ifndef __StartLayer__H__
#define __StartLayer__H__
#include "cocos2d.h" // cocos2d的头文件
#include "extensions/cocos-ext.h" // cocos2d的拓展库
USING_NS_CC; // 使用cocos2d的命名空间
USING_NS_CC_EXT;
class StartLayer : public Layer {
public:
static Scene* createScene(); // 创建一个场景
virtual bool init(); // 填充这个场景
CREATE_FUNC(StartLayer); // 静态创建一个StartLayer类并把它放进自动回收池
void playMusic(); // 播放背景音乐
private:
Size vsable = Size(1280, 720); // 屏幕大小
};
#endif
(二)StartLayer.cpp
接下来就是实现其函数的功能,值得注意的是,如果需要播放音效,记得要#include "SimpleAudioEngine.h"这个头文件
以及加上using namespace CocosDenshion这个命名空间
大家请看代码,我会在上面增加相应的注释:
(1)构造空的菜单场景,并把我们的StartLayer加载进去
Scene* StartLayer::createScene() // 创建一个空的场景,并把菜单层加载进去
{
Scene* scene = Scene::create();
StartLayer* startLayer = StartLayer::create();
scene->addChild(startLayer);
return scene;
}
(2)填充我们的主菜单层,需要一个背景精灵,一个游戏Logo,和两个菜单项
bool StartLayer::init()
{ // 填充我们的菜单层
if (!Layer::init())
{
return false;
}
auto bgSprite = Sprite::create("StartLayerBg.jpg"); // 背景精灵
bgSprite->setPosition(vsable.width / 2, vsable.height / 2); // 设置在正中间
this->addChild(bgSprite);
auto StartLogo = Sprite::create("StartLogo.png"); // 游戏的LOGO
StartLogo->setPosition(vsable.width / 2, 500);
Size size_pai = StartLogo->getContentSize();
//根据实际宽度和总宽度,计算期望缩放比率 // 对其进行相应的缩放
float scaleX_pai = (float)vsable.width*0.7f / (float)size_pai.width;
float scaleY_pai = (float)vsable.height*0.7f / (float)size_pai.height;
StartLogo->setScale(scaleX_pai, scaleY_pai);
this->addChild(StartLogo);
// 两个相应的菜单项的定义
auto StartItem = MenuItemSprite::create(
Sprite::create("3.png"), // 被点击前显示的精灵
Sprite::create("4.png"), // 被点击后显示的精灵
[&](Ref * ref) { // 回调函数
Scene *s = GameLayer::createScene();
TransitionSplitCols *trans = TransitionSplitCols::create(2, s); // 向上的切换动画
Director::getInstance()->replaceScene(trans); // 切换到游戏场景
}
);
auto HelpItem = MenuItemSprite::create(
Sprite::create("1.png"),
Sprite::create("2.png"),
[&](Ref * ref) {
Scene *s = HelpLayer::createScene();
TransitionSplitCols *trans = TransitionSplitCols::create(2, s);
Director::getInstance()->replaceScene(trans); // 切换到帮助场景
}
);
StartItem->setPosition(640, 280);
HelpItem->setPosition(640, 190);
auto menu = Menu::create(StartItem, HelpItem,NULL); // 把菜单项加载掉菜单中
// 记得最后要加上NULL
menu->setPosition(Point::ZERO);
this->addChild(menu);
playMusic();
return true;
}
(3) 定义播放背景音乐的方法,记得添加相应的头文件和命名空间
void StartLayer::playMusic() { // 播放音乐的函数
log("do it");
SimpleAudioEngine::getInstance()->playBackgroundMusic("StartLayerBGM.mp3", true);
}
OK,至此我们的主菜单场景已经构造完毕,谢谢大家!!!