您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx - 制作纵版射击游戏:喵星战争 (七)

2013-11-26 21:21 330 查看
注:本教程主要来自《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()

编译并运行游戏,我们就可以看到游戏的主菜单呈现在我们面前了, 并且播放着愉快的音乐。当然,实际上还有不少按键功能可以实现,例如进入一个关于游戏制作者的介绍页面,开关游戏声音的按钮,重新开始游戏的按钮,但是这些按钮的实现都比较简单,这里就不一一介绍了,有兴趣的朋友可以自己去研究一下。



到此为止,一个完整的打飞机游戏就完成了,大家觉得如何呢,是否能按照教程所说的完成这个游戏呢,如果中间遇到什么问题,欢迎和我一起研究讨论,我下一个目标是实现这本书的横版过关游戏,欢迎继续关注。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: