注:本教程主要来自《Cocos2D-x权威指南》满硕泉著 机械工业出版社,如需要更详细的内容,请支持并购买正版实体书籍
2013/11/26 更新
到目前为止,我们算是有一个基本完整的打飞机游戏了,最后我们来为这个游戏装一个封皮,即主菜单界面,为我们的制作画上一个句号。
游戏主菜单的实现
首先添加一个主菜单类GameMenu.h/cpp
在主菜单类头文件GameMenu.h中如下定义主菜单类
#include "cocos2d.h"
using namespace cocos2d;
class GameMenu : public CCLayer {
public:
// class of scene usually need to rebuild init method
virtual bool init();
static CCScene * scene();
// preprocessor macro for "static create()" constructor
CREATE_FUNC(GameMenu);
// callback method of button
void menuNewGameCallback();
};
可以看到,这个一般的场景类定义相似,都有两个基本函数init(), scene(), 构造函数宏的调用CREATE_FUNC(GameMenu), 需要注意的是这里有主菜单按钮的返回函数 menuNewGameCallback(), 用来对按下按钮后作出反应。
在GameMenu.cpp中,对定义的函数进行实现
Scene()函数
CCScene * GameMenu::scene()
{
// 'scene' is and autorelease object
CCScene * scene = CCScene::create();
// 'layer' is an autorelease object
GameMenu * layer = GameMenu::create();
// add layer as a child to scene
scene -> addChild(layer);
// return the scene
return scene;
}
bool init()函数
bool GameMenu::init()
{
if (!CCLayer::init()) {
return false;
}
CCSize size = CCDirector::sharedDirector() -> getWinSize();
// init background
CCSprite * bg = CCSprite::create("bg.png");
bg -> setScale(0.5);
bg -> setPosition(ccp(size.width/2, size.height/2));
this -> addChild(bg, 0, 0);
// init background plant
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);
// init title
CCNode * title = CCNode::create();
title -> setContentSize(CCSizeMake(size.width - 40, 50));
CCSprite * ptmLable = CCSprite::create("meowstar.png");
ptmLable -> setScale(0.5);
ptmLable -> setPosition(ccp(0, 30));
title -> addChild(ptmLable);
CCSprite * ptbLable = CCSprite::create("battle.png");
ptbLable -> setScale(0.5);
ptbLable -> setPosition(ccp(0, -30));
title -> addChild(ptbLable);
title -> setPosition(ccp(size.width / 2, size.height - 80));
this -> addChild(title, 2, 2);
// init button
// 1. New game
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(true);
// use button to build menu
CCMenu * mainMenu = CCMenu::create(newGameItem, NULL);
mainMenu -> setPosition(ccp(0, 0));
this -> addChild(mainMenu, 1, 3);
// init sound part
SimpleAudioEngine::sharedEngine() -> preloadBackgroundMusic("background.mp3");
SimpleAudioEngine::sharedEngine() -> setBackgroundMusicVolume(0.5);
SimpleAudioEngine::sharedEngine() ->playBackgroundMusic("background.mp3", true);
return true;
}
这里对于场景的初始化分成了几部分
1. 初始化背景
2. 初始化背景图像
3. 初始化标题
4. 初始化按钮
5. 初始化背景音乐 - 必须在GameMenu.cpp中加入以下关于声音函数的声明和命名空间 CocosDenshion
#include "SimpleAudioEngine.h"
using namespace CocosDenshion;
着重讲一下按钮的初始化,首先定义一个按钮对象CCMenuItemImage * newGameItem, 它是由两个图像newgameA.png, newgameB.png组成,按下之后调用menuNewGameCallback函数返回,然后用这个按钮对象来定义一个菜单对象mainMenu,最后将它加入到场景中去
按钮返回函数menuNewGameCallback()
void GameMenu::menuNewGameCallback()
{
CCDirector::sharedDirector() -> replaceScene(GameMain::scene());
}
这个比较简单,就是用主场景来代替现在的主菜单场景,当然这需要在GameMenu.cpp中加入调用GameScene.h头文件声明。
当然最后要是我们的主场景在游戏一开始的时候导入,必须去更改我们的加载部分,即AppDelegate.cpp中的applicationDidFinishLaunching()函数定义
这个很简单,如下
#include "GameMenu.h"
bool AppDelegate::applicationDidFinishLaunching()
{
// initialize director
CCDirector *pDirector = CCDirector::sharedDirector();
pDirector->setOpenGLView(CCEGLView::sharedOpenGLView());
// turn on display FPS
//pDirector->setDisplayStats(true);
// set FPS. the default value is 1.0/60 if you don't call this
//pDirector->setAnimationInterval(1.0 / 60);
// create a scene. it's an autorelease object
//CCScene *pScene = HelloWorld::scene();
CCScene * pScene = GameMenu::scene();
// run
pDirector->runWithScene(pScene);
return true;
}
在AppDelegate.cpp中加入调用GameMenu.h头文件声明,在 bool applicationDidFinishLaunching()中修改pScene的初始值为GameMenu::scene()
编译并运行游戏,我们就可以看到游戏的主菜单呈现在我们面前了, 并且播放着愉快的音乐。当然,实际上还有不少按键功能可以实现,例如进入一个关于游戏制作者的介绍页面,开关游戏声音的按钮,重新开始游戏的按钮,但是这些按钮的实现都比较简单,这里就不一一介绍了,有兴趣的朋友可以自己去研究一下。
到此为止,一个完整的打飞机游戏就完成了,大家觉得如何呢,是否能按照教程所说的完成这个游戏呢,如果中间遇到什么问题,欢迎和我一起研究讨论,我下一个目标是实现这本书的横版过关游戏,欢迎继续关注。