《捕鱼达人》教程1:加载鱼的模型和播放动画
相信许多朋友都听过或玩过《捕鱼达人》这款游戏。去年7月,《捕鱼达人3》正式发布,24小时内下载量突破1千万,异常火爆。没玩过的朋友不妨下载试玩一下。
本次《捕鱼达人3》采用了Cocos2d - x 3.x版本中的3D功能进行开发,实现了完全的3D化。Cocos2d - x作为一款支撑了无数2D游戏产品的引擎,此次也在3D方面进行了功能扩展,有助于广大Cocos2d - x开发者快速进入3D游戏产品的研发时代。
下面,我们以《捕鱼达人3》为例,详细讲解如何使用Cocos2d - x 3.2实现其中的3D技术。
3D游戏开发基础
在进行3D游戏开发时,模型的加载和骨骼动画的播放是最基础且重要的工作。在《捕鱼达人3》中,每条鱼的模型和骨骼动画都是美术师使用3ds max或maya等3D建模软件创建的,最终导出为通用的模型文件格式.fbx。然后通过Cocos2d - x附带的转换工具fbx - conv.exe将其转换为可在Cocos2d - x中加载显示和播放的文件格式,主要有两种:c3t(文本格式的模型文件)和c3b(二进制格式的模型文件)。
在使用Cocos2d - x开发2D游戏时,最常用的类是Sprite(图片精灵),对精灵进行动画操作时,只需精灵调用相应的Action即可。为方便快速开发3D游戏,Cocos2d - x引擎也提供了相应的3D精灵类和播放骨骼动画的Action。接下来,我们用《捕鱼达人3》中的乌龟模型来演示这一过程。
具体实现步骤
1. 项目准备
首先,打开Cocos2d - x 3.x,拷贝一份ccp - empty - test并将其设为当前项目。然后在Class目录中创建一个基于Layer派生的层用于演示,将其命名为FishLayer。
2. 定义层类
在这个层里加入相应的精灵成员和动作,代码如下:
// 这是用于显示3D鱼模型的层
class FishLayer : public cocos2d::Layer
{
public:
// 初始化当前层
virtual bool init();
CREATE_FUNC(FishLayer);
protected:
// 鱼精灵
cocos2d::Sprite3D* _sprite;
// 向前游的动作
cocos2d::Animate3D* _swim;
// 受伤的动作
cocos2d::Animate3D* _hurt;
};
3. 初始化层
在层的初始化函数中加入精灵的创建代码:
bool FishLayer::init()
{
// 加载模型文件
std::string fileName = "tortoise.c3b";
_sprite = Sprite3D::create(fileName);
_sprite->setScale(0.1f);
auto s = Director::getInstance()->getWinSize();
_sprite->setPosition(Vec2(s.width * 4.f / 5.f, s.height / 2.f));
addChild(_sprite);
// 获取[骨骼动画](http://cn.cocos2d-x.org/article/index?type=cocos2d-x&url=/doc/cocos-docs-master/manual/framework/native/v3/spine/zh.md)信息
auto animation = Animation3D::create(fileName);
if (animation)
{
// 从起始到1.933秒截取为游泳动作
_swim = Animate3D::create(animation, 0.f, 1.933f);
_swim->retain();
// 从1.933秒到2.8秒截取为受伤的动作
_hurt = Animate3D::create(animation, 1.933f, 2.8f);
_hurt->retain();
// 让精灵循环播放游泳和受伤的动作
Sequence* pSequence = Sequence::create(_swim, _hurt, NULL);
_sprite->runAction(RepeatForever::create(pSequence));
}
return true;
}
4. 运行程序
将模型资源tortoise.c3b、用到的贴图tortoise.png以及背景图Sea.jpg放到资源目录下,运行程序。此时,就能看到乌龟显示在屏幕中,它会向前游动一下,然后播放受伤的动作,如此不断循环。
这样,我们就使用Cocos2d - x完成了3D模型的加载显示。大家是否觉得也并不复杂呢?