
Flame瓦片地图实战3步跑通flame_tiled加载TMX地图与避坑指南【免费下载链接】flameA Flutter based game engine.项目地址: https://gitcode.com/GitHub_Trending/fl/flame开场改一块地板就牵一发动全身的地图你的平台游戏地图有 240 个格子全靠代码一个个摆多放一块地板整张图坐标就乱。策划一句这段地板要会抖你无从下手。Flame 游戏引擎的桥接包 flame_tiled 就是解这个题的在 Tiled 编辑器里画好瓦片地图导出 TMX 文件交给TiledComponent批量解析和渲染。你将带走3 步把 Tiled 地图跑起来用 TileStack 对指定瓦片列做动画不用改地图文件幽灵线、缓存、图集大小三个高频坑的速查声明依赖与资源目录3 步渲染 TMX 地图先做环境准备。在你的项目pubspec.yaml里一次性写进依赖和资源目录dependencies: flame: ^1.38.0 flame_tiled: ^3.1.2 flutter: assets: - assets/tiles/ - assets/images/把两个目录换成你实际放.tmx和 tileset 图片的位置flame_tiled默认去assets/images/找 tileset 图片路径不同就留意这点。然后在游戏的onLoad里加载地图两个参数分别是 TMX 路径和瓦片像素尺寸import package:flame/components.dart; import package:flame/game.dart; import package:flame_tiled/flame_tiled.dart; class MyGame extends FlameGame { override Futurevoid onLoad() async { final map await TiledComponent.load( assets/tiles/map.tmx, Vector2.all(32), ); world.add(map); } }改这两处适配你的项目.tmx路径和瓦片尺寸。注意TiledComponent的 size 是锁死的想放大整张图用scale别设 size。跑通后的验收标准flutter run后屏幕上出现你在 Tiled 里画出的完整地图平台、背景、物体各就各位。屏幕空白先查.tmx是否声明在 assets 里再查 tileset 图片在不在assets/images/。瓦片尺寸填错时地图会糊成一锅像素粥Vector2.all(32)要和地图的 tileWidth/tileHeight 对上。把瓦片地图用出花样TileStack 与对象层地图渲染出来之前先说一句正交、等距、六边形、staggered 四种投影 flame_tiled 都支持Tiled 里换投影设置即可加载代码不变。抓一列瓦片出来做动画不改 TMX 文件把网格坐标 (x, y) 处的一整列瓦片抓出来交给 Flame effects地板抖动、方块下沉都能做// …省略… 已加载好的 TiledComponent map final stack map.tileMap.tileStack(4, 0, named: {floor_under}); stack.add( SequenceEffect( [ MoveEffect.by(Vector2(5, 0), NoiseEffectController(duration: 1, frequency: 20)), MoveEffect.by(Vector2.zero(), LinearEffectController(2)), ], repeatCount: 3, )..onComplete () stack.removeFromParent(), ); map.add(stack);这段代码找到 (4, 0) 处名为floor_under的瓦片列水平抖动 1 秒后复位重复 3 次。坐标、tileset 名和效果参数都按你的地图改。坑TileStack 目前只支持基于位置的 effectsscale、rotate 这类不会生效。移除 stack 不会把瓦片从地图上抹掉只是让它们回到原位动画结束地图完好无损这点其实是优点。读对象层生成动态元素在 Tiled 的对象层里画好金币位置、敌人生成点运行时把坐标读出来转成游戏对象final coins map.tileMap.getLayerObjectGroup(AnimatedCoins); final sprite await Flame.images.load(assets/images/coins.png); for (final obj in coins!.objects) { world.add( SpriteComponent(image: sprite, position: obj.position, size: obj.size), ); }从地图取出名为AnimatedCoins的对象层把每个对象转成一枚金币。层名必须和 Tiled 里命名完全一致金币图片和尺寸你自己定。坑getLayer名字写错时返回 null务必判空obj.position、obj.size是 flame_tiled 给TiledObject加的 Vector2 扩展不用手动换算 x、y。解决高频坑并调优地图性能瓦片之间出现幽灵线现象地图瓦片之间出现发丝般的缝隙放大后尤其明显。 原因GPU 采样纹理 UV 时的浮点精度误差不是你的 tileset 画错了。final map await TiledComponent.load(assets/tiles/map.tmx, Vector2.all(32)); map.position Vector2(0.5, 0.5);用半像素偏移把缝隙顶掉偏移值可以微调。什么时候不用管低分辨率屏幕上本来就不明显或者 tileset 自带 1px 内边距。切换地图后内存不释放现象加载新地图后旧地图的图片还占着内存。 原因Flame 的图像缓存和 Tiled 的图集缓存是两套清一套不管用。Flame.images.clearCache(); TiledAtlas.clearCache();这两行在切换新地图前执行无需改动其他代码。什么时候不用管整场游戏只有一张地图。调优纹理图集与关闭瓦片翻转地图含多个 tileset 时flame_tiled 会把它们打进一张纹理图集整层一次 draw call 画完final map await TiledComponent.load( assets/tiles/large_map.tmx, Vector2.all(32), ignoreFlip: true, // atlasMaxX: 9216, atlasMaxY: 9216, );大地图两个参数按需开ignoreFlip: true跳过翻转数据atlasMaxX/Y手动抬图集上限。地图路径换成你自己的。默认值 vs 调整后图集上限默认 web 4096x4096、其他平台 8192x8192手动抬到 9216x9216 能让更多 tileset 进同一张图集、减少分批绘制但首帧纹理上传量和显存占用约翻倍官方更推荐把 tileset 图片本身缩到默认上限装得下。翻转瓦片多的地图开ignoreFlip收益最明显。继续往下走接碰撞与物理地图跑起来之后下一步是把它接进玩法flame_tiled 官方文档TiledComponent、TileStack、图集的完整说明flame_tiled 示例项目本文平台地图的完整可运行代码Flame 碰撞检测文档把地图对象变成 hitboxflame_forge2d 物理桥接包需要重力、关节时走物理引擎打开 Tiled画一块 16x16 的地板然后让它抖一下——这块地板终于不晃了剩下的交给你的地图。【免费下载链接】flameA Flutter based game engine.项目地址: https://gitcode.com/GitHub_Trending/fl/flame创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考