ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Flame 等轴测视角:三步让瓦片地图立起来

Flame 等轴测视角:三步让瓦片地图立起来 Flame 等轴测视角三步让瓦片地图立起来【免费下载链接】flameA Flutter based game engine.项目地址: https://gitcode.com/GitHub_Trending/fl/flame你想让一个 2D 角色站在菱形瓦片上朝屏幕左下方走一步背后的楼房自动挡在它前面。在 Flutter 游戏引擎 Flame 里这套 Flame 等轴测的 2.5D 效果三步就能跑通换算坐标、按深度排队、贴上菱形贴图。心智模型棋盘转 45°再把 Y 轴压扁一半斜 45 度视角不需要 3D 引擎只需要两个几何动作先把方格棋盘旋转 45°每块方砖变成尖角朝上下左右的菱形再把竖直方向压扁一半。经典的 2:1 菱形宽高比就是斜 45 度视角观感的来源。这里没有透视依旧是纯 2D 渲染。前后两排瓦片在纵向上的距离只剩一半2D 游戏里的 2.5D 效果全靠这两个动作挤出来。再注意遮挡瓦片离屏幕下边缘越远x y 越小越先画离得越近越后画。守住这一条排队规则遮挡关系自然成立。仔细看这块菱形上半块加左右两个斜面正好对应一个立方体的顶面、左面、右面。这就是为什么一张菱形贴图能顶一个体素——立体感是贴图的形状给的不是光影给的。最小可跑通路径把网格坐标拧 45°等轴测瓦片地图的坐标工作集中在两个换算函数上网格转屏幕、屏幕回网格。方向很好记x - y 决定左右x y 决定上下那个 0.5 就是刚才的纵向压缩。// 网格 → 屏幕 Vector2 cartToIso(Vector2 p) Vector2(p.x - p.y, (p.x p.y) * 0.5); // 屏幕 → 网格点击命中检测用 Vector2 isoToCart(Vector2 p) Vector2(p.y p.x / 2, p.y - p.x / 2);反公式同样重要玩家点击屏幕时用 isoToCart 把屏幕坐标换回网格坐标才能定位点到的是哪块瓦片。Flame 内置的 IsometricTileMapComponent 两个方向都做了getBlock 还能直接返回命中的方块不用自己手推。让瓦片按深度排队等轴测里谁压谁不再由代码顺序决定而由深度决定网格坐标之和越小离镜头越远越先画。地面瓦片地图本身是组件一次性画完的内部排队顺序已经正确。你真正要管的是自己额外加进去的独立对象——角色、房屋、树。Flame 按 priority 升序绘制子组件所以每次换格重算一次优先级就行。// 每次换格重算越小越先画离镜头越远 void onGridChanged() { hero.priority heroGrid.x heroGrid.y; }角色走到建筑前面自动画在上层走到后面自动被挡住不用管 z 轴。树上挂的装饰、地图里漂浮的物品同理只要它们有网格坐标就一起排队。贴上一张菱形贴图位置定了就是贴图的事。地图是一张二维 int 矩阵-1 表示空位其余值是贴图 id每张图从同一张图集切出避免逐瓦片加载纹理。final tileset SpriteSheet(image, srcSize: Vector2(32, 32)); add(IsometricTileMapComponent( tileset, matrix, // -1 空位其余是瓦片 id destTileSize: Vector2(64, 64), // 屏幕上显示多大 tileHeight: 16, // 瓦片视觉厚度 ));tileHeight 是瓦片的厚度调大一点就是城建游戏那种厚板质感。矩阵和组件一起 add 进去整张地图一次画完带鼠标悬停高亮的可跑示例在 examples/lib/stories/rendering/结构可以直接抄。三个容易翻车的瞬间角色站错了格子。原因手推公式把 x - y 和 x y 的方向弄反或忘了乘纵向压缩比。修复直接用内置的 cartToIso / isoToCart别手推。角色永远躲在建筑后面。原因priority 写成了常量移动时没更新。修复每次换格执行一次 hero.priority grid.x grid.y。瓦片边缘闪烁相机一动整张地图在抖。原因落点坐标不是整像素每帧重采样。修复用 getBlockRenderPositionInts 取整位置角色位置也四舍五入到整像素。瓦片上千后帧率开始掉。原因每块瓦片都是独立 Sprite纹理状态切换频繁。修复瓦片塞进同一张 SpriteSheet 图集让 tilemap 组件一次性批量绘制。还能往哪走6×6 的矩阵是手写的真实项目应该让 flame_tiled 的等轴测图层 干活在 Tiled 编辑器里排好等轴测地图导出 .tmx 就能直接导入。相机跟随的思路是每帧朝角色位置做一点插值细节看 相机文档骨架跑通之后加灰尘粒子和脚底阴影特效组件树在 Effects 文档 里。【免费下载链接】flameA Flutter based game engine.项目地址: https://gitcode.com/GitHub_Trending/fl/flame创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表