ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

从TMX文件到可玩场景:Flame瓦片地图flame_tiled实战指南

从TMX文件到可玩场景:Flame瓦片地图flame_tiled实战指南 从TMX文件到可玩场景Flame瓦片地图flame_tiled实战指南【免费下载链接】flameA Flutter based game engine.项目地址: https://gitcode.com/GitHub_Trending/fl/flame一枚金币掉进坑里坑底的瓦片跟着抖了两下——这就是瓦片地图能给你的手感。Flame 瓦片地图通过 flame_tiled 包承接 Tiled 编辑器的成果TMX 文件加载、批量渲染、TileStack 动画、对象层碰撞一套流程走通。一、环境配置pubspec.yaml 与 assets 目录怎么放声明两个依赖dependencies: flame: ^1.38.0 flame_tiled: ^3.1.2按下述结构摆放地图与图片资源assets/ ├── tiles/ │ └── map.tmx # Tiled 导出的地图文件 └── images/ ├── level_ice_tileset.png └── level_standard_tileset.png并在flutter:段落登记这些资源路径运行时才能读到。从 Tiled 导出 TMX 时有两个约定必须遵守瓦片集图片默认从assets/images/目录解析文件名要和 TMX 里记录的一致外部瓦片集.tsx要放在 TMX 同目录加载器按地图文件相对路径解析。二、加载 TMX 文件最短可运行片段调用一次TiledComponent.load就能把地图挂进游戏世界class MyGame extends FlameGame { override Futurevoid onLoad() async { final map await TiledComponent.load( assets/tiles/map.tmx, Vector2.all(32), // 瓦片渲染为 32px ); world.add(map); } }三句话讲清三者关系TiledComponent 是把 TMX 包进 Flame 组件树的容器Tileset 是颜料盒Layer 是叠在画布上的透明图层。TMX 文件里你实际会碰到 4 类数据瓦片集Tileset一组瓦片图片及其尺寸图层TileLayer按网格铺开的瓦片数据对象层ObjectGroup矩形、点、多边形等自由摆放的对象瓦片属性Tile propertiesTiled 里给单个瓦片打的自定义标签三、让地图动起来三个递进 Demo点击换瓦片你要解决的是玩家踩过的地板留下痕迹这类需求。Tiled 对象层的TiledObject已提供position与size两个 Vector2 快捷 getter可直接喂给 Flame 组件。// 换掉第 2 层 (3, 4) 处的瓦片 map.tileMap.setTileData( layerId: 2, x: 3, y: 4, gid: Gid(7), );图层 id 不记得的话先在 Tiled 里用对象模式点一下目标图层或调用map.tileMap.getLayerTileLayer(name)取 id。跑通之后再让地板抖起来。地面震动动画你要解决的是脚下瓦片跟着角色动作反应的反馈感。用tileStack按坐标选中一组瓦片再套上火焰特效final stack map.tileMap.tileStack(4, 0); stack.add( SequenceEffect([ MoveEffect.by( Vector2(5, 0), NoiseEffectController(duration: 1, frequency: 20), // 噪声抖动 ), MoveEffect.by(Vector2.zero(), LinearEffectController(2)), // 复位 ]), ); map.add(stack);NoiseEffectController用噪声产生随机抖动duration/frequency控制抖多快、抖多久复位用线性控制器即可。动画播完后记得stack.removeFromParent()。ObjectLayer 生成碰撞盒你要解决的是把 Tiled 里画的碰撞区域变成 Flame 碰撞盒。Tiled 对象层的对象逐个转成RectangleHitbox即可接入 Flame 碰撞检测final objects map.tileMap.getLayerObjectGroup(collision); for (final obj in objects!.objects) { world.add( RectangleHitbox( position: obj.position, size: obj.size, ), ); }位置与尺寸直接用TiledObject的 Vector2 getter 转换省去手写 x/y 拼接。四、地图变大之后图集与缓存调优纹理图集参数怎么调flame_tiled 会把一张地图的所有瓦片集打包成一张图集默认上限非 Web 平台 8192×8192Web 平台 4096×4096。需要调整时显式传参TiledComponent.load( assets/tiles/map.tmx, Vector2.all(32), atlasMaxX: 4096, atlasMaxY: 4096, );目标平台推荐 atlasMaxX/Y说明手机中低端4096大图集占显存留余量桌面端8192默认值即可Web4096部分浏览器纹理上限是 4096别硬上 8192瓦片翻转要不要开地图里没用过翻转就别开ignoreFlip: true。翻转瓦片需要额外的镜像绘制路径没用到时它只增加开销。瓦片缝隙怎么消相邻瓦片间出现发丝级缝隙多是浮点舍入造成。把 TiledComponent 的position偏移Vector2(0.5, 0.5)整体错位半个像素即可掩盖TiledComponent( tileMap: map.tileMap, position: Vector2(0.5, 0.5), // 抵消浮点缝隙 )切换地图时清缓存两张大地图来回切图集会双份驻留内存。切走旧地图后手动释放Flame.images.clearCache(); TiledAtlas.clearCache(); // 图集表要单独清只清Flame.images不够TiledAtlas内部还缓存着图集实例。踩坑速查表现象根因一行修复瓦片间有细缝亚像素浮点舍入position: Vector2(0.5, 0.5)整体偏移切图后内存只涨不跌图集实例未释放切图后调用TiledAtlas.clearCache()翻转瓦片场景掉帧每帧重算镜像绘制路径ignoreFlip: true六边形/等距图整体偏移渲染尺寸与 TMX 声明不一致destTileSize传与 TMX 瓦片尺寸相等的值瓦片集图片加载不到图片不在默认assets/images/目录把图片挪进该目录或用imagesDirectory参数指定下一步打开 Tiled画一张 32×32 的地图再加一条碰撞层。Tiled 编辑器官方文档https://doc.mapeditor.org/flame_tiled 示例仓库packages/flame_tiled/exampleFlame 碰撞系统文档doc/flame/collision_detection.md【免费下载链接】flameA Flutter based game engine.项目地址: https://gitcode.com/GitHub_Trending/fl/flame创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表