【免费下载链接】amethystData-oriented and>项目地址https://gitcode.com/gh_mirrors/ame/amethyst点击查看免费下载瓦片地图是 2D 游戏中最常见的地图组织方式。在 Rust 数据驱动游戏引擎 Amethyst 中amethyst_tilescrate 提供了一套完整的三维瓦片地图解决方案TileMap负责存储与读写瓦片Tiletrait 负责把瓦片坐标映射为精灵图sprite sheet中的具体精灵RenderTiles2D渲染插件负责把整张地图高效地绘制到屏幕上。读完本篇你将掌握如何在 Cargo.toml 中启用tiles功能、如何实现自定义Tile类型、如何创建TileMap组件并挂到实体上以及如何理解其底层的 Morton 编码、坐标转换与相机剔除原理。Tile 体系的三个核心角色Amethyst 的瓦片地图由三个相互协作的抽象构成这也是amethyst_tilescrate 对外暴露的核心 APITileMap存储瓦片数据的结构提供读取/修改地图的功能。它本身就是一个 ECS 组件可以直接推入世界实体。Tile一个 trait由你使用方 crate在自己的类型上实现是瓦片的数据容器与精灵解析器——渲染器通过它得知每个坐标格子上显示哪个精灵、叠加什么色调。RenderTiles2D一个渲染插件RenderPlugin负责把场景中的TileMap组件绘制出来。三者之间的关系是Tiletrait 由用户实现并作为类型参数传给TileMap与RenderTiles2DTileMap组件存放实际数据RenderTiles2D在渲染管线中消费这些数据。原文档book/src/tiles.md提示本节内容基于精灵与精灵图的知识并假设你已掌握如何加载 sprite sheet。注意本教程的代码片段只讲解创建瓦片地图的各部分要点。完整的可运行应用示例请参考 examples/tiles 示例 目录。第一步在 Cargo.toml 中启用 tiles 功能amethyst_tiles是 Amethyst 工作区内的一个独立 crate位于 amethyst_tiles/但在普通用户项目中你通常通过顶层amethystcrate 的功能开关来启用它。在项目的Cargo.toml中添加[dependencies] amethyst { version LATEST_CRATES.IO_VERSION, features [tiles] }其中LATEST_CRATES.IO_VERSION需要替换为你实际使用例如从 crates.io 查询到的 amethyst 版本号。启用后即可在代码中通过amethyst::tiles模块访问Tile、TileMap、RenderTiles2D等类型。仓库内的 examples/tiles/Cargo.toml 由于以 path 方式依赖顶层 crate使用的是features [optional]但面向普通用户的标准做法就是文档中给出的features [tiles]。第二步配置 RenderTiles2D 渲染通道瓦片地图需要一条渲染通道才能真正显示出来。在设置RenderingBundle时把RenderFlat2D与RenderTiles2D一起挂上如下所示book/src/tiles/setup.md 的原始示例use amethyst::{ core::math::Point3, ecs::World, prelude::*, renderer::{plugins::RenderFlat2D, types::DefaultBackend, RenderingBundle}, tiles::{RenderTiles2D, Tile}, }; #[derive(Clone, Default)] struct SimpleTile; impl Tile for SimpleTile { fn sprite(self, _coords: Point3u32, _: World) - Optionusize { Some(1) } } // 在 rendering bundle 的设置代码中 let game_data DispatcherBuilder::default().add_bundle( RenderingBundle::DefaultBackend::new().with_plugin(RenderFlat2D::default()), // 还需加上 RenderTiles2D 插件见下文 );为什么需要同时挂RenderFlat2D因为瓦片本质上仍是带透明度的 2D 精灵RenderFlat2D提供通用的扁平 2D 渲染能力相机、精灵等基础设施而RenderTiles2D是专门针对TileMap组件的批量绘制插件。渲染插件需要一份Tile实现我们创建SimpleTile结构体并实现Tiletrait渲染器会调用sprite方法拿到这个坐标的瓦片应该显示精灵图中的第几个精灵返回值是 sprite sheet 中的精灵索引None表示该格不渲染。这个SimpleTile之后创建TileMap时还会继续复用。在仓库的 examples/tiles/main.rs 中可以看到RenderTiles2D插件带三个类型参数的完整用法.with_plugin(RenderTiles2D:: ExampleTile, MortonEncoder, DrawTiles2DBoundsCameraCulling, ::default())三个类型参数的含义分别是瓦片类型T、坐标编码器E默认MortonEncoder2D、裁剪策略Z默认DrawTiles2DBoundsDefault后文会逐一展开。第三步创建 TileMap 组件并挂到实体在启用tiles功能、配置好渲染通道之后就可以创建TileMap组件了。前提是精灵图sprite sheet已经加载完毕代码中持有一个HandleSpriteSheet。完整示例见 book/src/tiles/create_a_tile_map.mduse amethyst::{ core::{ math::{Point3, Vector3}, transform::Transform, }, tiles::{Tile, TileMap}, }; use amethyst::{assets::Handle, prelude::*, renderer::SpriteSheet}; #[derive(Clone, Default)] struct SimpleTile; impl Tile for SimpleTile { fn sprite(self, _coords: Point3u32, _: World) - Optionusize { Some(1) } } fn init_map(world: mut World, sprite_sheet_handle: HandleSpriteSheet) { let map TileMap::SimpleTile::new( Vector3::new(10, 10, 1), // 地图的尺寸格子数宽 10、高 10、层数 1 Vector3::new(16, 16, 1), // 每个瓦片的尺寸像素16x16Z 方向取 1 Some(sprite_sheet_handle), // 这张地图使用的精灵图 ); let transform Transform::default(); world.push((map, transform)); }TileMap::new接收三个参数对应源码 amethyst_tiles/src/map.rs 的new函数dimensions: Vector3u32—— 地图尺寸即 X/Y/Z 三个方向各有多少个格子。Z 通常为 1表示单层 2D 地图也可以大于 1 构造多层地图。tile_dimensions: Vector3u32—— 单个瓦片的像素尺寸渲染时用于把瓦片精灵缩放到世界坐标空间Z 方向一般设为 1。sprite_sheet: OptionHandleSpriteSheet—— 该地图使用的精灵图句柄None表示暂不绑定之后可通过Map::set_sprite_sheet设置。创建完成后把(map, transform)元组 push 进World即可ECS 会自动为实体附加TileMap与Transform两个组件。渲染通道会查询所有带TileMap组件且未被标记Hidden的实体并逐个绘制这一步在 amethyst_tiles/src/pass.rs 中可以看到let mut query (TileMapT, E, TryReadTransform)::query().filter(!component::Hidden());源码纵深Tile trait 与 TileMap 的内部结构Tile trait 的可扩展设计Tiletrait 定义在 amethyst_tiles/src/map.rs源码中的完整签名比文档示例多出一个Resources参数并提供了默认实现pub trait Tile: static Clone Send Sync Default { fn sprite( self, coordinates: Point3u32, world: World, resources: Resources, ) - Optionusize { None } fn tint(self, coordinates: Point3u32, world: World, resources: Resources) - Srgba { Srgba::new(1.0, 1.0, 1.0, 1.0) } }sprite返回该坐标应使用的精灵索引Optionusize返回None表示此格不渲染。这正是实现动态地图的入口——例如根据世界资源里的血量、地形数据决定返回哪个精灵。tint返回该瓦片的色调Srgba默认是纯白(1.0, 1.0, 1.0, 1.0)可用来实现整格变色等效果。原文档提到tint本示例未实现即指这个可选方法。渲染时DrawTiles2D会针对裁剪区域内的每个坐标调用tile.sprite(...)与tile.tint(...)把结果组装成顶点数据见 amethyst_tiles/src/pass.rs。由于 trait 方法接收了World和Resources你的瓦片实现完全可以读取其他组件与资源实现瓦片与游戏逻辑联动的玩法。Map 与 MapStorage读写地图的抽象层TileMap之上还有两层抽象amethyst_tiles/src/map.rsMaptrait描述地图的元信息与坐标能力——tile_dimensions()、dimensions()、origin()地图原点通常为 0,0,0、set_sprite_sheet()、to_world()/to_tile()坐标互转、transform()地图坐标系变换矩阵、encode()/decode()坐标编码等。MapStorageTtrait提供按坐标读写瓦片数据的接口——get/get_mut/get_raw/get_raw_mut等。它被抽象出来是为了未来可以替换为网络、分块chunking等更丰富的底层存储。值得注意的是TileMap还实现了Assettraitamethyst_tiles/src/map.rsname()返回tiles::map意味着瓦片地图本身也是一种可被资产系统加载、序列化的资产类型。坐标编码器FlatEncoder 与 Morton 编码家族TileMapT, E的第二个类型参数E是坐标编码器CoordinateEncoderamethyst_tiles/src/lib.rs负责把三维坐标(x, y, z)压缩/展开为一维数组索引。TileMap的默认编码器是MortonEncoder2D其数据是一个扁平的一维VecTamethyst_tiles/src/map.rs创建时按allocation_size预分配并用T::default()填充amethyst_tiles/src/map.rs。仓库提供三种内置编码器各有取舍编码器内存占用空间局部性维度要求说明FlatEncoder最优无线性展平任意严格按 x y·width z·width·height 线性展平存储最省但遍历/迭代效率低amethyst_tiles/src/lib.rsMortonEncoder2D较高好X-Y 轴需为 2 的幂会向上取整每个 Z 层内部做 2D Z-order 编码各层在内存中连续amethyst_tiles/src/morton/mod.rsTileMap的默认编码器MortonEncoder较高更好需立方体各维相等且为 2 的幂真正的 3D Morton 编码空间效率最高但限制最严amethyst_tiles/src/morton/mod.rsMortonEncoder/MortonEncoder2D的实现很有意思在支持bmi2CPU 指令集时使用bitintrcrate 的pdep/pext指令直接做位交织否则回退到查表LUT实现。源码注释指出使用 BMI2 内联需要设置RUSTFLAGS-C target-featurebmi2不设置时 LUT 版本极快但略慢于 BMI2 内联amethyst_tiles/src/morton/mod.rs。为什么地图尺寸不是 2 的幂也能用 Morton 编码因为TileMap::new会把E::allocation_size(dimensions)作为分配大小而MortonEncoder2D的分配大小对 X-Y 做了pdep位扩展等价于向上取整到最近的 2 的幂amethyst_tiles/src/morton/mod.rs。对应的测试覆盖了各种非对称尺寸组合如 10×58×54、199×100×1 等见 amethyst_tiles/src/morton/mod.rs。坐标转换to_world 与 to_tileMaptrait 提供两个方向的世界坐标互转amethyst_tiles/src/map.rsto_world(Point3u32, OptionTransform) - Vector3f32瓦片坐标 → 世界坐标。内部先把 Y 轴取反瓦片坐标 Y 向下世界坐标 Y 向上再经过地图自身的transform矩阵变换如果实体带Transform组件还会继续叠加实体的全局矩阵amethyst_tiles/src/map.rs。to_tile(Vector3f32, OptionTransform) - ResultPoint3u32, TileOutOfBoundsError世界坐标 → 瓦片坐标。先用实体全局视图矩阵逆变换再用地图变换矩阵的逆矩阵换算最后对坐标取整若结果落在地图尺寸之外返回TileOutOfBoundsErroramethyst_tiles/src/map.rs。create_transform生成的地图变换矩阵把地图原点定在左上角并按瓦片尺寸缩放X 从-width/2 0.5开始Y 从height/2 - 0.5开始amethyst_tiles/src/map.rs。也就是说地图被居中放置在原点附近第一格瓦片0,0,0的世界坐标约为(-w/2·tile_w 0.5·tile_w, h/2·tile_h - 0.5·tile_h, 0)。这与源码测试tilemap_coord_conversions的断言完全吻合amethyst_tiles/src/map.rs。to_tile是鼠标拾取raycast 到瓦片的基础能力可配合TileOutOfBoundsErroramethyst_tiles/src/error.rs字段包含计算出的越界坐标与地图最大尺寸做越界处理。渲染与裁剪DrawTiles2DBounds 的两种策略RenderTiles2D内部注册了一个名为DrawTiles2D的渲染组其第三个类型参数Z: DrawTiles2DBounds决定哪些瓦片需要进入绘制批次。该 trait 只有一个方法根据地图、地图变换与GraphAuxData返回一个Regionamethyst_tiles/src/pass.rs。内置两种实现DrawTiles2DBoundsDefault返回整张地图的完整区域从 0,0,0 到地图尺寸不做任何剔除适合小地图amethyst_tiles/src/pass.rs。DrawTiles2DBoundsCameraCulling根据ActiveCamera的视锥做裁剪。实现思路是从屏幕四角发射四条射线与瓦片平面求交再把交点换算成瓦片坐标取 X/Y 的最小/最大值作为渲染区域amethyst_tiles/src/pass.rs。若没有激活相机或相机实体不存在返回空区域。它的测试用例覆盖了地图恰好占满视口地图完全离屏地图大于视口地图缩放/旋转等多种情形amethyst_tiles/src/pass.rsexamples/tiles示例即采用此策略。拿到区域后prepare阶段会遍历区域内每个坐标通过tile.sprite()过滤掉返回None的格子把剩下的组装成TileArgs顶点数据精灵 UV 偏移、色调、瓦片坐标见 amethyst_tiles/src/pod.rs并按纹理分组插入批处理队列每个TileMap实体的投影/视图/地图变换矩阵则以TileMapArgsuniform 形式上传amethyst_tiles/src/pod.rs。绘制时按纹理绑定、以TriangleStrip图元一次draw(0..4, ...)画出一个瓦片四边形amethyst_tiles/src/pass.rs。整个过程会做变更检测只有地图数据或纹理变化时才重建顶点缓冲change.prepare_result(index, changed)。透明排序的注意事项DrawTiles2D的文档注释明确警告amethyst_tiles/src/pass.rs由于透明与 Z 排序的处理方式TileMap实体必须从Z 轴朝上Z-up的视角观察透明才能正确排序如果从底部仰视会出现透明排序错乱。简单说就是相机必须向下俯视瓦片。同时渲染组在RenderOrder::BeforeTransparent阶段绘制amethyst_tiles/src/pass.rs确保瓦片位于普通透明精灵之后、由透明管线统一排序。实战参考examples/tiles 完整示例examples/tiles 是本节配套的完整可运行示例展示了amethyst_tiles的全部能力建议作为阅读与实验的第一手资料。它的结构如下main.rs应用入口。on_start中加载两张精灵图——圆形精灵图texture/Circle_Spritesheet.png.ron用于玩家与参照物cp437_20x20.png320×32016×16 网格见 texture/cp437_20x20.ron用于地图瓦片。map_movement.rs演示如何通过系统运行时操纵TileMap实体——按Y切换自动旋转、按T切换自动平移通过Transform的rotate_2d/prepend_translation实现系统查询(TileMapExampleTile, MortonEncoder, mut Transform)。draw_selection.rs演示鼠标框选——把鼠标屏幕坐标经Camera::screen_to_world_point转成世界坐标再用DebugLinesComponent画出选择框。config/input.ron输入绑定配置定义了相机移动WASD/RF、缩放QE、相机 2D/3D 切换Space、选择鼠标左键与两个切换动作Y/T。README.md完整操作说明按键列表见下。示例的控制方式汇总来自 examples/tiles/README.md按键功能WASD在 X/Y 轴移动相机RF在 Z 轴移动相机QE改变相机缩放Space在 2D / 3D 相机间切换Y切换瓦片地图的自动旋转T切换瓦片地图的自动平移示例中TileMap的创建examples/tiles/main.rslet map TileMap::ExampleTile, MortonEncoder::new( Vector3::new(48, 48, 1), // 48x48 格、单层 Vector3::new(20, 20, 1), // 每格 20x20 像素对应 cp437_20x20 精灵图 Some(map_sprite_sheet_handle), ); world.push((map, Transform::default()));与文档示例不同的是它显式选用了MortonEncoder立方体维度 48 2^4·3实际分配按 2 的幂处理和相机裁剪策略。运行cargo run --example tiles或进入该目录cargo run即可观察瓦片地图在旋转、平移、缩放与相机切换下的渲染效果。常见误区与实用提示地图尺寸与 Morton 编码默认编码器MortonEncoder2D要求 X-Y 维度在分配时向上取整到 2 的幂MortonEncoder则要求各维相等的立方体尺寸。若地图尺寸过大encode在 debug 模式下会断言坐标超出u32可编码范围amethyst_tiles/src/morton/mod.rs。Z 尺寸取 1Map::tile_dimensions的文档特别提醒Z 方向的尺寸会被计入缩放变换因此二维地图务必把瓦片 Z 尺寸设为 1amethyst_tiles/src/map.rs。相机必须俯视透明排序要求从 Z 轴正方向俯视瓦片平面否则透明层次会错乱。sprite()返回None即挖空返回None的格子不会进入绘制批次这是实现地图空洞、动态开关格子的标准手段。地图数据修改会触发重建通过MapStorage::get_mut修改瓦片会递增地图的versionamethyst_tiles/src/map.rs渲染端据此检测变化并重建顶点数据只读访问则用get_mut_nochange避免误触发版本号增长。至此从启用tiles功能、挂载RenderTiles2D渲染插件、实现自定义Tile、创建并操纵TileMap到理解底层坐标编码与相机剔除原理你已经掌握了在 Amethyst 中构建瓦片地图的完整链路。下一步可以结合 book/src/tiles/setup.md 与 book/src/tiles/create_a_tile_map.md 两份原文档反复对照并在 examples/tiles 示例上动手修改瓦片精灵与尺寸验证坐标换算是否符合预期。赞分享【免费下载链接】amethystData-oriented and>项目地址https://gitcode.com/gh_mirrors/ame/amethyst点击查看免费下载相关推荐OpenLayers 自定义地图瓦片实现从数据处理到前端渲染OpenLayers 自定义地图瓦片实现从数据处理到前端渲染 引言为什么需要自定义地图瓦片 在地理信息系统GIS开发中地图瓦片Tile是提升地图前端GIS数据可视化用 deck.gl 的 TileLayer BitmapLayer 构建 OpenStreetMap 瓦片地图应用map-tile 示例全解用 deck.gl 的 TileLayer BitmapLayer 构建 OpenStreetMap 瓦片地图应用map tile 示例全解 本文以 dAI 应用提示工程人工智能前端如何快速开发自定义渲染通道PyTorch3D渲染器插件完全指南如何快速开发自定义渲染通道PyTorch3D渲染器插件完全指南 PyTorch3D是Facebook AI Research开发的深度学习3D数据处理库提供人工智能深度学习计算机视觉图形学上一篇网易云音乐自动打卡项目常见问题解决方案下一篇CDial-GPT 项目常见问题解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
蛋白互作经典技术|核酵母双杂交原理与实验要点 一、技术原理酵母双杂交(核系统)是经典的胞内蛋白 - 蛋白相互作用筛选验证技术,核心依托酵母转录因子 GAL4 的结构特点:GAL4 包含两个独立功能结构域 ——DNA 结合域 BD(DNA-binding domain) 和转录激活域 … · 2026/9/27 7:29:00
极简交互的减法艺术:如何通过移除 3 个冗余配置让留存翻倍 极简交互的减法艺术:如何通过移除 3 个冗余配置让留存翻倍在软件产品设计的进化史上,开发者和产品经理最容易陷入的一个致命陷阱是:“试图通过不断在【设置页面】里增加开关,来讨好每一个提出小众需求的用户”。
在最初的版本中&a… · 2026/9/27 8:06:09
wordpress导航调用分类哪家好?防黑挂马与SEO实战指南 wordpress导航调用分类哪家好?防黑挂马与SEO实战指南 网站被黑挂马,后台却查不出原因?这时候选wordpress导航调用分类哪家好,其实是个伪命题。真正的救命稻草,是你是否掌握了正确的调用逻辑,以及底层服务器的安全加固。很多老板一… · 2026/9/27 8:06:03
3步搞定网站中加入地图导航,一文搞懂避坑指南 3步搞定网站中加入地图导航,一文搞懂避坑指南 网站被黑挂马不知道怎么办?别慌,这往往是网站结构松散、缺乏安全防护的征兆。很多站长发现页面出现乱七八糟的弹窗或外链时,第一反应是删代码,但根源可能在于你之前为了省事,在 网站中加入地图导航… · 2026/9/27 8:06:03
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现 简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01
汕头网站建设制作厂家避坑指南:5大注意事项救急 汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习 简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01