一段时间以来,我一直想在C++和DirectX 9中创建自己的GUI"库"。我看到了很多关于GUI的问题,但我想要的是一个特定于游戏的GUI。大多数库都非常复杂,非常通用,它们支持命令行解析和窗口创建等。这些库不适合我的需求,所以我想自己写。唯一的问题是我不知道从哪里开始。
我不知道如何为图书馆建立一个框架/基础。我不知道如何使GUI元素/对象相互通信,也不知道如何处理事件。我也不知道如何管理GUI的图形。例如,我是让程序员全权负责GUI的外观,还是创建默认设计?然后,我是否为按钮、文本框、标签、组合框等的设计存储一个单独的文件。?
我还想指出,我计划只在全屏模式下使用GUI,我只想支持按钮、文本框、静态标签等基本元素。我希望能够使用库创建HUD。我知道我在问很多问题,但我从未尝试过创造如此复杂的东西。
如果您对所有这些都一无所知,我建议您不要从头开始编写自己的GUI。(事实上,我确实从头开始编写了自己的游戏GUI,我有点后悔——我最终得到的有点半生不熟,我相信还有更好的选择。)
但我明白你的意思:你不想使用标准的GUI工具包,因为那样它就不会"感觉"像一个游戏。好消息是,现有的GUI工具包是专门为游戏设计的。最流行的似乎是CEGUI(疯狂的埃迪的GUI系统)。正如你从他们的网站上看到的那样,它看起来很难看,根本不像Windows应用程序。
我还没有用过,但我建议你在设计自己的之前先研究一下。
编写自己的gui将是一项很好的教育任务,因为您很快就必须学习用于使其可扩展的设计模式。如果你感兴趣,GoF的书使用GUI作为许多模式的示例。
然而,做好这件事是一项艰巨的任务(我指的是你生命中的几年)。
然而,你可能感兴趣的一个项目是cIMG库。这是一个图像处理库,而不是gui库。它不支持按钮或任何类似的功能,但它确实进行了相当低级别的绘制,这可能更接近您的最终目标(它不会将其成像外包给gui/图形库)。它也是一个只有头的库,所有代码都在一个头文件中,因此很容易查看。
我不同意这里表达的其他意见。(背景:我在大学学习CS,我已经编程了30年。)
你可以编写自己的GUI系统,如果你知道自己在做什么,你可以在不到2周的时间内完成。即使是一个编程初学者。我认为"如何编写GUI系统"是一门失传的知识,导致人们认为编写GUI系统需要数年时间。
我建议(我承认这是少数人的报告)在你的努力中提出以下战略要点:
- 忘记设计模式、体系结构、总线通信系统和可扩展性等等。对于这样一个简单的问题,你绝对不需要它们。如果你追求这些,你的大脑将生活在你根本没有的问题中。不要做任何面向对象的事情。这棵树完全不适合你所做的事情
- 追求极简主义;在这里你真的不能太极端。避免每一种并非绝对必要的抽象。想想你设计中的个别电线,想想"什么需要和什么说话"的绝对最低限度。你真的需要总线系统吗?或者您可以只添加一行执行通知吗?仔细想想,你能让通知根本不需要它吗?从另一个角度来看:你的游戏真的需要点击和拖动窗口吗?等等,10次中有9次是"你不需要它",还有另一种更简单的方法。找到这些更简单的方式就像找到GUI设计的欺骗代码一样
- 从头开始思考。根据GUI系统需要支持的内容,在纸面上设计最终的用户界面。看看你说的:"只有全屏模式,按钮,文本框,静态标签,等等……一个带库的HUD。"这超级不复杂。你完全可以做到这一点,成本低廉,而且你会更快乐,因为你会有完美的控制
- 使用数据。让数据讲述用户界面的外观和工作原理。你能在代码中用可打印的ASCII字符绘制窗口和布局并以此进行渲染吗
- 控制API到绘图系统(即DirectX)的表示法。使用"ESC"表示转义键的键代码,使用"SPC"表示空格键。使用包装器使API更加方便。让它映射到你正在做的基本操作:flip()、line(x,y,x2,y2)、color(BLACK)等等
- 使用位图并使其易于在API中访问。stamp(iconid,x,y)就是你想让它变得多么愚蠢,在一个位置画一个图标。请注意,这不是:window.stamp(icon.imgdata,translated_coordinate(cursorpos))
- 注意你的输入轮询和绘图翻转系统。这是你引擎的核心。如果你有交互模式,那也是核心
- 考虑使用元/信息平面来表示位置和坐标以及点击。您可以使用网格来表示布局,极大地简化了GUI的工作。当用户点击空间时,信息计划可以包含关于正在点击的内容的信息
我只用500行Python(使用pysdl2)编写了非常复杂的GUI环境。这包括我的包装器。我还用C++编写了GUI系统——它需要更多的代码行,但实际上并没有那么多。
我绝对100%建议您为自己的工作编写自己的GUI系统。对于当代主流编程思想,你必须"跳出框框",但你所能达到的控制水平是令人难以置信的解放——不仅在你的游戏工作中,而且在所有涉及与用户交互的编程领域中。
如果你想脱离主流,可以考虑阅读Alan Kay、Chuck Moore或任何一位年长的程序员。当他们做他们所做的事情时,他们并没有被这种想法所感染,即"你必须使用别人在你之前写的东西,因为别人在你需要什么和如何制造东西方面比你更聪明,如果你走上他们的路,你只会重蹈他们的覆辙"。他们对"什么有效"的看法与当代对什么有效的看法截然不同。我鼓励这种探索。
对于这个问题,已经有许多成熟的解决方案,如定制游戏的Scaleform和Unity等游戏引擎中的集成gui API,更不用说之前许多经验丰富的开发人员的Flotsam和jetsam了:
http://www.google.com/search?q=game+gui+库
考虑到你承认的经验不足和你提议的内容的冗余,我认为你明智的做法是选择更小、更有用的东西。