【原创】cocos2dx实战游戏开发之【捕鱼达人单机版】------主菜单场景的实现

                【捕鱼达人】游戏实战开发之主菜单场景

  大家好,我是Lampard!!!

  今天迎来捕鱼达人系列的第一篇博客更新,希望大家多多支持。

 

今天要实现的是主菜单场景:

fish1

  从界面中我们就可以管中窥豹,其实所谓的主菜单场景,不过是包含了一个背景图片,一个游戏的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,至此我们的主菜单场景已经构造完毕,谢谢大家!!!

                                                                                                                                                               

                                                                              未完待续......

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Lampard杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值