ARTICLE DETAIL

资讯详情

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

3步把TMX地图搬进游戏画布:flame_tiled瓦片地图渲染速通手册

3步把TMX地图搬进游戏画布:flame_tiled瓦片地图渲染速通手册 3步把TMX地图搬进游戏画布flame_tiled瓦片地图渲染速通手册【免费下载链接】flameA Flutter based game engine.项目地址: https://gitcode.com/GitHub_Trending/fl/flame屏幕上刚从一片灰色切到了Tiled编辑器画好的完整关卡。flame_tiled的瓦片地图渲染只干一件事给它一个TMX文件和瓦片尺寸整个场景就落在组件树里。 项目定位为什么flame_tiled是瓦片地图渲染的桥Flame是基于Flutter的游戏引擎。地图不是它的原生组件。flame_tiled补上这一环解析TMX文件用批量绘制把整张图一次性画出来你不必逐格摆放瓦片。术语一句话解释TMX文件Tiled编辑器导出的XML地图文件含瓦片集、图层与对象数据TiledComponent渲染地图的Flame组件加载完成后加入组件树destTileSize每格瓦片的目标显示尺寸像素控制整体缩放TileAtlas把地图全部瓦片集图片打包成一张大图减少绘制调用TileStack某坐标处的瓦片集合可整体选中并施加位置动画Tiled编辑器的瓦片地图编辑界面导出后即为TMX文件⚙️ 环境搭建准备一个带Tiled资源的Flutter项目克隆仓库示例代码在packages/flame_tiled/example/git clone https://gitcode.com/GitHub_Trending/fl/flame创建自己的Flutter工程flutter create tiled_demo在pubspec.yaml里加两个依赖dependencies: flame: ^1.38.0 flame_tiled: ^3.1.2地图文件放进assets/tiles/瓦片集图片放进assets/images/并声明这两个目录flutter: assets: - assets/tiles/ - assets/images/瓦片集图片默认去assets/images/目录找。地图引用的外部.tsx瓦片集则按tmx文件所在目录解析。 核心用法拆解加载与渲染TMX瓦片地图文件加载TMX地图文件并加入组件树load方法解析文件返回可直接挂载的组件。override Futurevoid onLoad() async { final map await TiledComponent.load( assets/tiles/map.tmx, // 路径要和pubspec.yaml里的声明一致 Vector2.all(16), // 每格瓦片按16x16像素绘制 ); world.add(map); }第一帧起整个场景就铺在视野里。游戏里有CameraComponent时地图组件会自动挂上相机。flame_tiled示例渲染出的瓦片地图场景金币按对象层摆放按对象层坐标摆放游戏对象对象层最适合标记出生点、NPC的位置。final layer map.tileMap.getLayerObjectGroup(spawn); for (final obj in layer!.objects) { world.add( RectangleComponent( size: Vector2.all(16), position: Vector2(obj.x, obj.y), // Tiled坐标就是地图像素直接复用 paint: Paint()..color Color(0xFFFF0000), ), ); }每个红块对应你在编辑器里摆的对象在Tiled里挪动后游戏里的位置同步变化。动态切换图层可见性与透明度换场景不必重新加载整张地图。map.tileMap.setLayerVisibility(2, visible: false); // 隐藏id为2的层 map.tileMap.setLayerOpacity(0, opacity: 0.6); // 第一层变半透明可见性按TMX里的层id传透明度按层在列表中的顺序传调用即生效。渲染等距与六边形投影的地图正交、等距、六边形、交错这四种投影都支持。final iso await TiledComponent.load( assets/tiles/isometric.tmx, Vector2.all(32), // 只改瓦片尺寸坐标无需手动换算 ); world.add(iso);组件会按投影类型自算尺寸等距和六边形地图画出来就是成品效果。 进阶能力文档里不显眼的三个开关与一个动画这三项能力非必须按需使用。用TileStack给瓦片列加位移动画适用场景想让某几列地面晃动暗示下面藏着机关。final stack map.tileMap.tileStack(4, 0, named: {floor}); stack.add(MoveEffect.by(Vector2(5, 0), EffectController(duration: 1))); map.add(stack);只有那一列瓦片在动其余地图纹丝不动。TileStack只吃位置类效果。TileStack瓦片列动画效果选中的瓦片列随位移生效配置纹理图集上限与翻转开关适用场景地图瓦片集很多图里还用了翻转瓦片。final map await TiledComponent.load( assets/tiles/big_map.tmx, Vector2.all(32), atlasMaxX: 9216, // Web上限是4096确认硬件扛得住才调大 atlasMaxY: 9216, ignoreFlip: true, // 不开这个开关翻转瓦片会多占一倍显存 );flame_tiled纹理图集默认在Web上封顶4096其他平台8192。打包成功后整层保持单次绘制调用。运行时替换单个瓦片数据适用场景玩家拿走物品后需要原位换掉那块瓦片。final old map.tileMap.getTileData(layerId: 1, x: 3, y: 7); map.tileMap.setTileData( layerId: 1, x: 3, y: 7, gid: Gid(12, old!.flips), // 换新瓦片编号保留原翻转状态 );下一帧新瓦片就位缓存只重建这张地图的图层。 避坑手册三个高频渲染与内存问题现象相邻瓦片之间出现发丝级缝隙。根因GPU按浮点采样纹理坐标舍入误差让边缘露出底色。修复TiledComponent( tileMap: tileMap, position: Vector2(0.5, 0.5), // 用半像素偏移压住缝隙 );现象切换新地图后内存不降旧瓦片图一直占着。根因打包好的图集存在TiledAtlas的静态缓存里只清Flame.images清不掉。修复Flame.images.clearCache(); TiledAtlas.clearCache(); // 两个要成对调用旧图集才会真正释放现象多瓦片集大地图里翻转瓦片一多帧率明显下滑。根因每个翻转瓦片都要额外复制一份翻转后的纹理图集越大显存吃越狠。修复final map await TiledComponent.load( assets/tiles/map.tmx, Vector2.all(32), ignoreFlip: true, // 不开这个开关翻转瓦片会多占一倍显存 ); 快速参考卡flame_tiled关键API速查操作对应API/配置备注加载TMX地图TiledComponent.load(fileName, destTileSize)fileName须是pubspec里声明的路径瓦片显示尺寸第二参数Vector2.all(16)值越大整体越放大纹理图集上限atlasMaxX/atlasMaxYWeb默认4096其他平台8192忽略瓦片翻转ignoreFlip: true大纹理多翻转时省显存关闭图集渲染useAtlas: false退回drawImageRect逐图绘制瓦片图目录imagesDirectory默认assets/images/取对象层tileMap.getLayerObjectGroup(name)找不到返回null改图层可见性tileMap.setLayerVisibility(id, visible: ...)传TMX里的层id改图层透明度tileMap.setLayerOpacity(index, opacity: ...)传层顺序范围0.0到1.0替换单个瓦片tileMap.setTileData(...)会触发渲染缓存重建瓦片列动画tileMap.tileStack(x, y, named: ...)仅支持位置类效果清图集缓存TiledAtlas.clearCache()在Flame.images.clearCache()后调用常用资料flame_tiled示例代码flame_tiled源码位置flame_tiled文档入口打开编辑器把第一张map.tmx放进assets/tiles/改一下加载路径瓦片地图就会出现在你的场景里。【免费下载链接】flameA Flutter based game engine.项目地址: https://gitcode.com/GitHub_Trending/fl/flame创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表