Cocos2d-x Programmers Guide v3.3 译本和阅读笔记
原著是英文,本文只是一个个人的简单理解的中文的非正式翻译,供自己学习使用,参考需谨慎。
向原著的作者SlackMoehrle, Ricardo, Justin, Nite , Kai, Minggo, Wenhai, Tony, Yingtao, Rao 致敬。
第7章:其他节点类型
你已经使用了精灵,标签,动作而且你的游戏看上去已经很不错了。除了前面介绍的基本节点类型外,Cocos2d-x 还提供一些高级节点类型来实现一些特殊功能。如果你想制作一个基于瓦片的游戏怎么办?或者一个2维滚动层?更或许你希望添加粒子特效?Cocos2d-x提供了一些节点对象来帮你实现这些!
瓦片地图
瓦片地图顾名思义,是由瓦片组成的地图。没一个瓦片都有独立的行为。TMX 是一个基于XML的地图格式,原本是为瓦片地图而设计的,但是由于它对各种对象类型的支持,它同样也适用于各种通用型的游戏关卡设计。传见TMX对象非常容易:
// reading in a tiled map.
auto map = TMXTiledMap::create("TileMap.tmx");
addChild(map, 0, 99); // with a tag of '99'
基于瓦片的地图可以存在许多具体有不z-order的层。你可以使用他们的各自的名字来获取他们:
// how to get a specific layer
auto map = TMXTiledMap::create("TileMap.tmx");
auto layer = map->getLayer("Layer0");
auto tile = layer->getTileAt(Vec2(1, 63));
没一个瓦片都拥有唯一的位置和id。这使得选取瓦片变得非常容易。你可以通过id获取任何一个瓦片:
// to obtain a specific tiles id
unsigned int gid = layer->getTileGIDAt(Vec2(0, 63));
瓦片地图的布局示例:
怎么制作一个瓦片地图呢?许多工具都可以完成这项任务。Tiled是一个比较流行的工具。这个软件的一直在积极的开发,并且有着非常好的使用者论坛。上面的截图就是来自Tiled这款软件。
粒子系统
或许你需要添加一些特效比如燃烧,施法或者爆炸。你该如制作这些如此复杂的效果呢?这真的可能么?当然可能。使用粒子系统即可。粒子系统这一计算机图形科技术语表示使用大量的小精灵或者图形来模拟某种模糊的现象。举一些真是的例子比如:高度混沌系统,自然现象或者化学反映。下面是粒子效果的例子:
创建粒子系统的工具
虽然只要你愿意你可以通过手动设置没一个属性来创建粒子效果,但是第三方的工具可能会使你免去更多的麻烦:
- Partical Designer :Mac上的一款非常强大的粒子编辑器
- V -play particale editor:一个针对Cocos2d-x的跨平台粒子编辑器
- Particle2dx:一款网页在线粒子设计器
这些工具通常输出一个 .plist文件。Cocos2dx可以使用这个文件在游戏中创建粒子效果。就像我们一直使用的其他类一样,我们也是要那个create()方法创建:
// create by plist file
auto particleSystem = ParticleSystem::create("SpinningPeas.plist");
内建粒子效果
你已经给你的游戏添加过粒子效果了么?我们希望如此!你还会为创建粒子效果而烦恼么?方便起见我们提供了一些可以选择的内建粒子效果。清单如下:
- (ParticleFire)火焰:点粒子系统。使用重力模式。
- (ParticleFireworks)烟花:点粒子系统。使用重力模式。
- (ParticleSun)太阳:点粒子系统。使用重力模式。
- (ParticleGalaxy)星系:点粒子系统。使用重力模式。
- (ParticleFlower)花:点粒子系统。使用重力模式。
- (ParticleMeteor)流星:点粒子系统。使用重力模式。
- (ParticleSpiral)漩涡:点粒子效果。使用重力模式。
- (ParticleExplosion)爆炸:点粒子效果。使用重力模式。
- (ParticleSmoke)烟:点粒子系统。使用重力模式。
- (ParticleSnow)雪:点粒子系统。使用重力模式。
- (ParticleRain)雨:点粒子系统。使用重力模式。
以烟花效果为例子:
auto emitter = ParticleFireworks::create();
addChild(emitter, 10);
粒子效果看上去如下:
但是如果粒子效果和你想要的不完全一样怎么办?当然,你可以手动处理!同样以烟花效果为例,我们演示如何手动调节:
auto emitter = ParticleFireworks::create();
// set the duration
emitter->setDuration(ParticleSystem::DURATION_INFINITY);
// radius mode
emitter->setEmitterMode(ParticleSystem::Mode::RADIUS);
// radius mode: 100 pixels from center
emitter->setStartRadius(100);
emitter->setStartRadiusVar(0);
emitter->setEndRadius(ParticleSystem::START_RADIUS_EQUAL_TO_END_RADIUS);
emitter->setEndRadiusVar(0);
// not used when start == end
addChild(emitter, 10);
视差节点(Parallax)
视差节点一个模拟视差滚动层的特殊节点。啥?一个什么?是的,是的视差节点可以理解成一个实现了从不同位置和不同方向看到物体有所不同的效果的特殊节点。
生活中充满了这样的例子,比如在相机的取景器和透镜中的成像。许多游戏中都出现了这种现象,超级马里奥兄弟就是一个经典的例子。视差节点可以被 队列动作移动,而且可以被鼠标、触摸、加速度或者键盘事件控制。视差节点比普通节点更加复杂一些。为什么?因为它实际上需要使用多个节点来工作。一个时差节点自己是没有办法工作的。你至少需要两个其他的节点才能实现时差节点的效果。和Cocos2d-x的一贯作风一样,视差节点的创建是非常简单的。
// create ParallaxNode
auto paraNode = ParallaxNode::create();
Since you need multiple Node objects, they too are easily added:
// create ParallaxNode
auto paraNode = ParallaxNode::create();
// background image is moved at a ratio of 0.4x, 0.5y
paraNode->addChild(background, -1, Vec2(0.4f,0.5f), Vec2::ZERO);
// tiles are moved at a ratio of 2.2x, 1.0y
paraNode->addChild(middle_layer, 1, Vec2(2.2f,1.0f), Vec2(0,-200) );
// top image is moved at a ratio of 3.0x, 2.5y
paraNode->addChild(top layer, 2, Vec2(3.0f,2.5f), Vec2(200,800) );
看上去很熟悉,对么?有几点需要注意,我们为没一个节点分配一个唯一的z-order让他们都在栈顶。第二点注意是addChild()调用的两个附加的Vec2类型参数。这是系数和补偿。这些参数可以理解为相对父节点的速度变化率。
用文字很难展示视差节点的效果,因此,请运行“Programe Guide Sample”的代码看真正的动态效果。