#ui #gamedev #ggez #text-image #game #static-ui

mooeye

基于ggez游戏库的小型UI库。正在开发中

7个版本

0.4.1 2023年7月31日
0.4.0 2023年7月20日
0.3.2 2023年7月17日
0.3.1 2023年6月30日
0.2.1 2023年4月10日

#909 in 游戏开发

每月44次下载

MIT许可证

255KB
2.5K SLoC

摩眼 - 基于 ggez 的 UI 库

Docs Status license Crates.io Crates.io

这是一个建立在 ggez 游戏库之上的非常简单的 UI 库。最初是为我的个人 Rust 游戏开发项目编写的。

UI 功能

  • 静态 UI,通过基于消息的系统进行自我通信。
  • 可以使用 ggez 图像和文本对象作为 UI 元素。
  • 可以在多种类型的框、对齐方式和动态大小中排列元素。
  • 可以为元素添加工具提示。
  • 元素位置缓存意味着只有当窗口大小或 UI 元素本身更改时,才需要重新计算动态元素位置。
  • 在运行时通过转换系统更改 UI 的布局、外观和内容。对于结构的大幅更改,建议重新构建整个 UI(类似于即时 UI 每帧重建)。
  • 基于消息的通信,与内部(用户点击按钮)和外部(游戏中的资源数量发生变化)来源进行通信。消息通过可自定义的消息处理程序在内部处理,允许您根据用户交互或游戏状态变化更改 UI 的外观和内容。所有内部消息也都会从顶层 UI 元素的消息处理函数返回,允许游戏状态对用户输入做出反应。
  • 通过添加和删除元素来动态更改 UiGraph,甚至在初始化后也是如此。

附加功能

  • 基于堆栈的场景管理器通过处理主游戏状态的变化和(堆叠的)场景的适当绘制,显著简化了在单个游戏中处理多个场景的工作。
  • Sprite 结构自动绘制具有多个变体(例如攻击、行走...角色)的动画精灵,并可以从单个精灵图集中加载。
  • Sprite pool 结构使批量加载和格式化精灵更加方便。

维护

我主要为了自己的目的维护这个项目,并且是由我一个人维护的。更新可能间隔较远,但摩眼目前处于一个非常可用的状态。

如何使用

UI

在使用MooEye时,您的游戏状态结构应该包含一个 gui: UiElement<T>。使用任何容器初始化此值,并创建一个表示UI状态的UIElement树。在此步骤中,您还通过消息处理器转换定义UI与用户和游戏状态的交互。

在每一帧,您希望在您的绘制函数中调用gui.draw_to_screen()来绘制UI。 T 是您外部消息的类型。收集您想要在UI中表示的游戏状态中的所有更改,并在游戏循环的更新步骤中使用 gui.manage_messages() 将它们传递给UI。然后,您的消息处理器将接收这些消息并适当地更改UI(对于较大的更改,您也可以完全重建UI而不是编写巨大的处理器)。gui.manage_messages() 将返回一组内部消息,告知您用户已点击的按钮。这样,您的游戏状态可以反过来对UI的交互做出反应。

此外,您的更新函数可以通过调用gui.add_elements()gui.remove_elements() 来与您的UI交互,根据它们的id添加和删除元素,并更改您的整个UI布局。

有关更详细的信息和示例,请参阅文档示例文件夹中的示例。

动态尺寸规则

以下规则指导了MooEye中元素尝试调整尺寸的方式。

外部边界

  • 任何元素都将始终保持在由其 layout::size 给定的边界内。
  • 如果调用 draw_to_rectangle 的矩形太小,则元素将不会显示(但可能仍然消耗空间)。
  • 如果给定的矩形在边界内,则元素将根据 layout::size 调整器适应它。
  • 如果给定的矩形太大,则元素不会超出其 layout::size,而是根据其 layout::alignment 对齐。

内部边界

  • 额外的尺寸要求可能不是由 layout 提供的,而是由元素的 content 提供的。在这里,上限将被(目前)忽略,但元素在调整其尺寸时会尽量尊重下限。这些内容边界主要用于使容器遵守其子元素的空间要求。
  • 如果边界对于这个内容限制来说太小,元素仍然会调整自身以适应边界,并相应地处理这种尺寸限制。例如,容器可能会给其子元素提供过小的矩形,导致其中一些元素无法按照上述方式显示。
  • 如果边界对于这个内容限制来说太大,元素仍然会调整自身以适应边界,并相应地处理不需要的空间。例如,容器可能会给其子元素提供过大的矩形,导致它们的行为如上所述。

保留比例

如果元素的 layout 中的 preserve_ratio 标志设置为 true,则它们只会在 layout::size 的下限比例下显示其内容。它们的背景将正常绘制,然后元素将在拉伸的维度上缩小,以适应这个背景。

场景管理器

创建和使用 场景管理器 与实现 Scene 而不是 Event Handler,并通过 SceneManager::new_and_run 而不是 event::run 启动游戏一样简单。

有关SceneManager的使用示例,请参阅示例文件夹

精灵

可以使用与任何 ggez-Image 一样的方式使用路径创建精灵,但可以显示对象的动画和多个状态。请参阅精灵文档中的相应部分。

源图像文件需要包含每个动画周期不同帧的水平对齐,不同状态形成行。

请参阅示例文件夹中的相关示例,以了解Sprite的使用。

可以使用 SpritePool 加载整个精灵文件夹,从而不需要重复访问文件系统。

许可证

MIT 许可证

依赖关系

~29–66MB
~1M SLoC