Uruchamiaj gry
multiplayer
szybciej
Twórz i uruchamiaj projekty multiplayer czasu rzeczywistego na KidsGames. Framework open source dla Node.js z wbudowanym matchmakingiem, synchronizacją stanu i SDK dla Unity, Defold, Construct, Haxe, JavaScript i innych.
npm create kidsgames-app@latest ./my-server Поддерживает ваш любимый движок и платформу
Как это работает
Синхронизация состояния за считанные минуты
Opisz stan gry na serwerze. KidsGames automatycznie synchronizuje go ze wszystkimi klientami — bez ręcznej serializacji.
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); }}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 });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> );}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 });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}))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 });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)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});});#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);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 });Dlaczego KidsGames
Wszystko, czego potrzebujesz do multiplayera
Synchronizacja stanu w czasie rzeczywistym
Automatyczna binarna synchronizacja stanu. Opisz stan raz, a zostanie zsynchronizowany wszędzie.
Wbudowany matchmaking
Automatyczne tworzenie Rooms i łączenie graczy. Konfigurowalne filtrowanie i sortowanie.
Skalowalna architektura
Skaluj od 10 do 10 000+ CCU. Rozdzielaj Rooms między procesy i maszyny.
Odporny na oszustwa z natury
Autorytatywna architektura serwera. Klienci wysyłają dane wejściowe — decyzje podejmuje serwer.
SDK dla wielu platform
JavaScript, Unity, Defold, Construct 3, Haxe, Cocos Creator i inne. Używaj narzędzi, które już znasz.
Darmowy i open source
Licencja MIT. Darmowy na zawsze, także dla gier komercyjnych. Pełna kontrola nad infrastrukturą.
Showcase
Gry zbudowane na KidsGames
Wybór gier multiplayer stworzonych przez zadowolonych deweloperów.
Bez uzależnienia od dostawcy
Twój serwer, twoje zasady
KidsGames to zwykła aplikacja Node.js. Uruchamiaj go, gdzie chcesz: bez zamkniętych runtime, bez zamkniętych ekosystemów, bez niespodzianek.
Zwykły Node.js
Bez zamkniętego runtime. Serwer KidsGames to zwykła aplikacja Node.js: każdy pakiet npm i wszystkie znane narzędzia.
Hostuj, gdzie chcesz
AWS, Google Cloud, DigitalOcean, Fly.io, Railway, bare metal — jeśli działa tam Node.js, działa też KidsGames.
Nie chcesz zarządzać serwerami?
KidsGames Cloud zajmuje się wdrożeniem, skalowaniem i monitoringiem w 32 regionach na świecie. Od 15 €/miesiąc.
Porównanie
Co wyróżnia KidsGames
vs Photon
- Open source, własne serwery
- Bez niespodzianek w cenie za CCU
- Pełna kontrola po stronie serwera
vs Mirror
- Działa z każdym silnikiem gier
- Nie tylko Unity
- Działa jako samodzielny proces serwera
vs Nakama
- Prostsze API, szybsza nauka
- Natywne wsparcie TypeScript
- Stworzony do multiplayera opartego na Rooms
vs od zera
- Sprawdzony w produkcji
- Start w dni, nie w miesiące
- Aktywne wsparcie społeczności
Истории успеха
Нам доверяют инди-разработчики и студии по всему миру
"...the operational cost associated with running a KidsGames server is substantially lower than alternatives we tried."
"I had previously never worked with Websockets, authoritative multiplayer servers, or Node.js. But that wasn’t a problem, as KidsGames provided me with an intuitive start. This strong foundation allowed us to grow to where we are today."
"We have been in love with KidsGames since the first moment we discovered it. It is amazing to have such an extraordinary product available for free and as open source."
Сообщество
Присоединяйтесь к нашему сообществу
Общайтесь с тысячами разработчиков мультиплеерных игр
Нам доверяют
Нам доверяют игровые студии
Niezależni twórcy i studia tworzą gry multiplayer czasu rzeczywistego na KidsGames.
Стать партнёром