dart 如何在Flame_Tiled中绘制前景

zpf6vheq  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(187)

我需要帮助来绘制从平铺(.tmx)创建的Map
版本信息

flame: 1.5.0
flame_tiled: 1.9.0

我想要的是先画背景,然后是运动员,最后是前景。
我现在有4层,

  • 前景(平铺层)(顶层)。
  • 繁殖(对象层)。
  • shell (瓷砖层)。
  • 平台(平铺层)。

已经工作与绘图背景和播放器和前景与此代码。但我需要保存Map数据2文件。

final currentMap = await TiledComponent.load(
  '$mapName.tmx',
  Vector2.all(16),
);
add(currentMap);

final spawnPointObject = currentMap.tileMap.getLayer<ObjectGroup>('spawn');
for (final spawnPoint in spawnPointObject!.objects) {
  final positions = Vector2(
    spawnPoint.x + (spawnPoint.width / 2),
    spawnPoint.y + (spawnPoint.height / 2),
  );
  switch (spawnPoint.class_) {
    case 'player':
      _player = MyPlayer(
        anchor: Anchor.center,
        current: 'idle',
        position: positions,
        size: Vector2.all(16),
        name: name,
      );
      add(_player);
      break;
  }
}

final currentForeground = await TiledComponent.load(
  '${mapName}_foreground.tmx',
  Vector2.all(16),
);
add(currentForeground);

我可以从对象层绘制,但采取这么多的情况下将很难更新后..所以有没有办法只绘制1层与火焰_平铺。?
这是样本图像,我希望我的球员,以提请背后的屋顶时,发挥。image

- already try with layer object and drawing base on object id, one by one. but take so much effort.
- try with 2 save file, but still hard to maintain (used now)
k5ifujac

k5ifujac1#

我个人对这个问题的结论是flame_tiled不够灵活,所以它能为你做的最好的事情就是解析Map文件。如果你需要一个灵活的渲染,你可以自己实现它,因为flame_tiled把所有的东西都渲染成一个大的平面sprite批。
也许你可以通过渲染RenderableTiledMap两次来做一个快速的修改。在第一次渲染时,你禁用了“roof”Map的图层(参见“setLayerVisibility”函数),并将所有内容渲染为图片/图像,并将其 Package 为具有“地面”优先级的组件。然后启用“屋顶”层并禁用“地面”,然后对另一图片/图像进行相同的渲染,并将其 Package 到具有“屋顶”优先级的另一组件中。
为了解决这个问题,我提出了两个解决方案,一个比较简单,另一个比较复杂,目前还在开发/调试阶段:

  1. https://pub.dev/packages/flame_tiled_utils-用这个你可以把每一个Map的瓦片作为一个组件渲染到具有给定优先级的单独的层中。这正是你想要的,但是你需要创建一些额外的类来描述你的Map的瓦片类型。
  2. https://github.com/ASGAlex/flame_spatial_grid-允许做同样的事情,但是有更好的抽象级别。也有助于避免以前库的问题(在大Map上渲染缓慢)。但是它仍然在大量的开发中,有时我打破了一些东西,有时修复...
    抱歉,这样的“longread”的答案=)

相关问题