【免费下载链接】amethystData-oriented and>项目地址https://gitcode.com/gh_mirrors/ame/amethyst点击查看免费下载本篇技术指南围绕 Amethyst 游戏引擎Rust 编写的数据驱动游戏引擎的amethyst_tiles模块展开讲解如何启用tilesfeature、配置RenderTiles2D渲染通道、实现Tile特征并最终创建TileMap组件挂载到实体上。读完本文你将掌握从零搭建一个可渲染的 2D 瓦片地图的完整链路并理解其底层的数据结构与坐标变换原理可直接对照仓库中的 tiles 示例 进行实战演练。前置准备启用 tiles feature 与渲染通道瓦片地图是一组包含精灵sprite的瓦片的集合在 Amethyst 中主要由两个核心概念承载见 tiles 章节导读TileMap存储瓦片的结构提供读取/修改地图的能力Tile单个瓦片的容器携带精灵编号与渲染信息。在创建瓦片地图之前需要完成两步前置配置。若尚未完成请先阅读 Setup 文档 并对照 sprite 章节 掌握精灵图集的加载方式。第一步在 Cargo.toml 中安装 tiles feature在依赖项中为amethyst开启tiles特性[dependencies] amethyst { version LATEST_CRATES.IO_VERSION, features [tiles] }其中LATEST_CRATES.IO_VERSION需要替换为你实际使用的 Amethyst 版本号。当前仓库的 根 Cargo.toml 将amethyst_tiles列为工作区成员并挂在amethyst的tilesfeature 下因此只要开启该 feature即可通过amethyst::tiles::{Tile, TileMap, RenderTiles2D}引用相关类型。第二步注册 RenderTiles2D 渲染插件在渲染 bundle 的构建处加入RenderTiles2D插件。由于渲染插件需要知道如何为每个瓦片取精灵编号你必须先定义一个实现了Tile特征的类型# extern crate amethyst; 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) } } # fn main() - Result(), amethyst::Error { # let game_data DispatcherBuilder::default().add_bundle( // 在你的渲染 bundle 设置内部 RenderingBundle::DefaultBackend::new().with_plugin(RenderFlat2D::default()), # ); # Ok(()) # }注意在真实代码中你需要以RenderTiles2D::SimpleTile, MortonEncoder, DrawTiles2DBoundsCameraCulling::default()的形式注册瓦片渲染插件。渲染插件需要Tile实现因此我们创建SimpleTile结构体并实现Tile特征为渲染器提供精灵编号sprite number与着色tint本例未实现。这个瓦片类型稍后创建瓦片地图时还会继续使用。深入理解 Tile 特征渲染数据的提供者Tile是amethyst_tiles中的核心特征定义于 map.rs。从源码看它要求实现类型满足static Clone Send Sync Default并提供两个带默认实现的方法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给定瓦片坐标Point3u32返回该瓦片在精灵图集中的索引。返回None表示该位置不渲染任何瓦片——这是实现空瓦片/透明格的天然入口tint返回瓦片着色默认是白色Srgba::new(1.0, 1.0, 1.0, 1.0)即不做任何染色。通过返回值可以对整张地图实现昼夜、区域高亮等效果。渲染通道在 pass.rs 的prepare阶段逐格调用这两个方法先取tile.sprite(coord, world, resources)若为Some则连同tile.tint(...)一起打包成TileArgs提交渲染。因此你的Tile实现完全掌握每个瓦片画什么、什么颜色的决定权。创建 TileMap 组件并挂载到实体完成上述两步后即可创建TileMap组件并添加到实体上。前提是精灵图集SpriteSheet已经加载完成下面的示例假设已持有图集句柄。完整代码示例# extern crate amethyst; use 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) # } # } # pub fn load_sprite_sheet() - HandleSpriteSheet { # unimplemented!(); # } #[derive(Debug)] struct ExampleState; impl SimpleState for ExampleState { fn on_start(mut self, mut data: StateData_, GameData) { # let world data.world; let sprite_sheet_handle load_sprite_sheet(); // ... init_map(world, sprite_sheet_handle.clone()) } } fn init_map(world: mut World, sprite_sheet_handle: HandleSpriteSheet) { let map TileMap::SimpleTile::new( Vector3::new(10, 10, 1), // 地图的尺寸宽、高、层数 Vector3::new(16, 16, 1), // 每个瓦片的尺寸像素 Some(sprite_sheet_handle), ); let transform Transform::default(); world.push((map, transform)); } # fn main() {}三个关键参数的含义TileMap::new的签名定义于 map.rs三个参数分别是参数类型含义示例取值dimensionsVector3u32地图整体尺寸即多少列 × 多少行 × 多少层Vector3::new(10, 10, 1)tile_dimensionsVector3u32单个瓦片的世界坐标尺寸通常等于瓦片精灵的像素尺寸Z 轴尺寸参与世界坐标换算一般设为 1Vector3::new(16, 16, 1)sprite_sheetOptionHandleSpriteSheet地图使用的精灵图集句柄传None则地图不渲染任何内容Some(sprite_sheet_handle)从源码看TileMap::new内部还会完成三件事以Point3::new(0.0, 0.0, 0.0)初始化原点调用create_transform基于地图与瓦片尺寸生成Matrix4坐标变换矩阵按编码器所需大小分配VecT存储并用T::default()填充每个瓦片槽位。也就是说创建完成后整张地图的所有瓦片都已初始化为Tile的默认实例后续可通过get_mut按坐标改写。坐标编码器地图存储的空间组织方式TileMap的完整类型签名是TileMapT: Tile, E: CoordinateEncoder MortonEncoder2D见 map.rs第二个泛型参数是坐标编码器它决定三维坐标如何映射到一维数组下标。所有编码器都实现CoordinateEncoder特征定义于 lib.rs提供from_dimensions、encode、decode与allocation_size四个方法。引擎内置三种编码器可在 lib.rs 与 morton/mod.rs 中查看实现MortonEncoder2D默认允许任意尺寸的 X、Y、Z 坐标同时对每个 Z 层做空间分区是通用场景的默认选择MortonEncoder要求接近立方的地图尺寸但 Z 序编码的空间效率更高。在支持 BMI2 指令的 CPU 上会走pdep硬件指令路径否则回退到查表LUT实现FlatEncoder最简单的线性展开编码encode即(z * dim.x * dim.y) (y * dim.x) x存储空间最优但遍历与迭代效率较低。Morton 编码的核心价值在于空间局部性相邻瓦片在一维数组中的下标也彼此邻近从而提升遍历与缓存命中率。在示例代码中需要同时使用TileMap与RenderTiles2D指定一致的编码器类型例如let map TileMap::ExampleTile, MortonEncoder::new( Vector3::new(48, 48, 1), Vector3::new(20, 20, 1), Some(map_sprite_sheet_handle), );渲染插件与视锥裁剪RenderTiles2D 的三层泛型RenderTiles2D的定义pass.rs同样带三个泛型参数pub struct RenderTiles2D T: Tile, E: CoordinateEncoder MortonEncoder2D, Z: DrawTiles2DBounds DrawTiles2DBoundsDefault, { ... }第三个泛型Z: DrawTiles2DBounds决定瓦片渲染的裁剪culling策略内置两种实现DrawTiles2DBoundsDefault不做裁剪直接返回整张地图的包围区域适合小地图DrawTiles2DBoundsCameraCulling基于活动相机做视锥裁剪。其实现pass.rs会从屏幕四个角各发射一条射线与瓦片平面求交得到瓦片坐标再用最小/最大坐标圈定可见Region若不存在活动相机则返回空区域。该策略对 48×48 以上的大地图收益明显仓库 pass.rs 的测试用例 覆盖了相机完全覆盖、地图离屏、地图大于视口、地图缩放与旋转等多种场景。实际注册时写法如下摘自 tiles 示例 main.rsdispatcher.add_bundle( RenderingBundle::DefaultBackend::new() .with_plugin( RenderToWindow::from_config_path(display_config_path)?.with_clear(ClearColor { float32: [0.34, 0.36, 0.52, 1.0], }), ) .with_plugin(RenderDebugLines::default()) .with_plugin(RenderFlat2D::default()) .with_plugin(RenderTiles2D:: ExampleTile, MortonEncoder, DrawTiles2DBoundsCameraCulling, ::default()), );渲染管线在on_plan阶段将瓦片通道注册为RenderOrder::BeforeTransparentpass.rs并使用预编译的 tiles.vert.spv 与 tiles.frag.spv 着色器。文档源码注释还提示了一个重要约束由于透明与 Z 排序机制相机必须以 Z-up 视角俯视瓦片地图从底部仰视会产生透明度排序问题。坐标换算瓦片坐标与世界坐标的双向转换Map特征map.rs提供了to_world与to_tile两个坐标换算方法这在拾取点击选中瓦片、地图移动等交互场景中至关重要to_world(coord, map_transform)将瓦片坐标Point3u32转换为 Amethyst 世界坐标Vector3f32to_tile(coord, map_transform)将世界坐标反向换算为瓦片坐标越界时返回TileOutOfBoundsError。其底层逻辑map.rs基于TileMap::new时生成的变换矩阵create_transform会把地图平移到以中心为原点half_dimensions并按tile_dimensions做非均匀缩放to_world内部对 y 坐标取负世界坐标系 y 轴朝上与瓦片行号方向相反若实体带Transform还会继续叠加全局矩阵to_tile则执行逆变换并做四舍五入与越界检查。仓库 map.rs 的坐标换算测试 验证了这些换算的往返一致性例如 64×64×64 地图、瓦片 10×10×1 时瓦片(0,0,0)对应世界坐标(-315.0, 315.0, 0.0)(0,1,0)对应(-315.0, 305.0, 0.0)——每移动一行 y 坐标减少 10一个瓦片高与y 轴翻转的约定吻合。运行官方示例tiles 演示程序仓库提供了完整的可运行示例位于 examples/tiles 目录其 README 说明了操作方式。该示例展示了amethyst_tilescrate 的全部能力加载两张精灵图集Circle_Spritesheet与cp437_20x20后者在 cp437_20x20.ron 中定义为 320×320 纹理、16×16 网格分割的 256 格图集创建 48×48 的瓦片地图并叠加调试线条DebugLinesComponent绘制选择框。运行方式cargo run --example tiles --features optional程序支持以下交互对照 tiles 示例 README按键功能WASD在 x/y 轴移动相机R/F在 z 轴移动相机Q/E改变缩放Space在 2D 与 3D 相机之间切换Y切换瓦片地图的自动旋转T切换瓦片地图的自动平移示例还配套了五个系统systems 目录相机移动、2D/3D 相机切换、地图移动、以及基于坐标换算的绘制选区。其中地图移动系统通过修改TileMap实体的Transform来驱动整张地图位移选区绘制则借助to_tile将鼠标位置换算为瓦片坐标是坐标换算 API 的典型实战用例。小结在 Amethyst 中创建一张瓦片地图的完整链路可以概括为四步启用 feature在Cargo.toml中开启amethyst { features [tiles] }注册渲染插件实现Tile特征至少提供sprite并用RenderTiles2D::T, E, Z::default()加入RenderingBundle为地图选择合适的编码器与裁剪策略创建组件TileMap::T, E::new(dimensions, tile_dimensions, Some(sprite_sheet))生成地图组件配合Transform一起world.push到实体交互增强利用to_world/to_tile实现瓦片拾取与坐标换算必要时通过get_mut按坐标动态改写瓦片数据修改会递增内部version以驱动变更检测。完整的端到端代码请直接阅读 examples/tiles/main.rs 以及 create_a_tile_map.md 与 setup.md 两份官方文档。赞分享【免费下载链接】amethystData-oriented and>项目地址https://gitcode.com/gh_mirrors/ame/amethyst点击查看免费下载相关推荐Amethyst 瓦片地图Tile Map开发指南从 RenderTiles2D 渲染通道到自定义 Tile 实现Amethyst 瓦片地图Tile Map开发指南从 RenderTiles2D 渲染通道到自定义 Tile 实现 瓦片地图是 2D 游戏中最常见的地图组cleanlab 开源数据质量库实战指南自动检测标签错误与数据问题在噪声数据上训练鲁棒 ML 模型cleanlab 开源数据质量库实战指南自动检测标签错误与数据问题在噪声数据上训练鲁棒 ML 模型 本文是 cleanlab 开源项目数据为中心的 AI瓦片地图系统完全指南React Game Kit TileMap组件深度使用瓦片地图系统完全指南React Game Kit TileMap组件深度使用 React Game Kit是一个强大的组件库专门用于使用React和Reac游戏开发前端上一篇ExoPlayer DRM性能测试测量加密对性能的影响下一篇BongoCat窗口焦点跟随鼠标设置X11特定功能配置创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
AutoBangumi 解析器配置指南:RSS 标题解析引擎、语言与全局过滤规则 后端前端音视频 【免费下载链接】Auto_Bangumi AutoBangumi - 全自动追番工具 项目地址: https://gitcode.com/gh_mirrors/au/Auto_Bangumi 点击查看 免费下载 AutoBangumi 的解析器(Parser)负责从 RSS 条目标题中抽取结构化的番剧元数据&am… · 2026/9/27 7:57:21
换机照片怎么迁移才靠谱?6种方案对比,原图与备份一次讲清 换手机时,照片迁移最需要关注的不是单纯的“速度”,而是文件有没有完整过去、原始信息有没有变化,以及迁移完成后有没有备用副本。如果只有几百张照片,手机直连通常就能解决;但面对几千甚至上万张照片,尤其… · 2026/9/27 7:57:21
Woodpecker Kubernetes 后端:在 Kubernetes 集群中运行 CI 管道的完整指南 CI/CDDevOps 【免费下载链接】woodpecker Woodpecker is a simple, yet powerful CI/CD engine with great extensibility. 项目地址: https://gitcode.com/gh_mirrors/wo/woodpecker 点击查看 免费下载 Woodpecker 的 Kubernetes(K8s)后端将… · 2026/9/27 7:57:08
重保前的 Web 自查渗透(六):API 接口未授权与签名重放漏洞闭环 重保前的 Web 自查渗透(六):API 接口未授权与签名重放漏洞闭环在重保与大促前夕的外部暴露面排查中,传统的 SQL 注入与文件上传漏洞因 WAF 和参数化框架的普及已大幅减少。相反,业务逻辑层面的“API 未授权访问&#x… · 2026/9/27 8:44:40
TradingAgents-CN 15 分钟跑起来:从 Docker 部署到第一份股票分析报告 TradingAgents-CN 15 分钟跑起来:从 Docker 部署到第一份股票分析报告 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN
TradingAgents… · 2026/9/27 8:44:40
湛江网站建设产品优化哪家好?3个技巧搞定域名服务器难题 湛江网站建设产品优化哪家好?3个技巧搞定域名服务器难题 刚接手湛江本地的一个官网项目,客户一开口就问:“你们建站哪家好?怎么我的网站打不开,是不是服务器挂了?”别急,这是90%老板和运营都踩过的坑。域名解析没配好,服务器防火墙没放行,或者S… · 2026/9/27 8:44:39
Laya-CoreML 贪吃蛇实战:本地Core ML模型实时决策的终端AI游戏完全指南 Laya-CoreML 贪吃蛇实战:本地Core ML模型实时决策的终端AI游戏完全指南 【免费下载链接】laya-coreml Local Laya typed decisions on Apple Core ML and Neural Engine. Validated ports, ~5 ms short decisions on M3 Max, reproducible speed and energy benchma… · 2026/9/27 8:44:33
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