Перейти к содержимому

Создавай игры. Серверы для мультиплеера предоставим мы.

Публикуй свои 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
  • Мультиплеер должен быть включён в кабинете
  • Токен привязан к вашей игре — нельзя подключиться к чужой комнате
  • Гости поддерживаются — регистрация не обязательна

Ограничения и стоимость

Игроков в комнате
до 4
Комнат на игру
до 2
Сообщений/сек
до 10
Размер сообщения
до 2 КБ
Бесплатный старт
без первоначальной оплаты
Далее
удержания из дохода игры

Бесплатный старт без аренды серверов. Расходы на мультиплеер учитываются прозрачно и удерживаются из будущего дохода игры по условиям платформы. Личные средства не списываются. Подробности — в кабинете разработчика.

Подключение в 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 — нельзя попасть в чужую игру.
Проверка: открыть игру в двух браузерах, в одном нажать "Быстрая игра", в другом тоже — должны встретиться.

Примеры и материалы

Исходник крестиков-ноликов — один HTML-файл. Посмотрите его как референс host-authoritative протокола: хост обрабатывает ходы, рассылает sync гостю.

Важно: «бесплатные серверы» означают бесплатный старт без первоначальной оплаты. Серверные расходы впоследствии удерживаются из дохода игры по условиям платформы. Базовая передача координат не защищает от читерства и не предназначена без доработок для соревновательных игр. Серверная логика игр в MVP не выполняется.