我想制作一款2d塔防游戏。我目前有一个使用XNA制作的C#版本,但认为学习Qt以及在其他平台上运行我的游戏可能会很有趣。图形不是太强烈(只有2d精灵),但基础计算可以得到非常强大的处理器,特别是如果屏幕上同时有很多敌人和塔。
如果Qt能够很好地填补这个角色,我有点好奇。有没有人在游戏开发中使用Qt有经验或建议?
答案 0 :(得分:87)
我已经花了十多年的时间在各种基于C ++的2D和3D游戏上开发了大量和小型的不同引擎。我也有一个短暂但相当激烈的Qt5运行(1.5年 at the写作时间)。到目前为止,Qt已经把我所有整齐堆叠的跨平台和性能特点让我感到震惊,所以我计划在时间允许的情况下将我最大的游戏项目移植到Qt。
说实话,我对Qt在游戏中不是更普遍的原因感到有点困惑。我认为主要原因在于其相当歪曲的许可历史以及它尚未在游戏中销售的事实。 Qt毕竟主要是针对来自嵌入式和更高版本的许多平台上的跨平台UI +实时图形的ace。现在digia接手并且使用新的QML / QtQuick功能可能会很快出现基于Qt的游戏,谁知道呢?我当然希望更多游戏开发者能够发现Qt并开始在他们的项目中使用它。
要回答您的问题,我会尝试将Qt的产品与不同类型游戏的需求相匹配。
在传统的Qt中,存在不同的图形抽象。对于一些较小的嵌入式平台,它只能依赖于简单的2D子系统。但对于大多数桌面平台(Windows / MacOSX / Linux)和移动平台(Android / OSX)而言,2D抽象整齐地位于基于OpenGL或OpenGL ES的高性能3D堆栈之上。
这是一个真正的宝石,并且由于经过深思熟虑的架构,您可以选择想要接近图形编程的高低级别,从而使图形编程变得更加快乐。
有许多课程可以让你像往常一样使用众所周知的概念,如颜色,线条粗细和形状,同时知道它将在引擎盖下全部加速。
http://doc.qt.io/qt-5/graphicsview.html
http://doc.qt.io/qt-5/coordsys.html
然后有全新的东西" QtQuick"或" QML"。一种声明性语言与java脚本一起提供了最快捷,最简单的方法来消除我在这个星球上所知道的交互式UI和游戏。在我设法用5行代码制作完整的钢琴键后,在15分钟内我卖掉了。
http://doc.qt.io/qt-5/qtquick-index.html
编辑23 / 2-17更正确。请参阅S.O.本节中更改内容的历史记录。
传统上,Qt与OpenGL有着非常强大的联系,而且由于OpenGL在各种平台上都具有可移植性和性能,因此这种绑定具有服务器Qt。然而,随着人们认识到OpenGL正在展示它的年龄,以及在微软平台上与DirectX的可比性以及潜伏在不久的将来潜伏的新技术的出现,Digia已经做出明智的战略举措到pre-preemptively generalizing the hardware abstraction layer对图形硬件。所以现在Qt必然会受到OpenGL的限制,但很快就会支持许多其他的图形抽象,让你作为游戏开发者获得巨大的好处。
在我们等待的时候,Qt中也没有任何东西可以阻止你在微软平台上使用DX和Qt。 Qt竭尽全力不干扰任何平台上的其他库,因此它可以与许多其他工具包和引擎一起使用,你甚至可以通过直接暴露Qt的OpenGL上下文在Qt中嵌入基于OpenGL的游戏引擎。对于使用Qt移植到两个值得注意的移动平台的游戏,保持相同的代码库将更加简单,没有DX。
但是,除了管理VBO,FBO,加载纹理和着色器等OpenGL特色功能的所有便利类之外,在Qt的任何地方都没有完整的3D引擎。
更新2016-01-29:自从我第一次写这个答案以来,我开始注意到在Qt中提供了一个成熟的3D引擎。它被称为Qt3D 2.0,它是旧版Qt3D的完全重写,它是Qt4.x的一部分,由于政治原因(诺基亚抛弃了Qt),它只是一个版本的一部分被删除。
它具有一系列令人印象深刻的功能,并且在它的API中有很多好的想法,以确保它可以充分发挥现代图形硬件的潜力,同时保持灵活性和高性能。另一个好消息是技术预览。这意味着你今天可以尝试一下,它将很快成为主线Qt的一部分。您可以阅读更多相关信息here。
作为3D堆栈的一部分,Qt有一整套性能数学例程,如矩阵,向量,四元数,点,矩形等。
常见的stl数学函数,如sqrt,floor,sin等也包含在平台无关层中。
http://doc.qt.io/qt-5/qtmath.html
不支持高级数学,如全面的物理引擎,碰撞检测或响应。
为此您可能对此感兴趣:
https://github.com/junggon/gear
Qt拥有一个完全成熟的资源管理系统,可以将资源编译到二进制文件中。这是跨平台的,支持您需要的任何文件类型,特别支持常见的图像格式,svg,声音,字体,HTML,CSS。加载和使用资源非常简单,因为所有Qt的文件handlign orutines都接受指向这些资源的URL。真棒。
GUI代码是Qt的强项。它有很好的GUI工具,对于一些小型2D游戏来说,它实际上可以用作关卡编辑器。
更新2016-01-29:这是Qt与平台无关的核心价值观的一部分。 Qt支持主要的桌面平台,主要的移动平台和一堆你从未听说过的嵌入式硬件。请参阅社区支持(免费/开源)平台here的官方列表。它允许您将大部分未更改的代码库带到您喜欢的所有平台,从而在您决定制作" iOS版本时节省大量时间,金钱和精力。
Qt以跨平台的方式包装了所有平台集成。这包括:
Qt具有使用状态机的完整框架。除此之外,还有一个完整的动画属性框架,可用于在2D中制作交互式UI(如果您正确地演奏卡片,甚至可以使用3D)。它具有您期望的所有内容,如缓和,自动状态转换以及大量便利包装和执行内容的方式。它就像使用jQuery但在C ++中一样。对于某些游戏,这就是你所需要的。
http://doc.qt.io/qt-5/qtquick-statesanimations-animations.html
Qt有一堆类似STL的容器类,其扩展可以容纳Qt特定的功能。这些类包括从列表到映射到数组和缓冲区的所有内容。
http://doc.qt.io/qt-5/containers.html
Qt的弦乐课程是我最喜欢的语言课程。它有它的怪癖,但它为你提供了大量的性能和功能,和往常一样,它与所有它的朋友一起跨平台:
http://doc.qt.io/qt-5/string-processing.html
整个Qt框架是围绕基于事件循环的异步架构实现的,其中轻量级事件称为"信号"。
http://doc.qt.io/qt-5/qtqml-syntax-signals.html
Qt支持从低级线程,通过托管线程池到现代map-reduce和"期货"的多级并发性。它还具有跨平台的高性能锁定机制,如静音,锁定,等待条件,无锁定的东西,原子操作以及其他一些我还没有机会查看的东西。
http://doc.qt.io/qt-5/examples-threadandconcurrent.html
当然,Qt支持适合所有这些的定时器,具有很多便利功能,如调整精度,触发单发等。
http://doc.qt.io/qt-5/timers.html
触摸屏,鼠标和键盘的输入是使用事件架构处理的,Qt确实把它包裹在一个篮子里。 Qt刚刚(23 / 2-17)获得experimental support for joysticks and gamepads。
http://doc.qt.io/qt-5/eventsandfilters.html
还支持位置,压力,指南针,旋转,温度等传感器,因此您也可以制作永不克隆的克隆。
http://doc.qt.io/qt-5/qtsensors-index.html
支持蓝牙连接和共享游戏数据,无需访问无线网络。
http://doc.qt.io/qt-5/qtbluetooth-index.html
并且在游戏中可以使用相机支持你想要使用的任何东西。
http://doc.qt.io/qt-5/cameraoverview.html
所有跨平台。
Qt将嵌入式高性能ECMA(a.k.a. java脚本)引擎绑定到其核心。哦,如果你需要的话,你还可以获得一个紧密嵌入的谷歌网络套件端口。
http://doc.qt.io/qt-5/qtscript-index.html
Qt包装gstreamer和其他媒体库,以支持播放视频和声音等媒体。它允许开发人员选择他们想要与媒体交互的级别。在高级别上,您可以放置一个小部件并在低级别运行.play(),您可以访问视频和音频缓冲区,以获得处理乐趣。
http://doc.qt.io/qt-5/multimediaoverview.html
根据活动的后端Qt,您还可以访问将流编码到网络/磁盘等。
我从哪里开始?
这个清单真的一直在继续...在这里看看你自己:
http://doc.qt.io/qt-5/classes.html
通过使用具有所有高级功能的ICU开箱即用的国际化,例如文本小部件中的RTL支持等。
http://doc.qt.io/qt-5/internationalization.html
Qt有一个插件架构。这意味着您可以将可执行文件拆分为多个位并单独更新它们,在运行时动态重新加载每个位。
http://doc.qt.io/qt-5/plugins-howto.html
Qt有自己独立的单元测试框架。这篇文章有点长,所以我不会详细介绍。
http://doc.qt.io/qt-5/qttest-index.html
Qt拥有非常好的文档,并且不断改进。如果你点击了我已经知道的一些链接。
Qt首次在1995发布,因此需要很长时间才能稳定下来。它有一套大量的回归测试,在每次发布之前运行,并在一堆编译器,平台和设备上进行全面测试。出于某种原因,这不是许多游戏开发者列表的首选。
http://en.wikipedia.org/wiki/List_of_Qt_releases
对于大多数Qt PRO来说,事实证明这是一个很长的帖子,但我认为这是在测试之前判断平台所需要的。祝你的项目好运!
答案 1 :(得分:8)
名为Rift的新Big MMORPG实际上是通过使用Qt + DirectX完成的。这至少对我来说是我发现的第一个用Qt创建的大型游戏。当然还有DirectX背后,不是什么大惊喜。太糟糕了,因为Qt本身就是多平台而DirectX不是。
裂谷主页: http://eu.riftgame.com/en/
所以肯定去吧,Qt对于任何开发来说都是非常好的平台。
答案 2 :(得分:8)
Felgo(felgo.com)是一款基于Qt / QML的跨平台游戏引擎,具有许多有用的自定义Felgo QML游戏组件,可用于处理多种显示分辨率&纵横比,动画,粒子,物理,寻路等等。 API reference。 引擎核心是用原生C ++编写的,结合自定义渲染器,游戏在所有设备上都能达到60fps的稳定性能。
Squaby是一款使用Felgo制作的塔防游戏,其完整源代码可在此处找到:Squaby source code
答案 3 :(得分:2)
我有信心可以。我正在研发自己的2D游戏引擎SDXM,Saelee Deus Ex Machine,纯Qt。我没有任何实质性的下载支持我的索赔,但我正在进行测试。
以下是我记录的一些实际测试:
3000个非用户控制的+ 1个用户控制的精灵 http://youtu.be/AHdhg3Nw88w
真实3D QTransform的F-Zero型游戏 http://youtu.be/KuTBzhBqU4Y
*使用Phonon实现音频演示
所以很有可能为SNES制作类似游戏的东西。
答案 4 :(得分:-2)
我是Qt的忠实粉丝,我觉得编程很有趣。它主要关注的是UI,而不是图形。它确实有图像痛苦的支持,甚至动画支持,但我不确定那些适合游戏的那些 - 我似乎记得在我弄乱它们时的闪烁问题,虽然那是几年前...
如果你真的想用Qt做图形,那么真正合法的方法就是使用OpenGL。 Qt通过QtOpenGL提供了出色的OpenGL支持(只是QGLWidget的子类,你大部分都在那里),但是你需要知道OpenGL - 而且OpenGL没有最用户友好的API,没有siree ..
另一方面,有SDL。它是用C语言编写的,但由于它可以在C ++中使用,并且还有许多其他绑定。它有一个类似于Qt的事件循环(真正的“精简”版本),整体上简单得多。它的重点是基于精灵的图形,所以它应该比你习惯的更接近OpenGL。它也是跨平台的。但它在用户界面上并没有那么好。
如果你想要一个超级漂亮的UI(按钮,文件菜单等,就像桌面应用程序一样),请使用Qt。如果您只想将几个键绑定到函数并直接使用图形,请使用SDL。
对于两者中的初学者,我想我建议从SDL开始 - 它更容易进入并开始。最后,我会说转向Qt + OpenGL,因为它们比SDL同行更强大,但确实是一个陡峭的学习曲线,试图同时选择两者。你会从SDL那里得到一些提示和技巧,这将让你在路上一路走来。