cocos2dx - 制作纵版射击游戏:喵星战争 (七)
2013-11-26 21:21
330 查看
注:本教程主要来自《Cocos2D-x权威指南》满硕泉著 机械工业出版社,如需要更详细的内容,请支持并购买正版实体书籍
2013/11/26 更新
到目前为止,我们算是有一个基本完整的打飞机游戏了,最后我们来为这个游戏装一个封皮,即主菜单界面,为我们的制作画上一个句号。
游戏主菜单的实现
首先添加一个主菜单类GameMenu.h/cpp
在主菜单类头文件GameMenu.h中如下定义主菜单类
可以看到,这个一般的场景类定义相似,都有两个基本函数init(), scene(), 构造函数宏的调用CREATE_FUNC(GameMenu), 需要注意的是这里有主菜单按钮的返回函数 menuNewGameCallback(), 用来对按下按钮后作出反应。
在GameMenu.cpp中,对定义的函数进行实现
Scene()函数
bool init()函数
这里对于场景的初始化分成了几部分
1. 初始化背景
2. 初始化背景图像
3. 初始化标题
4. 初始化按钮
5. 初始化背景音乐 - 必须在GameMenu.cpp中加入以下关于声音函数的声明和命名空间 CocosDenshion
着重讲一下按钮的初始化,首先定义一个按钮对象CCMenuItemImage * newGameItem, 它是由两个图像newgameA.png, newgameB.png组成,按下之后调用menuNewGameCallback函数返回,然后用这个按钮对象来定义一个菜单对象mainMenu,最后将它加入到场景中去
按钮返回函数menuNewGameCallback()
这个比较简单,就是用主场景来代替现在的主菜单场景,当然这需要在GameMenu.cpp中加入调用GameScene.h头文件声明。
当然最后要是我们的主场景在游戏一开始的时候导入,必须去更改我们的加载部分,即AppDelegate.cpp中的applicationDidFinishLaunching()函数定义
这个很简单,如下
在AppDelegate.cpp中加入调用GameMenu.h头文件声明,在 bool applicationDidFinishLaunching()中修改pScene的初始值为GameMenu::scene()
编译并运行游戏,我们就可以看到游戏的主菜单呈现在我们面前了, 并且播放着愉快的音乐。当然,实际上还有不少按键功能可以实现,例如进入一个关于游戏制作者的介绍页面,开关游戏声音的按钮,重新开始游戏的按钮,但是这些按钮的实现都比较简单,这里就不一一介绍了,有兴趣的朋友可以自己去研究一下。
到此为止,一个完整的打飞机游戏就完成了,大家觉得如何呢,是否能按照教程所说的完成这个游戏呢,如果中间遇到什么问题,欢迎和我一起研究讨论,我下一个目标是实现这本书的横版过关游戏,欢迎继续关注。
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()
编译并运行游戏,我们就可以看到游戏的主菜单呈现在我们面前了, 并且播放着愉快的音乐。当然,实际上还有不少按键功能可以实现,例如进入一个关于游戏制作者的介绍页面,开关游戏声音的按钮,重新开始游戏的按钮,但是这些按钮的实现都比较简单,这里就不一一介绍了,有兴趣的朋友可以自己去研究一下。
到此为止,一个完整的打飞机游戏就完成了,大家觉得如何呢,是否能按照教程所说的完成这个游戏呢,如果中间遇到什么问题,欢迎和我一起研究讨论,我下一个目标是实现这本书的横版过关游戏,欢迎继续关注。
相关文章推荐
- cocos2dx - 制作纵版射击游戏:喵星战争 (一)
- cocos2dx - 制作纵版射击游戏:喵星战争 (六)
- cocos2dx - 制作纵版射击游戏:喵星战争 (四)
- cocos2dx - 制作纵版射击游戏:喵星战争 (五)
- cocos2dx - 制作纵版射击游戏:喵星战争 (二)
- cocos2dx - 制作纵版射击游戏:喵星战争 (三)
- cocos2d-x学习日志(10) --射击游戏(喵星战争)
- 如何使用cocos2dx 制作一个多向滚屏坦克类射击游戏-第一部分
- 如何使用cocos2dx 制作一个多向滚屏坦克类射击游戏-第二部分
- cocos2d-x学习日志(10) --射击游戏(喵星战争)
- 游戏开发制作实用音效素材下载 - 分类:动物、环境、打斗、生活、魔法、自然、系统、交通、配音、战争
- cocos2d-x游戏实例(18)-纵版射击游戏(5)
- cocos2d-x游戏实例(15)-纵版射击游戏(2)
- 基于cocos2dx的横版动作游戏制作(一)
- 喵星战争(八):游戏主模块的实现-2
- cocos2d-x游戏实例(19)-纵版射击游戏(6)
- 【COCOS2DX-游戏开发之三八】ClippingNode 制作标题闪亮特效
- cocos2d-x游戏实例(20)-纵版射击游戏(7)
- cocos2dx 3D战斗类游戏制作:【四】——一些零散笔记,3D小地图,android surfaceview等
- cocos2d-x游戏实例(17)-纵版射击游戏(4)