KidsGames Cloud — закрытая бета

Запускайте мультиплеерные
игры
быстрее

Создавайте и запускайте мультиплеерные проекты в реальном времени на KidsGames. Открытый фреймворк для Node.js со встроенным матчмейкингом, синхронизацией состояния и SDK для Unity, Defold, Construct, Haxe, JavaScript и других платформ.

$ npm create kidsgames-app@latest ./my-server

Требуется Node.js

Поддерживает ваш любимый движок и платформу

Нам доверяют команды с миллионами игроков

Как это работает

Синхронизация состояния за считанные минуты

Опишите состояние игры на сервере. KidsGames автоматически синхронизирует его со всеми клиентами — без ручной сериализации.

GameRoom.ts Сервер
import { Room, Client } from "kidsgames";
import { GameState, Player } from "./GameState";
export class GameRoom extends Room {
state = new GameState();
messages = {
// listen for "move" messages from clients
move(client: Client, data: any) {
const player = this.state.players.get(client.sessionId);
if (player) {
player.x = data.x;
player.y = data.y;
}
},
}
onJoin(client: Client) {
const player = new Player();
this.state.players.set(client.sessionId, player);
}
onLeave(client: Client) {
this.state.players.delete(client.sessionId);
}
}
client.ts Client
import { Client, Callbacks } from "@kidsgames/sdk";
const client = new Client("https://your-server.com");
const room = await client.joinOrCreate("game_room");
const callbacks = Callbacks.get(room);
callbacks.onAdd("players", (player, key) => {
addSpriteForPlayer(player);
callbacks.onChange(player, () =>
moveSprite(key, player.x, player.y));
});
callbacks.onRemove("players", (player, key) =>
removeSpriteForPlayer(key));
room.send("move", { x: 10, y: 20 });
npm install @kidsgames/sdk
Game.tsx Client
import { Client } from "@kidsgames/sdk";
import { useRoom, useRoomState } from "@kidsgames/react";
const client = new Client("https://your-server.com");
function Game() {
const { room, isConnecting } = useRoom(
() => client.joinOrCreate("game_room"),
);
const state = useRoomState(room);
if (isConnecting) return <p>Connecting...</p>;
return (
<ul>
{state?.players.map((player, key) => (
<li key={key}>Player at {player.x}, {player.y}</li>
))}
</ul>
);
}
npm install @kidsgames/react
GameClient.cs Client
using KidsGames;
using KidsGames.Schema;
var client = new Client("https://your-server.com");
var room = await client.JoinOrCreate<GameState>("game_room");
var callbacks = Callbacks.Get(room);
callbacks.OnAdd(state => state.players, (sessionId, player) => {
AddSpriteForPlayer(player);
callbacks.OnChange(player, () =>
MoveSprite(sessionId, player.x, player.y));
});
callbacks.OnRemove(state => state.players, (sessionId, player) =>
RemoveSpriteForPlayer(sessionId));
await room.Send("move", new { x = 10, y = 20 });
client.gd Client
var client: KidsGamesClient = KidsGames.create_client()
client.set_endpoint("wss://your-server.com")
var room: KidsGamesRoom = client.join_or_create("game_room")
room.joined.connect(func():
var callbacks = KidsGames.callbacks(room)
callbacks.on_add("players", func(player, key):
add_sprite_for_player(player)
callbacks.on_change(player, func():
move_sprite(key, player.x, player.y)
)
)
callbacks.on_remove("players", func(player, key):
remove_sprite_for_player(key)
)
room.send("move", {"x": 10, "y": 20})
)
obj_client.gml Client
client = new KidsGamesClient("https://your-server.com");
room = client.join_or_create("game_room");
callbacks = KidsGamesCallbacks(room);
callbacks.on_add("players", function(player, key) {
add_sprite_for_player(player);
callbacks.on_change(player, function() {
move_sprite(key, player.x, player.y);
});
});
callbacks.on_remove("players", function(player, key) {
remove_sprite_for_player(key);
});
room.send("move", { x: 10, y: 20 });
client.lua Client
local KidsGamesSDK = require "kidsgames.sdk"
local client = KidsGamesSDK.Client("https://your-server.com")
client:join_or_create("game_room", function(room)
local callbacks = KidsGamesSDK.callbacks(room)
callbacks:on_add("players", function(player, key)
add_sprite_for_player(player)
callbacks:on_change(player, function()
move_sprite(key, player.x, player.y)
end)
end)
callbacks:on_remove("players", function(player, key)
remove_sprite_for_player(key)
end)
room:send("move", { x = 10, y = 20 })
end)
Client.hx Client
import io.kidsgames.Client;
import io.kidsgames.schema.Callbacks;
var client = new Client("https://your-server.com");
client.joinOrCreate("game_room", [], MyRoomState, function(err, room) {
var callbacks = Callbacks.get(room);
callbacks.onAdd("players", (player, key) -> {
addSpriteForPlayer(player);
callbacks.onChange(player, () ->
moveSprite(key, player.x, player.y));
});
callbacks.onRemove("players", (player, key) ->
removeSpriteForPlayer(key));
room.send("move", {x: 10, y: 20});
});
haxelib install kidsgames
client.c Client
#include "kidsgames.h"
kidsgames_client_t* client = kidsgames_client_new("https://your-server.com");
kidsgames_room_t* room = kidsgames_join_or_create(client, "game_room");
kidsgames_callbacks_t* callbacks = kidsgames_callbacks_get(room);
void on_player_add(kidsgames_state_t* player, const char* key) {
add_sprite_for_player(player);
kidsgames_on_change(callbacks, player, on_player_change, (void*)key);
}
void on_player_change(kidsgames_state_t* player, void* ctx) {
float x = kidsgames_get_float(player, "x");
float y = kidsgames_get_float(player, "y");
move_sprite((const char*)ctx, x, y);
}
kidsgames_on_add(callbacks, "players", on_player_add, NULL);
kidsgames_on_remove(callbacks, "players", on_player_remove, NULL);
kidsgames_room_send(room, "move", data, data_len);
game.js Client
const client = new KidsGames.Client("https://your-server.com");
const room = await client.joinOrCreate("game_room");
const callbacks = KidsGames.Callbacks.get(room);
callbacks.onAdd("players", (player, key) => {
const sprite = runtime.objects.Player.createInstance("Game", player.x, player.y);
callbacks.onChange(player, () => {
sprite.x = player.x;
sprite.y = player.y;
});
});
callbacks.onRemove("players", (player, key) => {
// destroy sprite instance
});
room.send("move", { x: 10, y: 20 });

Витрина

Игры на KidsGames

Подборка мультиплеерных игр, созданных довольными разработчиками.

Без привязки к вендору

Ваш сервер — ваши правила

KidsGames — обычное приложение на Node.js. Разворачивайте его где угодно: без проприетарных рантаймов, закрытых экосистем и сюрпризов.

Обычный Node.js

Никакого проприетарного рантайма. Ваш сервер KidsGames — это обычное приложение на Node.js: любой npm-пакет, любые привычные инструменты.

Хостинг где угодно

AWS, Google Cloud, DigitalOcean, Fly.io, Railway, bare metal — если там работает Node.js, значит работает и KidsGames.

Не хотите заниматься серверами?

KidsGames Cloud берёт на себя развёртывание, масштабирование и мониторинг в 32 локациях по всему миру. От 1 500 ₽/мес.

Сравнение

Чем KidsGames отличается

vs Photon

  • Открытый код, свои серверы
  • Без сюрпризов в цене за CCU
  • Полный контроль на стороне сервера

vs Mirror

  • Работает с любым игровым движком
  • Не привязан к Unity
  • Запускается как отдельный серверный процесс

vs Nakama

  • Проще API, быстрее освоить
  • Нативная поддержка TypeScript
  • Создан для мультиплеера на комнатах

vs с нуля

  • Проверен в продакшене
  • Запуск за дни, а не месяцы
  • Активная поддержка сообщества

Сообщество

Присоединяйтесь к нашему сообществу

Общайтесь с тысячами разработчиков мультиплеерных игр

759K+ Загрузки npm
NaNK Звёзды на GitHub
80 Контрибьюторы

Нам доверяют

Нам доверяют игровые студии

Инди-разработчики и студии создают мультиплеерные игры в реальном времени на KidsGames.

Стать партнёром