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

简介: ColyseusJS 轻量级多人游戏服务器开发框架 - 中文手册(上)

快速开始



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

系统必需


  • Download and install Node.js v12.0 或更高版本。
  • Download and install Git SCM
  • Download and install Visual Studio Code (或者你选择的其他编辑器)

创建一个 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 与大多数平台兼容:

  • 浏览器 (Google Chrome, Firefox, Safari, Opera, Brave, etc.)
  • Node.js
  • Electron
  • React Native
  • Cocos Creator 3.0 (请参阅说明)


用法


在项目中包括 JavaScript SDK


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


npm install --save colyseus.js


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

https://github.com/colyseus/colyseus.js/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");


微信图片_20220611161317.png


概述



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

  • Unity (source-code)
  • JavaScript/TypeScript (source-code)
  • Defold Engine (source-code)
  • Haxe (source-code)
  • Cocos2d-X (source-code)
  • Construct3 (source-code)


需要另一个平台的客户端?在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

  • 1000: 正常 Socket Shutdown
  • 高于 1000: 异常 Socket Shutdown (更多详细信息)


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


onError


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


room.onError((code, message) => {
  console.log("oops, error ocurred:");
  console.log(message);
});
相关文章
|
8月前
|
弹性计算 运维 安全
轻量级应用服务器和云服务器区别——阿里云轻量和ECS区别对比
阿里云轻量应用服务器与ECS云服务器对比:轻量适合个人开发者、学生搭建博客、测试环境,门槛低、操作简便、成本低;ECS适用于企业级高并发场景,功能全面、弹性强。二者在使用场景、性能、网络、镜像及运维管理等方面差异显著,用户应根据实际需求选择。
755 4
|
11月前
|
C# 图形学 开发者
Unity开发中使用UnityWebRequest从HTTP服务器下载资源。
总之,UnityWebRequest就是游戏开发者手中的万能钓鱼竿,既可以获取文本数据,也能钓上图片资源,甚至是那声音的涟漪。使用UnityWebRequest的时候,你需要精心准备,比如确定URL、配置请求类型和头信息;发起请求;巧妙处理钓获的数据;还需要机智面对网络波澜,处理各种可能出现的错误。按照这样的过程,数据的钓取将会是一次既轻松愉快也效率高效的编程钓鱼之旅。
676 18
|
Go API 定位技术
MCP 实战:用 Go 语言开发一个查询 IP 信息的 MCP 服务器
随着 MCP 的快速普及和广泛应用,MCP 服务器也层出不穷。大多数开发者使用的 MCP 服务器开发库是官方提供的 typescript-sdk,而作为 Go 开发者,我们也可以借助优秀的第三方库去开发 MCP 服务器,例如 ThinkInAIXYZ/go-mcp。 本文将详细介绍如何在 Go 语言中使用 go-mcp 库来开发一个查询 IP 信息的 MCP 服务器。
835 2
|
存储 弹性计算 容灾
阿里云服务器ECS详细购买流程【新手购买手册】
本文详细介绍了阿里云服务器ECS的购买全流程,包括付费类型、地域选择、网络及可用区配置、实例规格、镜像系统、存储设置(系统盘与数据盘)、快照服务、公网IP与带宽配置、安全组规则设定以及登录凭据设置等关键步骤。以自定义购买为例,帮助用户根据实际需求选择合适的配置,如长时间使用建议包年包月模式,地域选择遵循就近原则降低延迟,实例规格依据性能需求挑选,同时提供带宽计费模式对比和安全组基础配置指导。通过清晰的图文说明,让用户轻松完成阿里云服务器的选购与部署。
1604 6
|
存储 人工智能 自然语言处理
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
ChatMCP 是一款基于模型上下文协议(MCP)的 AI 聊天客户端,支持多语言和自动化安装。它能够与多种大型语言模型(LLM)如 OpenAI、Claude 和 OLLama 等进行交互,具备自动化安装 MCP 服务器、SSE 传输支持、自动选择服务器、聊天记录管理等功能。
2984 16
ChatMCP:基于 MCP 协议开发的 AI 聊天客户端,支持多语言和自动化安装 MCP 服务器
|
监控 前端开发 应用服务中间件
小游戏源码开发搭建技术栈和服务器配置流程
近些年不同场景游戏层出不穷,现就小游戏开发技术应用及功能详细剖析!
|
安全 开发工具 Swift
Swift 是苹果公司开发的现代编程语言,具备高效、安全、简洁的特点,支持类型推断、闭包、泛型等特性,广泛应用于苹果各平台及服务器端开发
Swift 是苹果公司开发的现代编程语言,具备高效、安全、简洁的特点,支持类型推断、闭包、泛型等特性,广泛应用于苹果各平台及服务器端开发。基础语法涵盖变量、常量、数据类型、运算符、控制流等,高级特性包括函数、闭包、类、结构体、协议和泛型。
625 2
|
关系型数据库 API 数据库
后端开发的艺术:从零到一构建高效服务器
在数字化时代,后端开发是支撑现代互联网应用的基石。本文旨在探讨后端开发的核心概念、关键技术以及如何构建一个高效的服务器。我们将从基础的编程语言选择开始,逐步深入到数据库设计、API开发和性能优化等关键领域。通过实际案例分析,我们将揭示后端开发的复杂性和挑战性,同时提供实用的解决方案和最佳实践。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和启发。
|
NoSQL PHP Redis
布谷语音app源码服务器环境配置及技术开发语言
布谷语音app源码服务器环境配置及技术语言研发。。
|
网络安全 Docker 容器
VScode远程服务器之远程 远程容器 进行开发(五)
VScode远程服务器之远程 远程容器 进行开发(五)
625 1