Client Engine 开发指南 · Node.js
请先阅读 Client Engine 快速入门 · Node.js 及你的第一个 Client Engine 小游戏来初步了解如何使用初始项目来开发游戏。本文档将在初始项目的基础上深入讲解 Client Engine SDK。
Client Engine 初始项目依赖了专门的 Client Engine SDK, Client Engine SDK 在多人在线对战 SDK 的基础上进行了封装,帮助您更好的撰写服务端游戏逻辑。您可以通过快速入门安装依赖。
组件
SDK 提供以下组件:
Game:负责房间内游戏的具体逻辑。Client Engine 维护了许多游戏房间,每一个游戏房间都是一个 Game 实例,即每个 Game 实例对应一个唯一的 Play Room 与 MasterClient。游戏房间内的逻辑由 Game 中的代码来控制,因此房间内的游戏逻辑必须继承自该类。- **
GameManager:**负责创建、管理及分配具体的 Game 对象。Game 的管理及销毁由 SDK 负 责,不需要您再自己额外写代码。
GameManager
GameManager 实例化
GameManager 会帮您自动创建、管理并销毁 Game,因此在项目启动时,您需要实例化 GameManager。相关示例代码如下:
自定义 GameManager
首先需要自定义一个 Class 继承自 GameManager,例如示例代码中的 SampleGameManager:
import { Game, GameManager, ICreateGameOptions } from "@leancloud/client-engine";
export default class SampleGameManager<T extends Game> extends GameManager<T> {
}
在 GameManager 中自定义方法
Client Engine 的核心用法之一是负责创建 Game 并返回 roomName 给客户端,因此在 SampleGameManager 这个类中,我们需要撰写创建 Game 的方法提供给 Web API 使用。例如示例项目中的快速开始和创建新游戏。这里的示例代码我们以创建新游戏为例:
import { Game, GameManager, ICreateGameOptions } from "@leancloud/client-engine";
export default class SampleGameManager<T extends Game> extends GameManager<T> {
/**
* 创建一个新的游戏。
* @param playerId 预约的玩家 ID
* @param options 创建新游戏时可以指定的一些配置项
* @return 创建的游戏的房间 name
*/
public async createGameAndGetName(playerId: string, options?: ICreateGameOptions) {
const game = await this.createGame(playerId, options);
return game.room.name;
}
}
写完自定义方法之后,在下文我们还需要为这里的方法配置负载均衡,需要注意的是,受负载均衡系统的要求,GameManager 子类中的 public 方法,其参数与返回值必须是 string、number、boolean、null、Object、Array 中的一种。以上代码中可以看到 GameManager 的 createGame() 方法返回的是一个 Game,不符合负载均衡的要求,因此我们在这里封装为自己的方法 createGameAndGetName()。
创建 GameManager 子类对象
接下来创建 GameManager 的子类对象,在创建 SampleGameManager 的时候,需要在第一个参数内传入[自定义的 Game ](#实现自己的 Game),这里使用的是示例 Demo 猜拳游戏中的 RPSGame。
import PRSGame from "./rps-game";
const gameManager = new SampleGameManager(
gameConstructor: PRSGame,
appId: {{appid}},
appKey: {{appkey}},
playServer: "https://please-replace-with-your-customized.domain.com",
concurrency: 2,
);