cocos2dx休闲游戏--Fruit & Bird 开发学习(2)--主菜单场景MainLayer

主菜单场景,主要实现进入游戏时的初始界面,它包括6个场景入口的菜单项:开始游戏,排行榜,帮助,设置,关于,退出

下面是MainLayer的头文件

#ifndef  __MAIN_LAYER_H_
#define __MAIN_LAYER_H_

#include "cocos2d.h"
#include "GameSceneManager.h"

using namespace cocos2d;

class MainLayer :public Layer//主界面主要包含6个菜单项
{
public:
	virtual bool init();
	int randNum();//产生随机数的方法
	void initSound();//加载游戏音效的方法
	void menuCallBack0(Ref* pSender);//切换到选择游戏场景
	void menuCallBack1(Ref* pSender);//切换到排行榜场景
	void menuCallBack2(Ref* pSender);//切换到游戏设置场景
	void menuCallBack3(Ref* pSender);//切换到游戏帮助场景
	void menuCallBack4(Ref* pSender);//切换到游戏关于场景
	void menuCallBack5(Ref* pSender);//退出游戏的菜单回调方法
	void initTitle();//更新标题
	CREATE_FUNC(MainLayer);
public:
	Sprite* backGround;
	NodeGrid* effectNode;//网格节点,用来实现3D水波涟漪特效
	static bool musicFlag;
	static bool soundFlag;
	GameSceneManager* sceneManager;
};
#endif


MainLayer.cpp文件,其中文件中的某些菜单项,暂时没有实现其功能,后续补充修改。


#include "MainLayer.h"
#include "SimpleAudioEngine.h"

bool MainLayer::musicFlag = true;
bool MainLayer::soundFlag = true;

bool MainLayer::init()//主菜单界面的初始化
{
	if (!Layer::init())
		return false;

	//设置随机种子,该方法基本可以实现真正的随机
	timeval psv;
	gettimeofday(&psv, nullptr);
	unsigned long int seed = psv.tv_sec * 1000 + psv.tv_usec / 1000;
	srand(seed);

	auto visibleSize = Director::getInstance()->getVisibleSize();
	auto origin = Director::getInstance()->getVisibleOrigin();
	int n = randNum();//获取随机数(0-4),产生随机背景
	if (n % 2 == 0)
		backGround = Sprite::create("pic/morning.png");
	else
		backGround = Sprite::create("pic/night.png");
	backGround->setAnchorPoint(Vec2(0, 0));//设置背景锚点在左下角
	backGround->setPosition(origin.x, origin.y + visibleSize.height - backGround->getContentSize().height);
	this->addChild(backGround, 0);

	if (MainLayer::musicFlag)
		CocosDenshion::SimpleAudioEngine::getInstance()->playBackgroundMusic("sounds/playscene.mp3", true);
	
	auto floor = Sprite::create("pic/floor.png");
	floor->setAnchorPoint(Vec2(0, 0));
	floor->setPosition(origin);
	this->addChild(floor);
	floor->runAction(RepeatForever::create(Sequence::create(MoveTo::create(0.5f, Vec2(-120, 0)), MoveTo::create(0, Vec2(0, 0)), nullptr)));

	//菜单项加载
	auto menuItemStart = MenuItemImage::create("button/start.png", "button/start_off.png", CC_CALLBACK_1(MainLayer::menuCallBack0, this));
	menuItemStart->setPosition(Vec2(150, 600));

	auto menuItemRank = MenuItemImage::create("button/rank.png", "button/rank_off.png", CC_CALLBACK_1(MainLayer::menuCallBack1, this));
	menuItemRank->setPosition(Vec2(390, 600));

	auto menuItemSet = MenuItemImage::create("button/set.png", "button/set_off.png", CC_CALLBACK_1(MainLayer::menuCallBack2, this));
	menuItemSet->setPosition(Vec2(150, 450));

	auto menuItemHelp = MenuItemImage::create("button/help.png", "button/help_off.png", CC_CALLBACK_1(MainLayer::menuCallBack3, this));
	menuItemHelp->setPosition(Vec2(390, 450));

	auto menuItemAbout = MenuItemImage::create("button/about.png", "button/about_off.png", CC_CALLBACK_1(MainLayer::menuCallBack4, this));
	menuItemAbout->setPosition(Vec2(150, 300));

	auto menuItemExit = MenuItemImage::create("button/exit.png", "button/exit_off.png", CC_CALLBACK_1(MainLayer::menuCallBack5, this));
	menuItemExit->setPosition(Vec2(390, 300));

	auto mn = Menu::create(menuItemStart, menuItemRank, menuItemSet, menuItemHelp, menuItemAbout, menuItemExit, nullptr);
	mn->setPosition(Vec2::ZERO);
	this->addChild(mn, 10);

	effectNode = NodeGrid::create();
	this->addChild(effectNode, 10);//加入网格节点
	auto title = Sprite::create("pic/title.png");
	title->setPosition(Vec2(270, 800));
	effectNode->addChild(title);//将精灵添加到网格节点中
	Director::getInstance()->setDepthTest(false);//关闭深度检测
	effectNode->runAction(RepeatForever::create(Ripple3D::create(2.0f, Size(32, 24), Vec2(270, 800), 360, 4, 5)));
	return true;
}


int MainLayer::randNum()
{
	int num = random(0,4);//根据产生的数,确定要加载的背景图片
	return num;
}

void MainLayer::initTitle()
{
	auto title = Sprite::create("pic/title.png");
	title->setPosition(270, 800);
	this->addChild(title, 10);
	this->removeChild(effectNode);
}

void MainLayer::menuCallBack0(Ref* pSender)
{

}

void MainLayer::menuCallBack1(Ref* pSender)
{
	initTitle();
	sceneManager->goToRankBirdScene();
}

void MainLayer::menuCallBack2(Ref* pSender)
{

}

void MainLayer::menuCallBack3(Ref* pSender)
{

}
void MainLayer::menuCallBack4(Ref* pSender)
{

}
void MainLayer::menuCallBack5(Ref* pSender)
{

}


主菜单布景实现的效果图:



  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值