Cocos2d-x3.2塔防游戏视频
塔防游戏是一类策略型游戏,玩家通过在地图上建造炮塔或类似建筑物来阻止敌人进攻。近年来,像《植物大战僵尸》《兽人必须死》《保卫萝卜》等题材多样的塔防游戏发展迅猛。为了跟上游戏界的潮流,本文将分享一款基于 Cocos2d-x-3.0rc0 引擎的标准塔防游戏制作教程,让你体验塔防游戏开发的乐趣。
第一部分:下载代码与运行演示
你可以先下载第一部分的游戏代码。运行该部分 demo 后,你将看到一个小偷在指定的地图路线上行走,其效果图如下(此处可补充效果图)。
基础知识预热
在本章中,我们将介绍一些简单的基础知识,为塔防游戏开发做准备,具体内容如下:
- 辅助工具介绍:帮助简化和优化 Cocos2d-x 游戏开发。
- 分辨率适配:使游戏能良好支持多屏幕、多分辨率的移动设备。
- 创建游戏场景:构建游戏的主场景。
前期知识储备
为了更方便地实现程序中的某些功能,我们通常会使用一些 Cocos2dx 引擎配套或支持的编辑器来辅助开发。如果你没听说过这些编辑器,那在 Cocos2d 游戏开发领域可能就稍显生疏了。尽管这些工具在之前的教程中已多次提及,但为照顾初学者,下面还是简单介绍一下,经验丰富的开发者可跳过此部分。
Tiled Map 编辑器
Tiled Map 编辑器,也叫瓦片地图编辑器,用于制作地图。它制作的地图可保存为 TMX 格式的文件,能被 Cocos2d-x 很好地支持。瓦片地图生成简单,且能灵活应用于引擎中,在塔防类游戏中,用它制作场景地图十分合适。你可以在官网下载该编辑器,若不清楚使用方法,可在网上搜索使用教程,也可参考《【cocos2d-x 官方文档】瓦片地图》这篇文章。
TexturePacker
游戏中通常会有较多的图片资源,加载大量资源会耗费大量时间和内存,因此高效使用图片资源对游戏至关重要。在 Cocos2d 中,我们一般将图片资源打包成一张大图,这样既能节省空间,又能提升加载速度。
在 Cocos2d-x 引擎开发中,常用的图片编辑打包工具有 Zwoptex 和 Texturepacker,本教程使用的是 Texturepacker,你可以到它的官方网站下载并安装。
Texturepacker 工具的每个设置项都有相应的提示信息,使用简单。打包后会得到两个文件,一个是 plist 文件,它是图片信息的属性列表文件;另一个是打包后的图片文件,支持 png、jpg、pvr.ccz 等格式。建议打包为 pvr.ccz 格式,原因有两点:一是可使应用程序更小,因为图片经过了压缩;二是能让游戏启动更快。
粒子编辑器
Cocos2d-x 引擎提供了强大的粒子系统,在模仿自然现象、物理现象及空间扭曲方面具有独特优势,能方便地实现爆炸、烟花、水流等真实自然且带有随机性的特效。
常用的粒子编辑器有 ParticleDesigner 和 ParticleEditor。虽然 ParticleDesigner 编辑器界面更美观,但个人认为 ParticleEditor 更适合新手。之前我也写过一篇关于“如何使用 ParticleEditor 编辑器”的文章,大家可以参考。
需要注意的是,ParticleDesigner 不支持 Windows 系统,如果你使用的是 Windows 系统,建议选择 ParticleEditor。
分辨率适配
分辨率适配是本教程的重要内容,在之前的游戏教程中也多次提及。虽然 Cocos2dx 提供了方便的函数接口用于实现分辨率适配,只需简单几句代码即可完成,但很多人并未理解其原理,包括曾经的我。因此,强烈建议大家阅读《Cocos2d-x 多分辨率适配完全解析》这篇文章,尽管它并非针对最新版 Cocos2dx 引擎,但能清晰地讲解分辨率适配的原理和方法。
下面介绍实现分辨率适配的方法:打开 AppDelegate.cpp 文件,在 applicationDidFinishLaunching 方法中添加以下代码:
glview->setDesignResolutionSize(480.0f, 320.0f, ResolutionPolicy::FIXED_HEIGHT);
std::vector<std::string> searchPath;
searchPath.push_back("height_864");
CCFileUtils::getInstance()->setSearchPaths(searchPath);
特别说明,本游戏的地图资源大小为 1536 * 864。我们要制作一个高度方向上全部显示的游戏,所以选择分辨率模式为 FIXED_HEIGHT。计算内容缩放因子时的参数为:资源高度 / 屏幕分辨率高度。height_864 是搜索的文件夹名。
关于分辨率模式的最新讲解,你可以参考“使用 Cocos2d-x 制作三消类游戏 Sushi Crush”这篇文章的分辨率适配部分。
游戏场景
新建一个 PlayLayer 类,该类将作为我们的游戏主场景。打开 AppDelegate.cpp 文件,在 applicationDidFinishLaunching() 函数中将它设置为第一个启动的游戏场景:
CCScene *pScene = PlayLayer::scene();
pDirector->runWithScene(pScene);
PlayLayer 类的定义如下:
class PlayLayer : public Layer
{
public:
PlayLayer();
~PlayLayer();
virtual bool init() override;
static Scene* createScene();
CREATE_FUNC(PlayLayer);
private:
SpriteBatchNode *spriteSheet;
TMXTiledMap* map;
TMXObjectGroup* objects;
Vector<Node*> pointsVector;
void initPointsVector(float offX);
void addEnemy();
};
在第一部分 demo 中,我们只需在 PlayLayer 场景中加载一幅游戏地图和一个敌人,因此 PlayLayer 的内容不会太多,后续文章会详细介绍。至此,本章内容介绍完毕。