cocos2dx - 制作纵版射击游戏:喵星战争 (一)
注:本教程主要来自《Cocos2D-x权威指南》满硕泉著 机械工业出版社,如需要更详细的内容,请支持并购买正版实体书籍
2013/10/15 更新
在这个Cocos2D-X教程里,信封会向你展示如何制作一个简单的纵版射击游戏
首先介绍一下信封的厨具和适用于这个教程的所需的材料
开发IDE: XCode 4.6.2
COCOS2DX开发包版本:cocos2d-x-2.1.5
// 关于cocos2dx开发包的安装和版本控制,请参考这篇文章 使用Github管理cocos2dx版本
关于纵版射击游戏的理论,请参考《Cocos2D-x权威指南》机械工业出版社,在对纵版射击游戏有一定的概念之后,就让我们从现在开始一步一步完成这个游戏吧!!
开始准备
首先我们把这个教程所需要的素材下载并解压到你的本地
打开XCode,创建一个叫做CatStarWar的Cocos2DX project
将解压出来的素材添加到CatStarWar Project的Resources文件夹中,打开Classes文件夹,将HelloWorldScene.h, HelloWorldScene.cpp从Project中移除
这样开始准备就做完了
// 或者你这个时候想运行项目的时候会遇到一些错误,但是这很快就能在接下来的步骤中得到解决
创建游戏主场景
每一个游戏都需要一个主场景,打飞机类游戏也不例外,我们接下来先为这个游戏构建一个主场景,然后再将我们需要的要素一点点添加进去
添加一个C++类文件名叫GameScene.cpp,这是用来构成游戏主场景的类
在生成的GameScene.h中,我们定义这个游戏的主场景类GameMain
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "cocos2d.h" 2 using namespace cocos2d; 3 4 class GameMain : public CCLayer // inherit from CCLayer 5 { 6 public: 7 // Method 'init' in cocos2d-x returns bool, instead of 'id' in cocos2d-iphone 8 // class of scenen usually need to rebuild init method 9 virtual bool init(); 10 11 // there's no 'id' in cpp, so we recommend to return the class instance pointer 12 static CCScene * scene(); 13 14 // preprocessor macro for "static create()" constructor 15 CREATE_FUNC(GameMain); 16 };
在这里或者观察每个project自动生成的HelloWorldScene.h我们可以发现,通常有几个基本的公共函数是每个场景类都必须有或者是重写的
场景初始化函数init(), scene(), 场景的构造宏 CREATE_FUNC(GameMain)
有了这些基础函数作为支撑,我们才能够第一次生成我们的场景,接下来我们在GameScene.cpp里对这些基础函数进行定义
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "GameScene.h" 2 #include "SimpleAudioEngine.h" 3 4 using namespace CocosDenshion; 5 using namespace cocos2d; 6 7 CCScene * GameMain::scene() 8 { 9 // 'scene' is an autorelease object 10 CCScene * scene = CCScene::create(); 11 12 // 'layer' is an autorelease object 13 GameMain * layer = GameMain::create(); 14 15 // add layer as a child to scene 16 scene -> addChild(layer); 17 18 // return the scene 19 return scene; 20 } 21 22 bool GameMain::init() 23 { 24 if (!CCLayer::init()) { 25 return false; 26 } 27 28 CCSize size = CCDirector::sharedDirector() -> getWinSize(); 29 30 // add codes below 31 // every thing need to do during init 32 33 return true; 34 }
到了这里,大家应该会迫不及待试着运行一下自己的游戏看看了,不过还不行,要让我们的程序通过调试还需要更改一下游戏的加载部分,也就是AppDelegate的代码
(有兴趣想知道cocos2dx游戏是怎么加载的可以参考一下文章 cocos2d-x 引擎分析:程序是如何开始运行与结束的?)
打开AppDelegate.cpp, 添加头文件并修改加载函数bool applicationDidFinishingLaunching()如下
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include "cocos2d.h" 2 #include "GameScene.h" 3 4 bool AppDelegate::applicationDidFinishLaunching() 5 { 6 // initialize director 7 CCDirector *pDirector = CCDirector::sharedDirector(); 8 pDirector->setOpenGLView(CCEGLView::sharedOpenGLView()); 9 10 // turn on display FPS 11 pDirector->setDisplayStats(true); 12 13 // set FPS. the default value is 1.0/60 if you don't call this 14 pDirector->setAnimationInterval(1.0 / 60); 15 16 // create a scene. it's an autorelease object 17 CCScene * pScene = GameMain::scene(); 18 19 // run 20 pDirector->runWithScene(pScene); 21 22 return true; 23 }
在这里我们主要修改生成CCScene的部分,改成生成由我们定义GameMain类scene。
OK,现在我们可以第一次运行我们的游戏了!虽然只是一个黑色带一些游戏运行帧数的结果,但是这意味着我们开始了我们的制作,好的开始是成功的一半,在下一节我会介绍如何为我们的射击游戏添加一个可以移动的主角-小猫,敬请期待。