制作可爱的菜单从来不是我的问题;问题在于缺少“活力”。因此,在我的最新项目中,我着手创建了一套模块化菜单系统,通过通用工具包实现令人满足、类似玩具的交互体验。这经历了大量原型设计和重构,但现在所有菜单都归结为可复用于任何GUI元素的几个系统:
文本: 震动、弹出或生成浮动数字,可选颜色叠加。主要用于数量变化时。
图标: 一个“闪光”着色器以自定义间隔划过图标。用于吸引注意力或指示稀有度。
按钮: 共享一个内置了所有状态的按钮。这使得所有按钮拥有统一的外观和手感,无需额外接线。一个单独的九宫格精灵(可拉伸的框架)通过不同色彩处理绘制每个按钮,甚至适用于菜单面板。
缓动与缩放: 元素以平滑曲线滑入、放大或缩小、淡出,面板仅通过九宫格系统缩放。所有菜单动画由此而来。
事件: 一种粒子爆发效果,接受数量、寿命、速度、摩擦力和颜色参数。根据稀有度或重要性使用不同参数触发。此外还有其他可替换的粒子效果(喷泉、吸入、上升星光)。
一个规则统治一切:仅限像素完美。我不希望出现任何混叠像素,因此任何元素都不允许落在亚像素位置,你也不会看到通过粗暴缩放来增大物体。工具包中的每个系统都会将最终坐标四舍五入为整数像素。无法干净缩放的内容则通过滑动或淡出来处理。这听起来可能限制很多,但却是保持像素粗粝感的关键。当所有效果都只是坐标、透明度、九宫格拉伸或着色器时,它们永远不会相互冲突。
实现模块化的关键
效果的实现并非关键;关键在于菜单本身运行在统一系统上。从标题画面到HUD再到工作坊,它们都基于相同的基础数据构建:一个条目列表,每个条目描述其内容、位置和按下时的行为。一个共享系统读取该列表,处理所有界面的导航、高亮和点击。内容会变化,但处理方式不变。
这正是“任何菜单都能使用它”这一设计得以保证的原因。同样的模式在绘制层面重复:所有内容都通过一组共享的基本元素路由。一个按钮绘制,一个图标绘制,一个高亮,一个闪光。活力存在于这些构建块内部,因此当某个界面绘制图标时,它会自动获得闪光和拾取动画,无需手动添加任何效果。
一个值得借鉴的技巧
永远不要动画化真实数字!你需要操控时间轴为数字变化增添趣味,但又不希望创建部分交易完成的边界情况。当玩家消费或赚取货币时,立即完成交易并保存。向玩家展示并动画化的,是一个追逐真实值的独立显示数字。扣款立即下降,但收款会延迟到揭示动画完成才显示,从而在正确时机呈现收益。关键是确保庆祝/成就/解锁的时机基于虚拟数字。
这项工作永无止境
几乎所有设计都不是预先完成的。好吧,我确实尝试过模块化构建,但实际上每个界面最初都是独立的孤岛。共享系统是后来在整合阶段才引入的,移除了大量一次性绘制函数。经过多次重构后,通用工具包才在全游戏中完全采用。
这已成为整个项目的节奏:原型一个新界面,创建必要的自定义组件,然后发现它真正需要的形态,再重构并融入工具包。工作坊的庆祝时机直接借鉴了得分界面,之后我才将其通用化。“NEW”徽章最初只是高分高亮,后来成为任何界面都能调用的功能。
这个过程仍在继续——我的待办清单上还有多个目标。设置菜单需要采用标签系统,所有武器卡牌侧边栏需要转变为水平轮播。但我已经接受这是过程的一部分。另一种选择是预先猜测所有未来需求,而这只会让我陷入瘫痪!
这是一个使用GameMaker开发的独立项目。我上一个作品是2018年在Steam发布的《KITE》,这是它的精神续作。欢迎在评论区深入探讨实现细节!
评论 (0)