65.9K
CodeProject 正在变化。 阅读更多。
Home

设计一个支持Windows 8的跨平台3D应用程序引擎

starIconstarIconstarIconstarIconstarIcon

5.00/5 (7投票s)

2012年10月13日

Apache

6分钟阅读

viewsIcon

33235

如何使用 OpenGL 及相关技术编写一款面向移动和桌面平台的应用程序。

引言

您好,我是一位有点痴迷于跨平台开发的爱好者。我喜欢在业余时间编写应用和游戏,以支持尽可能多的不同平台。在本文中,我将向您介绍我编写的跨平台 3D 应用引擎,我通常会基于它来开发我的应用和游戏。然后,我将解释该代码是如何架构以同时支持移动和桌面平台的。通过这样做,您应该能够复用该引擎,或者在创建自己的面向多个平台的应用或游戏时,能够获得灵感来尽可能多地复用代码。

该引擎当前维护的版本可在 https://github.com/playir/2c. 找到。

使用该代码库的一个示例 3D Facebook 照片库应用程序可在
https://github.com/playir/SocialPoetry.

找到。我之前也为本网站写过一篇关于将一款名为 Phone Wars 的 3D 游戏移植到 Intel x86 Android 平台的文章,该游戏也使用了该引擎,文章和源代码可在此处找到:https://codeproject.org.cn/Articles/448748/3D-Cross-Platform-3rd-Person-Shooter-To-Intel-x86.

应用创新大赛

本文是参加 Ultrabook 应用创新大赛 的参赛作品,我计划将我的三款应用和游戏移植并发布到 Intel AppUp 商店。如果有兴趣,我很乐意撰写后续文章,解释该引擎是如何移植以支持 Windows 8 平台,以及代码是如何构建以支持更多 Ultrabook 功能(如陀螺仪和触摸屏交互)的。

在本节中,我将描述我计划移植的应用和游戏,以及我希望用于改进它们的 Ultrabook 功能。

FacePlayer - 最初名为 FaceStalker,这款应用会浏览您的 Facebook 照片库并缓存所有照片。它还允许您以 精美的 3D 效果 浏览照片。源代码(Apache 2 许可证)可在此处获取,支持 iOS、Android、Windows 和 Mac。我计划为 Windows 8 Ultrabook 版本添加一些陀螺仪和触摸屏支持。

iGrapher 3D - 3D 股市可视化工具。我几年前最初创建它时是一个 Web 应用,但当我拿到 iPhone 后,我将其移植到了 iOS,效果 非常酷炫的 3D。然后当我拿到 Android 后,我又将引擎移植到了 该平台。我只想为 Windows 8 Ultrabook 版本添加一些陀螺仪和触摸屏支持。

Phone Wars - 这是一款在线 MMO 射击游戏,有三个版本:Phone WarsTank LegendsFood Fighters。Android 和 iOS 演示版本的源代码 可在此处获取。同样,我很想为 Windows 8 Ultrabook 版本添加陀螺仪传感器和触摸屏支持。

背景

我给这个引擎命名为 2c 是有几个原因的。第一个原因来自于创建包含 3D 游戏元素的应用程序的挑战。这类应用的麻烦在于,用户交互往往会受到 3D 投影提供的无约束相机角度的影响。文本不易阅读,而移动和用户交互的动作可能会显得不自然。最好的解决方案是尽量限制应用程序的 3D 程度,但利用 3D 来获得性能提升,以及用于我们今天所熟知的移动操作系统所启发的附加价值的过渡和动画。因此,结果是,即使它仍然在使用 3D,它也在试图隐藏 3D 可能带来的潜在疯狂,它更像是 3D-1 = (3-1)(D-1) = ( 2c )。

第二个,也许更酷的原因是,如果你说 2c,它听起来就像 "to see"(去看),这强调了创造您想看的应用和游戏的愿景。
(好吧,免责声明,我是一个有点过于深思熟虑的人,所以这些原因可能会显得有些奇怪。)

源代码是用 C++ 编写的,可以通过不同的 IDE 加载不同平台。

Android 版本使用 Eclipse IDE 来导入 Android、App、Engine 和 External 项目。

PC、Mac、Linux 版本使用 Qt IDE 和框架,其项目文件可在 _Qt/Project_ 文件夹中找到。

iOS 版本使用 xCode IDE,其项目文件可在 _iOS_ 文件夹中找到。

源代码的结构包含包装器,以实现跨平台功能。其工作方式是提供设备级代码、引擎级代码和应用级代码。

在这里,我们可以看到,我们可以将特定于 iOS 和 Qt 的渲染器和控制系统抽象到我们自己的引擎渲染器和控件结构中,而这些可以从我们编写的特定于应用的的代码中使用。

例如,如果我们以加载着色器的渲染操作为例,并深入代码库,我们会发现。在引擎级渲染器 _CCRenderer.h_ 中。

我们发现一个名为 loadShader(CCShader *shader); 的纯虚函数。

在 Qt 版本中,我们发现一个名为 CCDeviceRenderer 的继承类,它使用 Qt 库工具来实现着色器的加载,这些工具建立在 OpenGL 和 Windows/Linux/Mac 文件系统之上。

在 iOS 版本中,我们发现一个名为 CCDeviceRenderer 的继承类,它使用 Objective C、OpenGL ES 和 iOS 特定库来实现加载。

其他系统也以这种方式被包装,例如,CCFileManager 处理文件系统操作,CCURLManager 处理 HTTP 连接。

由于大部分代码都写在引擎层,并且只调用引擎包装函数中的函数,因此应用特定层中的大部分代码库都可以编写成跨平台运行。但是,在某些情况下,我们可能需要根据特定情况区分我们的平台。为此,我们定义了关键字(#IOS、#ANDROID、#QT)来标识我们正在运行的平台。

Using the Code

以 iOS 版本为例,如果您进入 _Dev/iOS_ 文件夹并用 xCode 加载 _2c.xcodeproj_。_SceneSample1.cpp_ 文件将是实验的最佳起点。

在这里,我们继承自 CCSceneAppUI,它提供了摄像头和触摸控件,使我们能够在一个世界中创建对象,当使用多点触控时,该世界会与 3D 机制进行列表视图交互。

构造函数创建了我们的 3D 应用摄像头,并将其设置为使用我们整个屏幕。

当场景被添加到引擎的更新和渲染循环中时,引擎会调用 setup 函数。它使用了 CCTile3DButton 类,这是一个 3D 按钮块,允许插入文本和图像,并以 3D 方式渲染自身,提供来自不同相机角度的 3D 触摸检测。在这里,我们设置了三个按钮,一个用于背景,一个用于文本,一个用于图像。

虽然这可能只是一个基础示例,可以帮助您开始创建 3D 按钮和文本,但您可以进一步查看 SocialPoetry 项目,它扩展了这个视图,以支持绘制从 Facebook 下载的照片。

https://github.com/SoftPoetry/SocialPoetry

如果您更有冒险精神,可以查看 3D 俯视角射击游戏 PhoneWars,看看如何复用代码库来创建 3D 游戏。
https://codeproject.org.cn/Articles/448748/3D-Cross-Platform-3rd-Person-Shooter-To-Intel-x86

总结

希望本文至少能给您带来一些关于如何使用包装器构建代码库以支持多个平台的启发。虽然我认为我的代码库仍然不成熟,但它对我来说很好用,但我真诚地希望得到您的反馈,以便进一步开发它,确保它更容易上手和使用。

© . All rights reserved.