#gamedev #bevy #map-editor

bin+lib hill_vacuum

基于 bevy 的 2D 地图编辑器

18 个版本 (4 个破坏性更新)

新版本 0.6.5 2024 年 8 月 24 日
0.6.4 2024 年 8 月 22 日
0.5.0 2024 年 8 月 8 日
0.4.2 2024 年 8 月 4 日
0.2.8 2024 年 6 月 24 日

#47游戏开发

Download history 337/week @ 2024-06-22 96/week @ 2024-06-29 273/week @ 2024-07-06 98/week @ 2024-07-13 141/week @ 2024-07-20 392/week @ 2024-07-27 242/week @ 2024-08-03 258/week @ 2024-08-10 368/week @ 2024-08-17

每月下载量 1,263

MIT/Apache

2MB
51K SLoC

License

什么是山式真空泵?

HillVacuum 是一个受到 Doom BuilderTrenchBroom 启发的编辑器,它通过操作凸多边形、放置物品和实体以及纹理映射,允许创建二维地图。

为什么是山式真空泵?

  • 我想学习 Rust;
  • 我想创建自己的编辑器;
  • 我厌倦了手动在文本文件中输入碰撞多边形的坐标。

山式真空泵是如何实现的?

对于那些不介意阅读的人来说,HV 拥有一份说明书,可以通过以下三种方式参考:

  • MANUAL.md 文件;
  • MANUAL.pdf 文件;
  • 编辑器内置的 Manual 窗口,可以通过键盘组合 Ctrl+` 打开。

对于其他人,这里有一个 视频

hv_1 hv_2

关键词

刷子

刷子是一个凸多边形的表面。它可以有一个相关的纹理,这个纹理可以填充其表面或作为精灵。精灵可以独立于刷子的表面移动。
刷子也可以分配一个路径,描述它在二维空间中的移动方式,并且可以使用路径工具进行编辑。
最后,刷子有一个内置属性,collision,它决定它们是否应该表示一个裁剪表面。它可以在属性窗口中编辑。

事物

事物是在地图周围可以放置的对象。它由一个 ID、宽度、高度、名称以及代表它的纹理来表征。
事物也可以分配一个路径,描述它在二维空间中的移动方式,并且可以使用路径工具进行编辑。
事物可以定义在一个或多个 .ini 文件中,放置在 assets/things/ 文件夹中,或者如果 HillVacuum 被用作库,则实现表示要放置在地图中的对象的结构的 MapThing 接口,并使用 hardcoded_things 宏将它们插入 bevy App。
如果在 .ini 文件中定义,事物必须遵循类似的格式

[Name]
width = N
height = M
id = ID
preview = TEX

其中 ID 是一个介于 0 和 65534 之间的唯一标识符,而 TEX 是要绘制在边界框上的纹理名称(不带文件扩展名)。
如果分配给物品的纹理具有动画,则会相应地绘制纹理。

如果通过 MapThing 接口定义的物品与从文件加载的物品具有相同的 ID,则后者将覆盖前者。
最后,物品有两个内置属性,angledraw height。绘制在物品顶部箭头的方向将根据 angle 的值改变,而 draw height 决定其绘制顺序。它们可以在属性窗口中进行编辑。

可以通过选项菜单中的 UI 按钮在应用程序运行时重新加载物品。

属性

属性是自定义的用户定义值,可以与刷子和物品关联。
这些值可以通过指定属性的 namedefault_value 对的 brush_propertiesthing_properties 宏来插入。
可以使用属性窗口按实体编辑属性。
目前支持的价值类型有 boolu8u16u32u64u128i8i16i32i64i128f32f64String

!!! 如果保存的地图包含与上述资源中定义的属性类型和/或名称不同的属性,则在尝试加载 .hv 文件时,屏幕上将出现警告窗口,询问您是否要使用应用程序或地图的属性。

纹理

要加载,纹理必须放置在 assets/textures/ 文件夹中。
可以在任何时间打开纹理编辑器来编辑所选刷子的纹理属性。
实体、缩放和旋转工具也具备纹理编辑功能。这些功能可以通过左下角的专用 "目标" UI 元素启用,或者通过按 Alt + 纹理编辑器快捷键
纹理可以关联一个动画,该动画可以是显示的纹理列表,每个纹理持续特定时间,或者通过将纹理分割成子区域生成的纹理图集。动画可以默认应用于纹理,或仅应用于所选刷子的纹理。
在编辑列表类型动画时,可以通过单击它来添加纹理。
要编辑非所选刷子纹理的动画,需要用鼠标右键单击。

可以通过选项菜单中的 UI 按钮在应用程序运行时重新加载纹理。
默认纹理动画可以在地图文件之间导出和导入。动画文件的扩展名为.anms

道具

道具是一组可以像图像编辑工具中的画笔一样绘制在地图周围的实体。
每个道具都有一个支点,这是将其绘制到地图上的相对点。
道具可以在地图文件之间导入和导出。道具文件的扩展名为.prps

路径

路径是一系列节点,描述了拥有它的实体如何在地图周围随时间移动。
节点有五个可自定义的参数

  • Standby:实体在开始移动到下一个节点之前静止的时间量;
  • Min speed:实体移动的最小速度;
  • Max speed:实体达到的最大速度;
  • Accel (%):实体从最小速度加速到最大速度所花费的距离百分比;
  • Decel (%):实体从最大速度减速到最小速度所花费的距离百分比。
    最大速度不能低于最小速度,也不能为0。加速度和减速度的百分比最多为100%。加速度阶段总是先于减速度阶段。
    路径可以有重叠的节点。然而,两个连续的节点不能重叠。重叠的节点在工具提示中清晰地显示。因此,强烈建议保留它们。

网格

地图网格可以倾斜和/或旋转,以给地图一种等距的外观。这两个参数可以在设置窗口中编辑。

文件

HV创建了三种类型的文件,它们相对都比较简单

  • .hv是地图文件;
-------------------------------
| Version number              |
-------------------------------
| Header                      |
| brushes amount              |
| things amount               |
| animations amount           |
| props amount                |
-------------------------------
| Grid settings (skew, angle) |
-------------------------------
| Animations                  |
-------------------------------
| Brushes default properties  |
-------------------------------
| Things default properties   |
-------------------------------
| Brushes                     |
-------------------------------
| Things                      |
-------------------------------
| Props                       |
-------------------------------
  • .anms是“仅动画”文件,可以用于在地图之间交换动画;
-------------------------------
| Version number              |
-------------------------------
| animations amount (usize)   |
-------------------------------
| Animations                  |
-------------------------------
  • .prps是“仅道具”文件,可以用于在地图之间交换道具。
-------------------------------
| Version number              |
-------------------------------
| props amount (usize)        |
-------------------------------
| Props                       |
-------------------------------

入门

HV可以通过简单地编译源代码编译成一个独立可执行文件(Linux发行版可能需要安装额外的库)。

cargo run

否则,它可以集成到您的项目中,如下所示

fn main()
{
    bevy::app::App::new()
        .add_plugins(hill_vacuum::HillVacuumPlugin)
        .run();
}

地图文件可以通过Exporter结构读取,该结构将返回所有画笔和事物的列表,然后可以按需导出。假设地图文件的路径作为参数传递给了导出可执行文件,则代码将类似于以下内容

fn main()
{
    let exporter = hill_vacuum::Exporter::new(&std::env::args().collect::<Vec<_>>()[0]);
    // Your code.
}

正在编辑的地图可以通过编辑器中的文件->导出命令通过这样的可执行文件导出。可执行文件可以通过选项->导出选择。

功能

  • arena_alloc:启用使用竞技场分配器进行快速分配。需要夜间编译器;
  • dynamic_linking:启用同名的bevy功能;
  • ui:启用HillVacuumPlugin和因此UI编辑器。默认启用,建议在创建用于使用Exporter结构导出地图的可执行文件时将其关闭。

!! 警告

我所真正知道的一件事,将会存在错误。
HV 已经经过彻底测试,但仍然处于早期版本,因此可能存在导致崩溃的不可恢复错误。强烈建议经常保存。

杂项

为了通过键盘关闭编辑器窗口,需要按下 F4 键(类似于按下 Alt+F4 关闭操作系统窗口)。

常见问题解答

是 "vertices",不是 "vertexes"。

首先,https://dictionary.cambridge.org/dictionary/english/vertexes
最后,如果流行文化教给我们任何东西,那就是 'c's 不是极端的

实际上,如果你读过 "Rust 编程语言" 这本书,它清楚地写道:"将开括号放在函数声明同一行上是一种良好的风格,在它们之间添加一个空格。"

互联网上有很多关于尊重彼此差异的讨论,这是理所当然的。所以,如果人们能尊重我的这个差异,我将不胜感激。

依赖项

~6–48MB
~824K SLoC