快速上手多人游戏服务器开发。后续会基于 Google Agones,更新相关 K8S 运维、大规模快速扩展专用游戏服务器的文章。拥抱️原生 Cloud-Native!

快速开始

在开始之前,让我们确保在您的本地机器上安装了必要的系统需求。

系统必需

创建一个 barebones(裸) Colyseus server

使用 npm init colyseus-app 命令生成 barebones(裸) Colyseus server。您可以选择 TypeScript(推荐),JavaScriptHaxe 作为服务器的选择语言。

npm init colyseus-app ./my-colyseus-app

从官方的例子来看

或者,您可以通过克隆示例项目并在本地运行它来查看一些实际示例。

git clone https://github.com/colyseus/colyseus-examples.git
cd colyseus-examples
npm install

要在本地运行服务器,请运行 npm start,然后打开 http://localhost:2567 查看每个示例。

Colyseus 工作原理概述

Presentation: Overview of how Colyseus works

JavaScript/TypeScript SDK

JavaScript/TypeScript SDK 与大多数平台兼容:

用法

在项目中包括 JavaScript SDK

如果你正在使用一个构建工具(webpackrollup或类似的),这是首选的方法。

npm install --save colyseus.js

如果你不使用构建工具,建议从 GitHub Releases 下载。

<script src="colyseus.js"></script>

或者,您可以使用 unpkg 直接包括分发文件。确保用与您的服务器兼容的版本来替换其中的 @x.x.x 部分。

<script src="https://unpkg.com/colyseus.js@^0.14.0/dist/colyseus.js"></script>

连接到服务器:

import * as Colyseus from "colyseus.js"; // 如果通过 <script> 标记包含,则不需要。

var client = new Colyseus.Client('ws://localhost:2567');

加入一个 room(房间):

client.joinOrCreate("room_name").then(room => {
console.log(room.sessionId, "joined", room.name);
}).catch(e => {
console.log("JOIN ERROR", e);
});

Room 事件

Room state(状态) 已经被更新:

room.onStateChange((state) => {
console.log(room.name, "has new state:", state);
});

从服务器广播或直接广播到此客户端的消息:

room.onMessage("message_type", (message) => {
console.log(client.id, "received on", room.name, message);
});

发生服务器错误:

room.onError((code, message) => {
console.log(client.id, "couldn't join", room.name);
});

client 离开 room

room.onLeave((code) => {
console.log(client.id, "left", room.name);
});

Cocos Creator 3.0

  • 从 GitHub 下载最新的 colyseus-js-client.zip 版本
  • 解压 colyseus-js-client.zip 文件。
  • colyseus.jscolyseus.d.ts 文件移到 Cocos Creator 项目的 scripts 文件夹中。
  • 单击 Assets 面板中的 colyseus.js 文件,并启用 "Import As Plugin"(见下图)
  • TypeScript: 需要使用 import Colyseus from "./colyseus.js";
  • JavaScript: 需要使用 const Colyseus = require("./colyseus.js");

概述

Colyseus 目前有客户端 SDK,可用于以下平台:

需要另一个平台的客户端?在discussion board分享你的兴趣吧!

实例化 Colyseus 客户端

Client 实例用于执行配对调用,然后连接到一个或多个房间。

此时没有实际的服务器端连接。

import Colyseus from "colyseus.js";
// ... let client = new Colyseus.Client("ws://localhost:2567");

方法

joinOrCreate (roomName: string, options: any)

通过提供的 roomNameoptions 加入现有房间或创建新房间。

此方法将忽略锁定的房间或私人房间。

try {
const room = await client.joinOrCreate("battle", {/* options */});
console.log("joined successfully", room); } catch (e) {
console.error("join error", e);
}

create (roomName: string, options: any)

通过提供的 roomNameoptions 创建新房间。

try {
const room = await client.create("battle", {/* options */});
console.log("joined successfully", room); } catch (e) {
console.error("join error", e);
}

join (roomName: string, options: any)

通过提供的 roomNameoptions 连接一个现有的房间。

此方法将忽略锁定的房间或私人房间。

try {
const room = await client.join("battle", {/* options */});
console.log("joined successfully", room); } catch (e) {
console.error("join error", e);
}

joinById (roomId: string, options: any)

通过 roomId 加入现有房间。私人房间可以通过 id 连接。

try {
const room = await client.joinById("KRYAKzRo2", {/* options */});
console.log("joined successfully", room); } catch (e) {
console.error("join error", e);
}

使用 getAvailableRooms() 检索可加入的 roomId 列表。

reconnect (roomId: string, sessionId: string)

将客户端重新连接到他以前连接的房间。

必须与服务器端的 allowReconnection() 一起使用。

try {
const room = await client.reconnect("wNHTX5qik", "SkNaHTazQ");
console.log("joined successfully", room); } catch (e) {
console.error("join error", e);
}

getAvailableRooms (roomName?: string)

列出要连接的所有可用房间。锁好的房间和私人房间不会被列出。roomName 是可选的。

client.getAvailableRooms("battle").then(rooms => {
rooms.forEach((room) => {
console.log(room.roomId);
console.log(room.clients);
console.log(room.maxClients);
console.log(room.metadata);
});
}).catch(e => {
console.error(e);
});

consumeSeatReservation (reservation)

通过预订座位加入一个房间。

"高级用法":

请参阅Match-maker API以了解如何检索座位预订数据。

try {
const room = await client.consumeSeatReservation(reservation);
console.log("joined successfully", room); } catch (e) {
console.error("join error", e);
}

Room API (Client-side)

属性

state: any

当前房间的状态。此变量始终与服务器端的最新 state 同步。要侦听整个状态的更新,请参阅 onStateChange 事件。

您可以将 callbacks 附加到您 state 中的特定结构。参阅 schema callbacks

sessionId: string

当前连接的客户端的唯一标识符。此属性与服务器端的 client.sessionId 匹配。

id: string

房间的唯一标识。您可以与其他客户端共享此 id,以便允许他们直接连接到此房间。

// get `roomId` from the query string
let roomId = location.href.match(/roomId=([a-zA-Z0-9\-_]+)/)[1]; // joining a room by its id
client.joinById(roomId).then(room => {
// ...
});

name: string

room handler 的名称。例如:"battle"

方法

send (type, message)

room handler 发送一种类型的消息。消息是用 MsgPack 编码的,可以保存任何 JSON-seriazeable(JSON可序列化)的数据结构。

//
// sending message with string type
//
room.send("move", { direction: "left"}); //
// sending message with number type
//
room.send(0, { direction: "left"});

从服务器端使用 Room#onMessage() 读取消息。

leave ()

与房间断开连接。

room.leave();

使用 Room#onLeave() 处理与服务器端的断开连接。

removeAllListeners()

移除 onMessageonStateChangeonLeaveonError 监听器。

如果您使用的是 Fossil Delta 序列化程序,还将删除所有 .listen() 调用。。

事件

onStateChange

查看 State Handling » Schema » Client-side 部分了解更多详细信息。

此事件在服务器更新其状态时触发。

room.onStateChange.once((state) => {
console.log("this is the first room state!", state);
}); room.onStateChange((state) => {
console.log("the room state has been updated:", state);
});

onMessage

当服务器直接向客户端或通过广播发送消息时,会触发此事件。

room.onMessage("powerup", (message) => {
console.log("message received from server");
console.log(message);
});

要将消息从服务器直接发送到客户端,您需要使用 client.send()room.broadcast()

onLeave

当客户端离开房间时触发此事件。

可能出现的 code

room.onLeave((code) => {
console.log("client left the room");
});

onError

room handler 中发生某些错误时,将触发此事件。

room.onError((code, message) => {
console.log("oops, error ocurred:");
console.log(message);
});

Refs

中文手册同步更新在:

我是为少
微信:uuhells123
公众号:黑客下午茶
加我微信(互相学习交流),关注公众号(获取更多学习资料~)

ColyseusJS 轻量级多人游戏服务器开发框架 - 中文手册(上)的更多相关文章

  1. ColyseusJS 轻量级多人游戏服务器开发框架 - 中文手册(中)

    快速上手多人游戏服务器开发.后续会基于 Google Agones,更新相关 K8S 运维.大规模快速扩展专用游戏服务器的文章.拥抱️原生 Cloud-Native! 系列 ColyseusJS 轻量 ...

  2. ColyseusJS 轻量级多人游戏服务器开发框架 - 中文手册(下)

    快速上手多人游戏服务器开发.后续会基于 Google Agones,更新相关 K8S 运维.大规模快速扩展专用游戏服务器的文章.拥抱️原生 Cloud-Native! 系列 ColyseusJS 轻量 ...

  3. ColyseusJS 轻量级多人游戏服务器开发框架 - 中文手册(系统保障篇)

    快速上手多人游戏服务器开发.后续会基于 Google Agones,更新相关 K8S 运维.大规模快速扩展专用游戏服务器的文章.拥抱️原生 Cloud-Native! 系列 ColyseusJS 轻量 ...

  4. phpredis中文手册——《redis中文手册》 php版

    本文是参考<redis中文手册>,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法). 目录(使用CTRL+F快速查找命令): Key ...

  5. [转]phpredis中文手册

    本文是参考<redis中文手册>,将示例代码用php来实现,注意php-redis与redis_cli的区别(主要是返回值类型和参数用法). 目录(使用CTRL+F快速查找命令): Key ...

  6. man rpcbind(rpcbind中文手册)

    本人译作集合:http://www.cnblogs.com/f-ck-need-u/p/7048359.html RPCBIND() BSD System Manager's Manual RPCBI ...

  7. phpredis中文手册——《redis中文手册》 php版(转)

    redis中文手册:http://readthedocs.org/docs/redis/en/latest/ 本文是参考<redis中文手册>,将示例代码用php来实现,注意php-red ...

  8. Flask 中文手册 0.10 文档

    Flask 中文手册 0.10 文档 欢迎使用 Flask 欢迎阅读 Flask 文档. 本文档分为几个部分.我推荐您先从 安装 开始,之后再浏览 快速入门 章节. 教程 比快速入门更详细地介绍了如何 ...

  9. Dig HOWTO 中文手册--dig命令使用大全

    Dig HOWTO 中文手册--dig命令使用大全 DNS -- 本人翻译的dig howto手册. 译者序: 可以这样说,翻译本篇文档的过程就是我重新学习DNS的过程,dig命令可以帮助我们学习DN ...

随机推荐

  1. python爬虫(正则取数据)读取表格内的基金代码后爬取基金最新净值,同时写到对应的表格中,基于最近一次购买净值计算出涨跌幅(名字有点长)

    最近基金跌的真够猛,虽说是定投,但大幅度下跌,有时候适当的增加定投数也是降低平均成本的一种方式 每天去看去算太费时间,写了个爬虫,让他自动抓数据后自动计算出来吧 实现逻辑: 1.创建了一个excel表 ...

  2. 我与FreeBSD 的故事之二

    那些人的丑恶嘴脸使我发笑,我愈发远离所谓的社区与论坛.电视剧<武林外传>说的好:有人的地方就有江湖,江湖从未走远,从未改变.社区中的冲突很少是技术层面的,按照老话说睿智的人很少发表自己的见 ...

  3. OpenCV 之 角点检测

    角点 (corners) 的定义有两个版本:一是 两条边缘的交点,二是 邻域内具有两个主方向的特征点. 一般而言,角点是边缘曲线上曲率为极大值的点,或者 图像亮度发生剧烈变化的点.例如,从人眼角度来看 ...

  4. div+伪元素实现太极图

    需求:使用div和伪元素实现阴阳太极图 图例: 代码: <html> <head> <title>太极图</title> <style type= ...

  5. P4285 [SHOI2008]汉诺塔 题解 (乱搞)

    题目链接 P4285 [SHOI2008]汉诺塔 解题思路 提供一种打表新思路 先来证明一个其他题解都没有证明的结论:\(ans[i]\)是可由\(ans[i-1]\)线性递推的. (\(ans[i] ...

  6. Codeforces Round #537 C. Creative Snap

    题面: 传送门 题目描述: 灭霸想要摧毁复仇者联盟的基地.基地的长度为2的n次方,基地可以看成是一个长度为2的n次方的数组.基地的每一个位置可以由很多个超级英雄,但是一个超级英雄只能站一个位置.灭霸想 ...

  7. java重写toString()方法

    toString()方法是Object类的方法,调用toString()会返回对象的描述信息. 1)为什么重写toString()方法呢? 如果不重写,直接调用Object类的toString()方法 ...

  8. python-实现双链表

    双链表和单链表进行比较的优点与不同 节点多了一个前驱指针域 在很多基本操作上,多了一种选择,因为双链表可以向前进行移动寻位 如果给每个节点添加一个对应的下标,那么在寻找节点时,我们可以使用二分发来进行 ...

  9. Python3实现短信轰炸机

    短信轰炸机的基本原理:利用某些限制不严格的网站短信注册接口,用Python模拟请求,传入被炸人手机号码,实现轰炸 实现方式:利用requests模块.time模块.完成请求模拟 模块安装: 在终端窗口 ...

  10. 面试高频题:说一说对Spring和SpringMvc父子容器的理解?

    引言 以前写了几篇关于SpringBoot的文章<面试高频题:springBoot自动装配的原理你能说出来吗>.<保姆级教程,手把手教你实现一个SpringBoot的starter& ...