Создавай игры. Серверы для мультиплеера предоставим мы.
Публикуй свои HTML5-игры на Fimdi, подключай онлайн-мультиплеер без собственного сервера и зарабатывай на рекламе. Мы предоставляем готовую серверную инфраструктуру, комнаты для игроков и удобный SDK для интеграции.
Начни бесплатно — без аренды VPS и первоначальных платежей. Расходы на использование мультиплеера учитываются прозрачно и удерживаются из будущего дохода игры по условиям платформы.
Бесплатные серверы для мультиплеера
Запускай онлайн-игры без покупки и настройки собственного VPS. Fimdi предоставляет серверы на базе Colyseus для подключения игроков, создания комнат и обмена игровыми событиями.
Подключение мультиплеера с помощью ИИ
Не обязательно быть backend-разработчиком. Используй готовый SDK, примеры кода и инструкции для ИИ, чтобы добавить мультиплеер в существующую HTML5-игру.
Зарабатывай на своих играх
Получай долю подтверждённого рекламного дохода. Расходы на мультиплеер учитываются автоматически и погашаются из будущих заработков игры. Не нужно платить за серверы заранее.
Простая публикация HTML5-игр
Загрузи игру ZIP-архивом, настрой описание и обложку, отправь на модерацию. Поддерживаются как одиночные, так и мультиплеерные игры.
Быстрый старт
Три шага — и у вашей игры есть комнаты и реальное время.
1. Подключите SDK
Добавьте два скрипта в <head> вашего index.html:
<script src="https://cdn.jsdelivr.net/npm/colyseus.js@0.15.11/dist/colyseus.js"></script>
<script src="https://fimdi.ru/sdk/multiplayer/v1/fimdi-multiplayer.js"></script>
2. Включите мультиплеер в кабинете
В кабинете разработчика откройте свою игру → раздел «Мультиплеер» → «Включить бесплатный мультиплеер». Там же будет ID вашей игры.
3. Создайте комнату
// ID вашей игры — из кабинета разработчика
const mp = new FimdiMultiplayer({ gameId: 123 });
// Создать публичную комнату
const room = await mp.createRoom({ maxPlayers: 2, visibility: "public", name: "Алиса" });
console.log("Код приглашения:", room.inviteCode);
// Слушать события (Colyseus-совместимый API)
room.onMessage("playerJoined", (p) => console.log("Вошёл:", p.name));
room.onMessage("playerLeft", () => console.log("Соперник вышел"));
room.onMessage("message", (msg) => console.log(msg.type, msg.data));
// Отправлять сообщения
room.send("move", { x: 100, y: 200 });
// Выйти
await room.leave();
API SDK
FimdiMultiplayer
const mp = new FimdiMultiplayer({
gameId: 123, // ID игры (обязательно)
endpoint: null, // адрес сервера (автоматически из Laravel)
tokenUrl: "https://fimdi.ru/api/v1/multiplayer/token", // адрес Laravel (по умолчанию)
});
Методы
await mp.createRoom({ maxPlayers, visibility, name })
Создать комнату. visibility: "public" | "private". name — имя игрока. Возвращает комнату.
await mp.joinRoom("КОД", { name })
Подключиться по invite-коду (= roomId).
await mp.joinRandomRoom({ name, maxPlayers })
Matchmaking: подключиться к свободной публичной комнате или создать новую. Идеально для «Быстрой игры».
mp.destroy()
Отключить все комнаты и очистить обработчики.
Комната (Colyseus-совместимый API)
room.onMessage("message", fn)
Игровые сообщения. fn получает envelope: { type, data, from, fromSession }.
room.onMessage("playerJoined", fn)
Игрок вошёл. fn получает { uid, sessionId, name, players }.
room.onMessage("playerLeft", fn)
Игрок вышел. fn получает { uid, sessionId, players }.
room.onMessage("role", fn)
Роль при входе/реконнекте: { isHost, symbol, players, opponents }. symbol: "X" (хост) или "O" (гость).
room.onStateChange(fn)
Изменение синхронизируемого состояния (state.players — MapSchema).
room.onLeave(fn) / room.onError(fn)
Отключение (fn получает код) и ошибки.
room.on(event, fn)
Альтернативный API: "message", "playerJoined", "playerLeft", "stateChange", "leave", "error".
room.send(type, data)
Отправить игровое событие. Сервер рассылает остальным (не отправителю).
room.inviteCode
Код приглашения (= roomId). Отправьте другу.
room.leave()
Покинуть комнату. Автоматически вызывается при закрытии/обновлении вкладки.
room.state / room.players
Синхронизируемое состояние (MapSchema игроков).
Формат сообщений
room.send(type, data) отправляет сообщение.
Получатель видит envelope { type, data, from, fromSession }.
Отправитель не получает своё сообщение обратно — обрабатывайте его локально.
// Отправка
room.send("move", { x: 100, y: 200 });
room.send("chat", { text: "Привет!" });
// Получение
room.onMessage("message", (msg) => {
if (msg.type === "move") {
console.log(msg.from, "→", msg.data.x, msg.data.y);
}
if (msg.type === "chat") {
console.log(msg.from, ":", msg.data.text);
}
});
Ограничения: до 10 сообщений/сек на игрока, до 2 КБ на сообщение.
Как работает авторизация
SDK автоматически запрашивает у Laravel краткоживущий токен (2 минуты) при подключении. Colyseus проверяет подпись (HMAC-SHA256) и срок действия. Вам не нужно реализовывать ничего дополнительно.
- Игра должна быть опубликована на fimdi.ru
- Мультиплеер должен быть включён в кабинете
- Токен привязан к вашей игре — нельзя подключиться к чужой комнате
- Гости поддерживаются — регистрация не обязательна
Ограничения и стоимость
Бесплатный старт без аренды серверов. Расходы на мультиплеер учитываются прозрачно и удерживаются из будущего дохода игры по условиям платформы. Личные средства не списываются. Подробности — в кабинете разработчика.
Подключение в Phaser
В Phaser загружайте SDK и Colyseus в index.html, а используйте в сцене:
class GameScene extends Phaser.Scene {
async create() {
this.mp = new FimdiMultiplayer({ gameId: 123 });
this.room = await this.mp.joinRandomRoom({ maxPlayers: 4, visibility: "public", name: "Игрок" });
this.room.onMessage("message", (msg) => {
if (msg.type === "move") {
// Обновить позицию игрока msg.from
const sprite = this.otherPlayers[msg.from];
if (sprite) sprite.setPosition(msg.data.x, msg.data.y);
}
});
}
update() {
// Отправлять позицию при движении
if (this.input.keyboard.addKey("LEFT").isDown) {
this.player.x -= 2;
this.room.send("move", { x: this.player.x, y: this.player.y });
}
}
}
Частые ошибки
multiplayer_disabled
Мультиплеер отключён. Включите в кабинете разработчика.
invalid_token
Токен истёк или подделан. SDK запрашивает новый автоматически при переподключении.
game_mismatch
Попытка подключиться к комнате другой игры. Проверьте gameId.
room_full
Комната заполнена. Используйте joinRandomRoom или создайте новую.
Вы уже находитесь в другой комнате
Игрок автоматически выкидывается из старой комнаты при входе в новую.
Colyseus SDK not loaded
Не подключён colyseus.js. Добавьте скрипт до fimdi-multiplayer.js.
Подключить мультиплеер с помощью ИИ
Скопируйте промпт ниже и отдайте своему ИИ-агенту (ChatGPT, Claude, Cursor и т.д.). Он подключит мультиплеер к вашей игре.
Подключи мультиплеер Fimdi к моей HTML5-игре.
Шаг 1. Добавить в index.html:
<script src="https://cdn.jsdelivr.net/npm/colyseus.js@0.15.11/dist/colyseus.js"></script>
<script src="https://fimdi.ru/sdk/multiplayer/v1/fimdi-multiplayer.js"></script>
Шаг 2. После загрузки игры создать подключение:
const mp = new FimdiMultiplayer({ gameId: "ЗДЕСЬ_ID_ИГРЫ" });
// Быстрая игра (matchmaking):
const room = await mp.joinRandomRoom({ maxPlayers: 2, visibility: "public", name: "Игрок" });
// Или создать комнату по коду:
// const room = await mp.createRoom({ maxPlayers: 2, visibility: "public", name: "Игрок" });
// console.log("Код приглашения:", room.inviteCode);
Шаг 3. Подписаться на события:
room.onMessage("role", (d) => console.log("Роль:", d.isHost ? "хост" : "гость", d.symbol));
room.onMessage("playerJoined", (p) => console.log("Вошёл:", p.name));
room.onMessage("playerLeft", () => console.log("Соперник вышел"));
room.onMessage("message", (msg) => {
// msg.type — строка, msg.data — объект, msg.from — uid игрока
if (msg.type === "move") { /* обновить позицию */ }
});
Шаг 4. Отправлять игровые события:
room.send("move", { x: 100, y: 200 });
ВАЖНО: отправитель НЕ получает своё сообщение обратно — обрабатывайте его локально.
Ограничения: до 10 сообщений/сек, до 2 КБ на сообщение, до 4 игроков в комнате.
Безопасность: не передавать пароли, токены, секреты в сообщениях.
Изолированность: комнаты изолированы по gameId — нельзя попасть в чужую игру.
Проверка: открыть игру в двух браузерах, в одном нажать "Быстрая игра", в другом тоже — должны встретиться.
Примеры и материалы
- fimdi-multiplayer.js — исходник SDK
- Демо-игра «Два квадратика»
- Крестики-нолики — полноценная игра с matchmaking, именами, реваншем
Исходник крестиков-ноликов — один HTML-файл. Посмотрите его как референс host-authoritative протокола: хост обрабатывает ходы, рассылает sync гостю.
Важно: «бесплатные серверы» означают бесплатный старт без первоначальной оплаты. Серверные расходы впоследствии удерживаются из дохода игры по условиям платформы. Базовая передача координат не защищает от читерства и не предназначена без доработок для соревновательных игр. Серверная логика игр в MVP не выполняется.