Cocos2d-x 开发者指南07:其他的节点类型

2015年03月20日 14:15 0 点赞 0 评论 更新于 2017-05-08 00:12

我们已经在使用精灵、标签和动作,并且游戏开发也取得了一定进展。除了前面章节中介绍的基本节点类型,Cocos2d-x 还提供了更多高级节点类型,可用于构建特殊功能并实现更多效果。例如,你可能想开发一款基于瓦片地图的游戏,或者是 2D 横版卷轴游戏,又或者想在游戏中添加粒子效果。Cocos2d-x 提供了相应的节点对象来帮助你实现这些需求。

瓦片地图

瓦片地图由一个个瓦片构成,每个瓦片都可以有独立的行为。TMX 是一种基于 XML 的地图格式,最初用于设计瓦片式地图,由于它支持多种对象类型,也适用于更广泛的普通游戏场景。TMX 对象的创建非常简单:

// 读取瓦片地图
auto map = TMXTiledMap::create("TileMap.tmx");
addChild(map, 0, 99); // 标签为 '99'

瓦片地图可以包含多个图层,图层的显示顺序由 z-order 决定。你可以通过图层名称来访问特定的图层:

// 获取特定图层
auto map = TMXTiledMap::create("TileMap.tmx");
auto layer = map->getLayer("Layer0");
auto tile = layer->getTileAt(Vec2(1, 63));

每个瓦片都有唯一的位置和 ID,因此可以很方便地挑选特定的瓦片。你可以通过 ID 来访问任意一个瓦片:

// 获取特定瓦片的 ID
unsigned int gid = layer->getTileGIDAt(Vec2(0, 63));

瓦片地图的创建

有许多工具可用于创建瓦片地图,Tiled 是一款非常流行的工具,它发展迅速,并且拥有活跃的用户社区。

粒子系统

在游戏中,你可能需要实现燃烧的火焰、咒语施放或爆炸等效果。这些复杂效果可以通过粒子系统来实现。粒子系统是一种计算机图形技术,它使用大量微小的精灵或其他图形对象来模拟模糊现象,这些效果使用传统渲染技术很难实现,例如高度混乱的系统、自然现象或化学反应等。

用于创建粒子效果的工具

你可以手动创建粒子效果,调整每个属性以满足需求,但也有一些第三方工具可供使用:

  • Particle Designer:一款在 Mac 上功能强大的粒子效果编辑器。
  • V-play particle editor:Cocos2d-x 上的跨平台粒子编辑器。
  • Particle2dx:一个在线 Web 粒子设计器。

这些工具通常会导出一个 .plist 文件,Cocos2d-x 可以读取该文件,以便在游戏中使用你创建的粒子模型。和其他类一样,使用 create() 方法来创建粒子系统:

// 通过 plist 文件创建粒子系统
auto particleSystem = ParticleSystem::create("SpinningPeas.plist");

内置粒子效果

如果你想在游戏中添加粒子效果,但不太适应创建自定义效果,Cocos2d-x 提供了一些内置的粒子效果:

  • ParticleFire:点粒子系统,使用重力模式。
  • ParticleFireworks:点粒子系统,使用重力模式。
  • ParticleSun:点粒子系统,使用重力模式。
  • ParticleGalaxy:点粒子系统,使用重力模式。
  • ParticleFlower:点粒子系统,使用重力模式。
  • ParticleMeteor:点粒子系统,使用重力模式。
  • ParticleSpiral:点粒子系统,使用重力模式。
  • ParticleExplosion:点粒子系统,使用重力模式。
  • ParticleSmoke:点粒子系统,使用重力模式。
  • ParticleSnow:点粒子系统,使用重力模式。
  • ParticleRain:点粒子系统,使用重力模式。

ParticleFireworks 为例,使用内置效果非常简单:

auto emitter = ParticleFireworks::create();
addChild(emitter, 10);

如果粒子效果不完全符合你的需求,你可以手动调整属性。以下是通过手动改变烟花效果的属性来深入操作的示例:

auto emitter = ParticleFireworks::create();
// 设置持续时间
emitter->setDuration(ParticleSystem::DURATION_INFINITY);
// 半径模式
emitter->setEmitterMode(ParticleSystem::Mode::RADIUS);
// 半径模式:距离中心 100 像素
emitter->setStartRadius(100);
emitter->setStartRadiusVar(0);
emitter->setEndRadius(ParticleSystem::START_RADIUS_EQUAL_TO_END_RADIUS);
emitter->setEndRadiusVar(0); // 当起始半径等于结束半径时不使用
addChild(emitter, 10);

视差

视差节点是一种特殊的节点类型,用于模拟滚动视差效果。简单来说,视差效果是指从不同位置观看物体时,物体显示的位置或方向会发生变化。例如,通过取景器取像或从相机镜头往外看时就会有这种效果。许多游戏都应用了这种功能,如经典的超级马里奥。

ParallaxNode 对象可以按序列移动,也可以通过鼠标、触摸、加速计或键盘事件手动移动。视差节点比普通节点稍微复杂一些,因为它需要多个节点协同工作,仅一个 ParallaxNode 无法正常工作,至少需要两个其他节点对象才能完成一个 ParallaxNode。在 Cocos2d-x 中,ParallaxNode 的创建很方便:

// 创建 ParallaxNode
auto paraNode = ParallaxNode::create();

添加节点对象也很容易:

// 创建 ParallaxNode
auto paraNode = ParallaxNode::create();
// 背景图像的移动比例为 0.4x,0.5y
paraNode->addChild(background, -1, Vec2(0.4f, 0.5f), Vec2::ZERO);
// 中层图层的移动比例为 2.2x,1.0y
paraNode->addChild(middle_layer, 1, Vec2(2.2f, 1.0f), Vec2(0, -200));
// 顶层图像的移动比例为 3.0x,2.5y
paraNode->addChild(top_layer, 2, Vec2(3.0f, 2.5f), Vec2(200, 800));

需要注意的是,每个添加的节点对象都被分配了唯一的 z-order 值,z-order 值会依次叠加。同时,addChild() 方法中调用的另外两个 Vec2 类型的参数分别是比例和偏移量,这些参数可以看作是与父节点的速度比。

由于很难用文字详细描述 ParallaxNode 的效果,建议运行“Programmer Guide Sample”示例代码,在实践中学习其应用。

作者信息

boke

boke

共发布了 1025 篇文章