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

注:本教程主要来自《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()

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

到此为止,一个完整的打飞机游戏就完成了,大家觉得如何呢,是否能按照教程所说的完成这个游戏呢,如果中间遇到什么问题,欢迎和我一起研究讨论,我下一个目标是实现这本书的横版过关游戏,欢迎继续关注。

posted @ 2013-11-26 21:21  fuutou  阅读(393)  评论(0编辑  收藏  举报