跳转至

HTML5 接入指南

安装 SDK

SDK 已作为公开包发布到 npm,并配有合适的 Typescript 类型定义,仅需在你的项目中安装即可。

npm install @cloudgaming/paas-web @cloudgaming/rpc
yarn add @cloudgaming/paas-web @cloudgaming/rpc

使用 SDK

导入 Game 并构建一个实例

import { Game } from '@cloudgaming/paas-web'

const game = new Game()

准备 DOM 结构

<div class="game-player">
  <div class="game-player__video-container">
    <video width="100%" height="100%" id="game_video"></video>
  </div>
</div>

示例中 game-player 等 class 均可自由定义,但请注意双层 div 结构不可变化。

最里层的 video 标签需要有 id,后续需要传入对应方法。

准备 CSS

.game-player {
  width: 100%;
  position: relative;
}

.game-player::before {
  display: block;
  content: ' ';
  width: 100%;
  padding-top: 56.25%; /* 16:9 */
}

.game-player__video-container {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
}

这里需要将 .game-player 固定比例展现,在 CSS 中用到 padding-top 来保持固定比例。

如果你在上一步中修改了 class name,那这里的 CSS 也需要对应做出修改。

提示

如果需要对游戏画面进行定位,请对整个 .game-player DOM 进行定位,不要放大或裁剪其中的元素。

检查队列

无论当前是否需要排队,都需要调用该函数,用于检查排队情况、分配服务器。

调用该函数后,会得到排队信息和一些其它的返回值。

const { queuePosition } = await game.checkQueue({
  async getAuthToken() {
    return '' // 自定义获取 authToken 的逻辑,参考下文获取 Token 一节
  },
  gameName, // 游戏名,由庭宇 PaaS 分配
  gameArgs: {
    // 此处传入自定义的游戏启动参数,没有可忽略该字段
  },
  migrateSession: false, // 是否开启跨设备迁移会话,默认为否
})

if (queuePosition == null) { // 此处不可用 === ,也不可写作 if (queuePosition)
  // 无需排队,可以直接进入游戏
  startGame()
} else {
  // 需要排队,已在队列中
  showQueueUi()
}

排队

如果检查队列发现需要排队,那么开发者此时需要展示排队 UI。我们提供了一些事件,用以更新排队位置,或是指示可以开始游戏。

当排队轮到当前用户后,我们将为当前用户保留 1 分钟排队结果。此时,开发者应当展示排队成功的 UI,询问用户是否进入游戏。

根据产品逻辑,亦可以自动进入游戏,但可能造成资源浪费或是用户不知情的消费。

game.on('queueUpdate', (position) => {
  console.log(`当前排队位置:${position + 1}`)
  // position 是从 0 开始计数,故显示位置应当+1
})

game.on('canStartGame', () => {
  showStartGameUi()
})

启动游戏

当用户无需排队、或是排队轮到当前用户后,即可正式开始游戏。

console.log('正在尝试启动游戏')
await game.startGame(
  'game_video', // video 标签的 ID
  getStartToken, // startToken 函数,参考下文获取 Token 一节
  getRenewToken, // renewToken 函数,参考下文获取 Token 一节
  (progress) => console.log(`载入中,进度:${progress}%`)
)
console.log('游戏成功开始')

获取 Token

为了实现 PaaS 端与开发者后端之间鉴权、计费的逻辑,我们引入了三种 token,具体后端实现规范可参考客户后端实现规范

对于前端开发者而言,需要与后端商量好获取三种 token 的方法,然后在前端逻辑中自行实现,将参数传递到后端,并将后端生成的 token 传入 SDK,SDK 将自动在合适的时候调用函数。

获取 Token 的三个函数签名如下:

function getAuthToken(sessionId: string): Promise<string>
function getStartToken(sessionId: string): Promise<string>
function getRenewToken(sessionId: string, lastDeadline: number): Promise<string>
/**
 * @param sessionId string
 * @return Promise<string>
 */
function getAuthToken(sessionId)
/**
 * @param sessionId string
 * @return Promise<string>
 */
function getStartToken(sessionId)
/**
 * @param sessionId string
 * @param lastDeadline number
 * @return Promise<string>
 */
function getRenewToken(sessionId, lastDeadline)

同时我们也提供在线 demo 后端,请联系售前或技术以获取 demo 后端的地址,使用 demo 后端可在开发期间避免后端过早参与。

常见问题

在移动端或触屏设备上不响应触摸事件

当前我们尚未定义移动端或触屏设备的事件响应规则。业务方可根据自己的需要,将触屏定义为模拟鼠标点击,或是滑动的触摸板。