【问题标题】:Qt library for 2D/3D game development用于 2D/3D 游戏开发的 Qt 库
【发布时间】:2012-06-04 09:15:44
【问题描述】:

作为一种爱好,我一直致力于改造一款旧视频游戏,并且我希望尽可能避免重新发明轮子。该游戏在很大程度上基于 GUI,但 GUI 需要在外观方面进行自定义,并且还需要为一些游戏屏幕使用 3D OpenGL 渲染。

为了给你一个想法,这里是最初原型的截图:

使用了很多动画,也使用了 3D,但 GUI 小部件的行为与标准桌面应用程序中的行为非常相似。

到目前为止,我一直在使用我自己的 GUI 库(它不健壮或不完整,而且我遇到了一些问题)。

鉴于 Qt 的声誉和令人印象深刻的功能,以及 Qt 网站上的一些漂亮的屏幕截图,我一直在考虑迁移到 Qt。但我以前从未使用过 Qt,所以我真的不知道它有什么能力,或者学习它需要投入什么样的时间。 (注意我用过 FLTK)。

我的问题是:在这种情况下使用 Qt 是否可行/可行?

更新:在 Qt 中模拟了一些游戏画面后,我决定不使用它。虽然它支持我需要的许多开箱即用的功能(特别是通过样式表),但我需要支持自定义的基于位图的预渲染字体(我无法转换/替换它们)。而且我不能继承 QFont,或者重新实现它而不破坏它在未来的 Qt 版本中。也就是说,Qt 给我留下了深刻的印象(无论是在易用性方面,还是在良好的文档方面)。我将为我自己的引擎借用它的一些功能。感谢所有提供意见的人。

【问题讨论】:

  • 简单的答案是肯定的,在这种情况下使用 Qt 是可能的/实用的。为了获得更有效的答案,您可以考虑提出更详细的问题,或者列出您可能对 Qt 有的一些疑问。
  • 看看QGraphicsView/QGraphicsScene架构,应该和你想要的差不多。
  • 谢谢大家。好吧,我从来没有使用过 Qt,所以我主要担心的是花了很多时间学习它,发现它不能做我需要的事情。 QGraphicsView 类似乎支持我需要的一些功能。我需要的另一个示例功能是非矩形按钮,例如带有倾斜边缘(我现有的代码使用图像掩码来接受/拒绝鼠标事件)。 Qt 会轻易允许这样的壮举吗?
  • 我会编写自定义绘制事件而不是使用 QGraphicsView。把这可能是个人意见。对于非矩形按钮,将它们处理为矩形就“足够好”了(在我看来)。但是仍然可以应用与使用单色图像作为“事件过滤器掩码”相同的想法。你必须自己写,但应该没那么难。
  • 谢谢,我想我会选择 Qt。我做了更多调查,看起来 Qt 实际上会为我简化事情。例如, QWidget::setMask() 将为非矩形小部件解决问题。我现在要开始在诺基亚网站上观看培训视频了。

标签: c++ qt


【解决方案1】:

根据截图很难知道你的游戏需要做什么;但是,我将在这里呼应其他海报的观点,并提供一些途径供您查看。

第一,您可能想要考虑 QtQuick 而不是 GraphicsView 框架,但这真的取决于您需要做什么。我只是想把它扔在那里作为替代品,这样你就不会错过它。这个tutorial 使用QtQuick 组合了一个看起来非常漂亮的连接四种风格的游戏。这可能比您想要的更简单,但话又说回来,也许不是,这取决于您需要做什么。

其次,在为所有按钮编写自定义绘制事件之前,我会考虑使用Qt Style Sheets 并以类似 CSS 的语法设置小部件的样式。这将允许您以非常灵活的方式非常快速地更改 GUI 的外观和感觉。根据你的截图,我认为你可以从样式表中得到你想要的东西,这比继承和滚动你自己的设置要快得多。但是再一次,根据一张截图很难知道。 Here 是仅使用 Qt 样式表实现的深色和橙色 GUI 示例。 QPushButton 样式表的 border-radius 属性将为您提供圆形按钮 (ref)。

【讨论】:

  • 是的,我已经偶然发现了样式表。 'border-image' 属性似乎提供了我需要的大部分主题功能,因为我主要对所有内容使用预渲染图像(希望它也可以做动画?)。这将特别有用,因为游戏支持多个可玩的帝国,每个帝国都有不同的外观。关于圆形按钮,图像已经是圆形的,我只想将鼠标单击限制在该区域。 QWidget::setMask() 会做到这一点。我会看看 QtQuick。
  • 是的,但是对于样式表,您的按钮似乎不需要 图像,对吗?您可以编写样式,然后对 UI 进行更改/修改(至少在按钮方面)要容易得多。再说一次,我不知道你的工作流程,所以肯定做最适合你的事情。如果您想知道使用动画属性(a la CSS),我认为您不会使用 Qt 样式表来获得它。据我所知,您将不得不使用图形视图框架或动画框架(和/或两者的某种组合)来获得好的动画。祝你好运!
【解决方案2】:

上面已经给出了简单的答案,但要多思考一下:是的,有可能,您可能不需要过多地与 Qt 作斗争。在大多数情况下,对于像这样的高度定制的小部件的推荐建议是子类并自己实现绘制事件。

然后,您可以使用大量基本绘图图元来获取元素的基本形状并从那里扩展。实际上,这里有几个问题以及有关如何做到这一点的非常好的资源。

【讨论】:

  • 是的,我就是这么想的。从我在 API 中看到的内容来看,将小部件子类化以获得我想要的确切外观非常容易,例如通过覆盖 QButton::drawButton() 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 2016-06-22
相关资源
最近更新 更多