🎮 小游码匠-微信公众号

多人在线游戏服务端框架

Colyseus TypeORM Redis JWT MVC Swagger
📚 查看 Swagger API 文档

✨ 框架特性

🏗️

MVC 架构

清晰的控制器、服务、模型分层

🔐

JWT 认证

完整的令牌生成、验证和刷新机制

💾

TypeORM

强大的 ORM 数据库操作

Redis 缓存

高性能缓存支持

数据验证

基于 class-validator 的请求验证

🛡️

错误处理

统一的错误处理中间件

📚

Swagger 文档

自动生成 API 文档和交互式测试

⚙️

帧同步

多人游戏帧同步机制,确保游戏状态一致性

🎮 体验演示 →

📡 用户认证 API 接口

POST /api/auth/register 用户注册
注册新用户账户
请求参数:
{ "username": "testuser", "email": "test@example.com", "password": "password123", "nickname": "测试用户" // 可选 }
响应示例:
{ "success": true, "message": "注册成功", "data": { "user": { "id": "uuid", "username": "testuser", "email": "test@example.com", "nickname": "测试用户" }, "tokens": { "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } } }
POST /api/auth/login 用户登录
用户登录获取访问令牌
请求参数:
{ "username": "testuser", // 可以是用户名或邮箱 "password": "password123" }
响应示例:
{ "success": true, "message": "登录成功", "data": { "user": { "id": "uuid", "username": "testuser", "email": "test@example.com" }, "tokens": { "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } } }
POST /api/auth/refresh 刷新令牌
使用刷新令牌获取新的访问令牌
请求参数:
{ "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." }
响应示例:
{ "success": true, "message": "刷新令牌成功", "data": { "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "refreshToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." } }
GET /api/auth/me 需要认证
获取当前登录用户信息(需要在请求头中携带 Authorization: Bearer <accessToken>
请求头:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
响应示例:
{ "success": true, "message": "获取成功", "data": { "id": "uuid", "username": "testuser", "email": "test@example.com", "nickname": "测试用户", "avatar": null, "status": 1, "createdAt": "2024-01-01T00:00:00.000Z", "updatedAt": "2024-01-01T00:00:00.000Z" } }

🔧 其他接口

GET /health 健康检查
检查服务运行状态
响应示例:
{ "success": true, "message": "服务运行正常", "timestamp": "2024-01-01T00:00:00.000Z", "version": "1.0.0" }
GET /api-docs Swagger 文档
查看完整的 API 文档和交互式测试界面
📚 打开 Swagger API 文档 →

⚙️ 帧同步演示

DEMO FrameSync.html 交互式演示
打开帧同步功能的交互式演示程序,可以实时测试帧同步功能
🎮 打开帧同步演示程序 →

💬 聊天演示

DEMO ChatDemo.html 交互式演示
打开世界/工会/附近/队伍聊天房间的交互式演示程序
💬 打开聊天演示程序 →

🎯 匹配赛演示

DEMO MatchmakingDemo.html 主动匹配 / 被动开房 / 重连
类王者荣耀:大厅点开始匹配(动态人数)与房间码开房加入;匹配成功自动进入 game_room,支持模拟断线与重连
🎯 打开匹配赛演示程序 →
提示:匹配成功后会自动跳转到 MatchmakingGame.html 进行“对局准备/开始游戏”。

📈 并发压测

TEST LoadTestConcurrent.html 连接数 / 性能
loadtest_room 无需 JWT:模拟用户 ID、按毫秒间隔发随机数、观察服务端在线人数并可评分;大并发用 npm run loadtest:concurrent
📈 打开并发压测页面 →

⚙️ 帧同步功能

帧同步(Frame Synchronization)是一种多人游戏同步机制,确保所有客户端在相同的帧上执行相同的逻辑,从而保证游戏状态的一致性。

核心特性

使用示例

服务端代码:
import { FrameSyncRoom, ClientInput } from "../utils/FrameSync"; export class GameRoom extends FrameSyncRoom<MyRoomState> { onCreate(options: any) { // 初始化帧同步(20 FPS) this.initFrameSync({ targetFPS: 20, enabled: true, }); // 启动帧同步 this.startFrameSync(); } // 实现帧更新逻辑 protected onFrameUpdate(frame: number, inputs: ClientInput[]) { // 处理所有客户端的输入 for (const input of inputs) { this.processPlayerInput(input); } } // 实现帧同步逻辑 protected onFrameSync(frame: number, frameData: any) { // 同步状态到客户端 this.state.frame = frame; } }
客户端代码:
// 连接房间 const room = await client.joinOrCreate("game_room", { fps: 20 }); // 发送输入 room.send("input", { inputs: { move: { x: 1, y: 0 }, attack: false, } }); // 接收帧同步信息 room.onMessage("frameSync", (message) => { console.log("当前帧:", message.currentFrame); console.log("目标FPS:", message.targetFPS); });

房间类型

ROOM game_room 帧同步房间
使用帧同步机制的游戏房间,支持多人实时同步
连接参数:
{ "fps": 20, // 目标帧率(可选,默认 20) "recordFrames": false // 是否记录帧数据(可选) }

配置选项

{ "targetFPS": 20, // 目标帧率(默认:20) "enabled": true, // 是否启用(默认:true) "maxFrameDelay": 100, // 最大帧延迟,单位:毫秒(默认:100) "recordFrames": false // 是否记录帧数据(默认:false) }