跳转到内容

跨平台游戏编程与 gameplay3d/游戏类的概述

来自 Wikibooks,开放世界中的开放书籍

gameplay::Game 类是使用 gameplay 框架创建的所有游戏的基类。您需要使用 C++ 扩展此类,并覆盖核心游戏和生命周期事件方法 initializefinalizeupdaterender。您将在其中编写代码以加载游戏资源并应用游戏逻辑和渲染代码。在幕后,游戏类将接收事件并充当运行游戏和运行游戏循环并对操作系统做出反应的底层平台层之间的抽象。

您必须实现四种方法才能开始编写自己的游戏

#include "gameplay.h"
using namespace gameplay;

class MyGame : public Game
{
    void initialize();
    void finalize();
    void update(float elapsedTime);
    void render(float elapsedTime);
};

initialize()

[编辑 | 编辑源代码]

initialize() 方法在游戏启动时第一个帧之前由 gameplay3d 框架调用。您将在此处添加代码以加载游戏资源并创建场景,以及任何其他一次性初始化代码。

finalize()

[编辑 | 编辑源代码]

finalize() 方法在退出游戏时由 gameplay3d 框架调用。您将在此处添加代码以清理任何未完成的资源(有关更多详细信息,请参阅 跨平台游戏编程与 gameplay3d/gameplay3d 设计概念#管理共享对象)。

update() 和 render()

[编辑 | 编辑源代码]

Game::update()Game::render() 方法从每个操作系统的 gameplay::Platform 中实现的游戏循环中每帧调用一次。这使您可以将代码分离到处理游戏状态更新和渲染游戏视觉效果之间。您可以使用各种内置类来帮助游戏渲染。

访问游戏实例

[编辑 | 编辑源代码]

可以在游戏代码中的任何位置访问 gameplay::Game 类。它实现了一个 单例 设计模式。调用静态方法 Game::getInstance() 以从任何代码获取对游戏实例的访问权限。

图形和音频设备

[编辑 | 编辑源代码]

游戏启动后,底层图形和音频设备将自动初始化。这发生在调用 Game::initialize() 方法之前,并准备任何使用 OpenGL (ES) 2.0 或 Open AL 1.1 的类。游戏图形设备将使用默认的 32 位颜色帧缓冲区、24 位深度缓冲区和 8 位模板缓冲区进行设置,以供您使用。这些是活动的图形硬件缓冲区,您的渲染代码将渲染到其中。

对于更高级的使用,您可以使用 gameplay::FrameBuffer 类应用备用帧缓冲区。在 Game::render() 方法调用之后,帧缓冲区将被交换/呈现到物理显示器,供用户查看。您可以调用 Game::clear() 方法以通过任何方法清除缓冲区。您也可以从代码(例如从 Game::initialize() 方法)调用 Game::renderOnce(),以回调到仅调用一次然后交换/呈现到显示器的某个方法。这对于在渲染期间的初始化期间呈现临时更新(例如加载屏幕)非常有用。

游戏子系统控制器

[编辑 | 编辑源代码]

gameplay::Game 类还管理游戏子系统控制器(例如音频、动画和物理控制器),并通过 getter 方法直接提供对其的访问。这些类充当控制界面,用于管理和播放游戏中活动的音频和动画,以及对物理系统中的动态进行更新。这些控制器由 gameplay::Game 类托管,并对游戏中处理的生命周期事件做出反应。

游戏时间和状态

[编辑 | 编辑源代码]

gameplay::Game 类实例启动后,游戏会开始运行。您可以调用 Game::getGameTime() 来确定游戏运行了多长时间。您还可以调用 Game::getAbsoluteTime() 来确定从第一次 Game::run() 调用开始经过的绝对时间。这也包括任何暂停时间。您可以调用 Game::pause() 方法,游戏将进入 Game::PAUSED 状态。如果平台上的用户将游戏置于后台,游戏时间也会暂停。如果用户将游戏重新置于前台,游戏将调用 Game::play(),游戏将恢复。在游戏的任何时候,您可以通过调用 Game::getState() 来确定游戏状态。游戏状态可以是 UNINITIALIZEDRUNNINGPAUSED

华夏公益教科书