【问题标题】:2D (or 3D) Graphics Programming using Windows API with C++?使用带有 C++ 的 Windows API 进行 2D(或 3D)图形编程?
【发布时间】:2013-11-08 22:40:48
【问题描述】:

我即将开始我的大学课程单元项目。我希望用 C++ 制作一些有点像小行星的东西,复古的 2D 游戏。

我可以使用 SFML 之类的东西来做到这一点,这当然看起来是合乎逻辑的事情。但是我不能使用 SFML,因为默认情况下这些库在 Windows 上不可用。

要求是我的 c++ 代码必须复制并粘贴到任何 Windows PC(已安装 Visual Studio)上,然后从 Visual Studio 编译/运行。

我以前从未使用过 Windows API,但是我觉得我可以使用它来打开一个窗口并在窗口中绘制一些 2d 图形。我对么?基本上这就是我需要做的所有事情:打开一个窗口,然后在上面画一些线。

这不是“你能为我做作业吗”类型的问题。如果这是我需要的工具,请有人指出我开始使用 WinAPI 的正确方向,如果不是,我可以使用其他东西吗?某种 OpenGL 库呢? OpenGL 2.0 或类似库是否与 Visual Studio 捆绑在一起?

(如果它很重要,我认为我们正在使用 VS 2010。)

大家好,

【问题讨论】:

  • Ogre-3D 有一个 C++ API。

标签: c++ windows winapi graphics 2d


【解决方案1】:

您可以打开一个窗口,创建某种画布并在其上绘制,但我不知道这是由软件还是硬件渲染的。在你的情况下,如果它是一个非常小的游戏,你可能不需要硬件渲染。

但是,如果您想通过DirectX 进行硬件渲染,您可以尝试Mircrosoft XNA Game Studios 4.0,订阅 DreamSpark 的大学免费提供。

【讨论】:

  • 这是一个需要安装的附加组件,还是 Visual Studio 安装“附带”的?
  • 我看到您进行了编辑 - 我预计可能会以 30FPS 或类似的速度绘制 100 条线?可能我不需要硬件渲染?
  • 是的,你安装了框架,之后新建项目的时候,可以选择new XNA game之类的。
  • 啊,那可能是不允许的。 :(
  • @Edward Bird 100 行 30fps 可以在没有硬件渲染的情况下完成。我猜你毕竟不需要它。
【解决方案2】:

本教程仅涵盖创建图形 Win32 应用程序所需的一切:

http://www.winprog.org/tutorial/

【讨论】:

    【解决方案3】:

    请注意,一些旧版本的 Visual Studio Express 无法编译 Windows 应用程序,除非安装了 windows sdk。如果您的 Visual Studio 安装是这种情况,那么您将无法按照您列出的要求制作任何图形。

    请有人指出我开始使用 WinAPI 的正确方向

    Sure.

    要求是我的 c++ 代码必须复制并粘贴到任何 Windows PC(已安装 Visual Studio)上,然后从 Visual Studio 编译/运行。

    您知道,您可以简单地将您使用的任何库的代码包含到您的项目中。因为像 libsdl 这样的项目使用许可许可证,所以您可以这样做。不过,不确定这是否会违反您的“规则”。

    使用默认的 Visual Studio 安装,您不会得到太多。您绝对可以使用纯 winapi 创建一个窗口并在其上绘制一些东西。使用 SetDIBitsToDevice 之类的东西,您可以轻松地自己完成完整的软件渲染。

    高级 OpenGL 功能需要包装库(如 GLEW),但您可以自己初始化扩展和高级功能。 Quake3 引擎做到了,所以你可以这样做。

    使用 DirectX 很可能是没有问题的,因为它通常需要安装 SDK。您可以将所需的库/头文件复制/粘贴到项目的子目录中,但话又说回来,尚不清楚这是否会违反“规则”。

    OpenGL 2.0 或类似的库是否与 Visual Studio 捆绑在一起?

    默认 OpenGL 标头支持 1.1 版或类似版本。但是,您可以使用wglGetProcAddress 自己加载缺失的函数。您也可以在代码中自己声明缺失的常量。值不值,那就另当别论了。

    底线:

    如果您想要完整的软件渲染,请使用 winapi 创建窗口,为“屏幕”(RGB 格式)分配 2d 缓冲区,并使用 SetDIBitsToDevice 或 StretchDIBitsToDevice 在每一帧将其 blit 到窗口上。如果 Windows 标头可用,那么它几乎可以在任何地方工作和编译。

    您也可以尝试使用GDI routines 来绘制线条等,但我不确定这对游戏的效果如何。我已经有一段时间没有使用 GDI 了,但我认为如果你不小心的话,你会得到明显的闪烁。

    如果您需要高级功能(例如,对于某些人来说,编写可以绘制带纹理的三角形或可以旋转二维精灵的软件渲染例程会很困难),请考虑使用 OpenGL 并使用 wglGetProcAddress 加载缺失的函数。但是,如果您的大学(出于某种原因)拥有陈旧(或有故障)的硬件,您可能希望将自己限制为使用旧版本的 OpenGL(OpenGL 1.1)。原因是 OpenGL 1.1 由软件 OpenGL 渲染器支持,如果使用硬件加速出现某种问题,则会启用该渲染器。

    【讨论】:

    • Microsoft 提供了基于 GDI 构建的 OpenGL 1.1 参考实现,可用于任何未安装硬件 ICD 的系统。我无法想象有人教 OpenGL 1.0,它甚至没有纹理对象:-\
    • @AndonM.Coleman:我知道 1.0 不支持纹理,我只是忘记了 GL windows 的默认版本以防万一——1.0 带有纹理作为扩展(或其他东西)或 1.1。我遇到了一个问题(几次),因为未知原因,OpenGL 无法使用硬件加速进行初始化。从来没有想过那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多