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次下载
255KB
2.5K SLoC
摩眼 - 基于 ggez 的 UI 库
这是一个建立在 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