【GamePlay3D】开发指南——Assets and authoring 和 GamePlay::Game类

资源和打包(Assets and authoring)

游戏资源对于一个高品质的游戏来说是非常重要的。这不只是说做出的游戏资源要适合游戏设计,而且他们需要在特定平台硬件的局限之下,高品质的快速的加载。

二进制游戏资源(Binary game assets

一个非常实用的确保你总是高效的方法就是捆绑和加载所有的游戏资源为二进制形式。通常的资源包括图像、字体、音效和3D场景。大多数游戏引擎总是包含一些种类的打包(authoring)工具来允许开发者编码和处理他们的将要处理的内容。GamePlay框架也包含了一个可执行的工具——gameplay-encoder

使用字体和3D场景

对于字体和3D场景,你可能想要支持工业标准的文件格式,比如说TrueType(字体标准)、COLLADAFBX(流行的3D场景格式)。

尽管这些格式流行并且在工具选择上拥有广泛的支持,但是他们不被认为是有效的执行格式。GamePlay库需要你使用gameplay-encoder执行文件转换这些格式成文档说明的GamePlay Bundle Format.gpb)文件。

预编译gameplay-encoder工具

Gameplay-encoder可执行工具已经预编译了win7mac os x版本,他们可以在   <gameplay-root>/bin文件夹下找到。使用方法是:

 >gameplay-encoder <options> files

编译gameplay-encoder

尽管gameplay-encoder工具已经预编译过,你可能想要为自己定制编译它。为了编译gameplay-encoder工程,在vs或者xcode中打开gameplay-encoder工程,然后编译成可执行文件。

素材管道(Content pipeline)

字体和场景素材管道是这样工作的:

1、找到任何TrueType字体或者COLLADA/FBX场景文件;

2、运行gameplay-encoder可执行文件,通过字体或者场景文件的路径和可选参数来产生一个GamePlay二进制版本(.gpb文件);

3、绑定你的游戏和包含GamePlay库文件作为一个二进制游戏包;

4、加载任何二进制游戏包使用GamePlay::Bundle类。

使用二进制包

cpp游戏代码中使用GamePlay::Bundle类来加载编码的二进制文件(就像一个包)。这个类提供加载字体和场景的方法。场景就像分层的节点(有很多实体依附在上面)被加载。这些实体包括网格的集合体、群体、摄像机和灯光等一类东西。GamePlay::Bundle类也提供过滤一部分场景的方法,这样你可以加载你想要加载的一部分。

释放模型包

当释放你标题对应的游戏,所有的图像应该被优化并转换为OpenGL(ES)所支持的压缩的纹理格式。音频应该被编码来节省存储空间。

游戏

GamePlay::Game类是使用GamePlay框架创建的所有游戏的基类。你需要使用CPP扩展这个类,重写游戏核心和生命周期里面的事件处理方法“initialize”、“finalize”、“update”和“render”。这就是你将要写你自己的代码来加载游戏包和实现游戏逻辑和渲染的地方。在重写以后,Game类将会接收到事件并作为一个抽象事物,运行在游戏和下层的平台层之间。下层的平台层运行游戏循环并反馈给操作系统。

下面是你在开始编写自己的游戏的时候必须实现的四个方法:

#include "gameplay.h"

 

using namespace gameplay;

 

class MyGame : public Game

{

    void initialize();

    void finalize();

    void update(float elapsedTime);

    void render(float elapsedTime);

};

Game::initialize()Game::finalize()方法分别在游戏开始和结束的时候被调用。这就是你将要添加代码来在游戏来加载游戏资源包,和在游戏结束的时候回收的地方。Game::update()Game::render()方法从游戏的循环中在Game::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::renderOnce(),比如在Game::initialize()方法中,来回调一个方法,将会只调用一次,然后交换/呈现到显示屏。渲染初始化期间,比如加载场景,呈现ad-hoc更新到屏幕是非常有用的。

游戏子系统控制器

GamePlay::Game类也管理游戏子系统控制器,比如音频、动画和物理控制器,并提供直接使用getter方法访问他们。这些类作为管理和播放游戏中生动的音频和动画,而且在物理系统中动态更新。这些控制器被托管在GamePlay::Game类,反应在游戏中被操作的生命周期事件中。

游戏时间和状态

一旦GamePlay::Game类实例化开始了,游戏就开始了运行时间。你可以调用Game::getGameTime()来获取游戏运行的时间。你也可以调用Game::getAbsoluteTime()来获得绝对时间自从第一次调用Game::run()到现在的时间。这也是包括暂停的时间。你可以调用Game::pause()方法,游戏将会进入Game::PAUSED状态。如果用户在平台将游戏进入Game::play(),那么游戏将恢复。在任何时候,在游戏里面,你可以获得游戏的状态通过调用Game::getState()。游戏状态可以是UNINITIALIZED, RUNNING or PAUSED

  输入和感知

通过创建你的游戏和扩展GamePlay::Game,你将能够添加所有必须的输入事件操作。此外,还有一些在GamePlay::Game中也有一些方法来获取到当前接收到的传感数据。这个体系结构让你(作为一个开发者)从平台差异细节中解放出来,操作键盘,触摸和鼠标事件,和获得加速器状态。以下是阐述了重写方法来操作输入事件:

#include "gameplay.h"

 

using namespace gameplay;

 

class MyGame : public Game

{

    ...

 

    void keyEvent(Keyboard::KeyEvent evt, int key);

    void touchEvent(Touch::TouchEvent evt, int x, int y, unsigned int contactIndex);

    bool mouseEvent(Mouse::MouseEvent evt, int x, int y);

    void getAccelerometerValues(float* pitch, float* roll); 

};

控制输入事件

你有机会在桌面平台或者移动设备上操作鼠标,处理鼠标事件只能通过GamePlay::touchEvent()方法(这包括支持蓝牙鼠标)。然而这不是必须的,默认的实现Game::mouseEvent()方法返回false,这意味着用户能够允许鼠标事件自动作为触摸事件。

你可以决定对游戏取消多点触摸的支持,当你不想要这个方法的时候。你可以调用Game::setMultiTouch(false)来确保平台对待和操作触摸时间作为单点触摸。你也可以调用Game::displayKeyboard()来显示和隐藏虚拟键盘来支持他。你将想要整合他到游戏里面的一个点或者界面里面,文本输入是必需的。

你可以调用Game::getAccelerometerValues()传递执政给参数,这将是流行的对于当前传递的值为加速器。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值