Máy chủ game thời gian thực trên PlayDrop: Colyseus và MongoDB
Chạy máy chủ Colyseus 0.17 được lưu trữ kèm cơ sở dữ liệu MongoDB cho game, kết nối từ trình duyệt bằng SDK, thử với hai người chơi và nắm rõ giới hạn.
PlayDrop có thể lưu trữ phần máy chủ của game bạn: một máy chủ Colyseus chuẩn với cơ sở dữ liệu MongoDB riêng, người chơi đã được xác minh và không có hạ tầng nào bạn phải vận hành. Hãy dùng nó cho các trận đấu thời gian thực, game theo lượt, thế giới dùng chung và mọi thứ mà người chơi không được phép gian lận. Máy chủ là tùy chọn; game của bạn cũng có thể gọi một máy chủ do bạn tự lưu trữ.
Viết máy chủ
Export một đối tượng ánh xạ rooms từ một module ES. PlayDrop khởi động máy chủ; đừng gọi listen() hay định nghĩa onAuth, vì PlayDrop xác minh từng người chơi trước onJoin.
import { Room, defineRoom } from "colyseus";
import { MongoClient } from "mongodb";
class GameRoom extends Room {
maxClients = 8;
async onCreate() {
this.mongo = new MongoClient(process.env.PLAYDROP_MONGO_URL);
await this.mongo.connect();
this.onMessage("move", (client, move) => this.applyMove(client.auth.userId, move));
}
onJoin(client) {
// client.auth is the verified PlayDrop player: userId, username, appRole, isTestPlayer…
}
async onDispose() { await this.mongo?.close(); }
}
export const rooms = { game: defineRoom(GameRoom) };Kết nối tới MongoDB bên trong vòng đời của phòng, không bao giờ ở phạm vi module: PLAYDROP_MONGO_URL chỉ tồn tại lúc chạy. Hãy tạo chỉ mục cho các truy vấn của bạn.
Khai báo máy chủ
Gộp máy chủ vào một tệp và trỏ catalogue tới tệp đó:
{ "server": { "entry": "server/index.mjs", "rooms": ["game"] } }Tải nó lên trong một gói; cách tải HTML đơn giản không mang theo được máy chủ.
Quy tắc của môi trường chạy do PlayDrop vận hành
- Colyseus 0.17 (
colyseus0.17.10,@colyseus/schema4.0.30), driver MongoDB 7.5, trên Node.js 24.22.1. - Một module ES khép kín tối đa 2 MiB. Nó chỉ được import
colyseus,@colyseus/core,@colyseus/schema,mongodbvà@playdrop/server; hãy gộp mọi thứ khác vào tệp. - Tối đa 2 loại phòng, 8 người chơi mỗi phòng, 4 giờ mỗi phòng, 30 tin nhắn mỗi giây cho mỗi người chơi và 512 KiB mỗi tin nhắn.
- Không có truy cập internet: chỉ có thể truy cập MongoDB và các dịch vụ của PlayDrop.
- Người chơi phải đăng nhập.
- Một cơ sở dữ liệu cho mỗi game, được giữ qua các phiên bản và tính vào dung lượng của nhà sáng tạo. Không bao giờ gửi địa chỉ hay thông tin xác thực của nó đến trình duyệt.
Kết nối từ trình duyệt
const sdk = await playdrop.init();
const room = await sdk.multiplayer.join("game");
room.onStateChange((state) => render(state));
room.send("move", { x: 1 });join xử lý chỗ ngồi của nhóm chơi PlayDrop và việc đăng nhập; xem nhóm chơi trực tuyến. Để kiểm soát ở mức thấp hơn, sdk.multiplayer.getConnection() trả về { endpoint, token, expiresAt } cho client Colyseus chính thức lấy từ sdk.libs.colyseus.load().
SDK server
@playdrop/server thêm các lệnh gọi nền tảng đáng tin cậy: bạn bè và thẻ game (playdrop.social), xác minh giao dịch mua (playdrop.shop), tạo nội dung bằng AI do nhà sáng tạo trả phí (playdrop.ai) và thoại phòng (playdrop.multiplayer.forRoom). Chúng chỉ chạy trên game đã tải lên. Xem tài liệu tham khảo SDK server.
Thử nghiệm
Trong lúc phát triển, hãy chạy Colyseus 0.17 và MongoDB cục bộ và kết nối client cục bộ tới máy chủ cục bộ của bạn. Để thử máy chủ được lưu trữ, hãy tải lên một phiên bản riêng tư và mở https://www.playdrop.ai/create/games/<slug>/test?v=<version>&player=1, rồi mở cùng liên kết đó với player=2 trong cửa sổ thứ hai. Mỗi cửa sổ chơi như một người chơi thử riêng của bạn. Khi mọi thứ hoạt động, hãy xuất bản phiên bản đã thử bằng publish_game_version.
Hãy thiết kế cho trường hợp mất kết nối: cơ chế kết nối lại của Colyseus giữ chỗ trong một thời gian ngắn, và trạng thái của phòng nên cho phép người chơi quay lại tiếp tục chơi.