Julkaise moninpelejä
pelejä
nopeammin
Rakenna ja julkaise reaaliaikaisia moninpelikokemuksia KidsGamesilla. Avoimen lähdekoodin framework Node.js:lle, jossa on sisäänrakennettu matchmaking, tilan synkronointi sekä SDK:t Unitylle, Defoldille, Constructille, Haxelle, JavaScriptille ja muille alustoille.
npm create kidsgames-app@latest ./my-server Поддерживает ваш любимый движок и платформу
Как это работает
Синхронизация состояния за считанные минуты
Опишите состояние игры на сервере. KidsGames автоматически синхронизирует его со всеми клиентами — без ручной сериализации.
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 });Miksi KidsGames
Kaikki tarvittava moninpeliin
Reaaliaikainen tilan synkronointi
Automaattinen binäärinen tilan synkronointi. Määrittele state kerran — se synkronoituu kaikkialle.
Sisäänrakennettu matchmaking
Automaattinen huoneiden luonti ja pelaajien yhdistäminen. Mukautettava suodatus ja lajittelu.
Skaalautuva arkkitehtuuri
Skaalaudu 10:stä yli 10 000 CCU:hun. Jaa huoneet prosessien ja koneiden kesken.
Huijauksen esto oletuksena
Server-authoritative-arkkitehtuuri. Asiakkaat lähettävät syötteen — palvelin tekee päätökset.
SDK:t eri alustoille
JavaScript, Unity, Defold, Construct 3, Haxe, Cocos Creator ja muut. Käytä tuttuja työkalujasi.
Ilmainen ja avoin lähdekoodi
MIT-lisenssi. Ilmainen ikuisesti, myös kaupallisiin peleihin. Täysi hallinta infrastruktuuriin.
Esittelyssä
KidsGamesilla tehtyjä pelejä
Valikoima moninpelejä, jotka tyytyväiset kehittäjät ovat luoneet.
Unboxing the Cryptic Killer tekijältä Eleven Puzzles
Knight's Edge tekijältä Lightfox Games
Seep King tekijältä Jaspreet Singh
Exploder.io tekijältä Piotr Dawidiuk
The Kraken Wakes tekijältä Charisma Entertainment
Exposed - Who's Most Likely To tekijältä VYS Games
Raft Wars Multiplayer tekijältä TinyDobbins
Ei toimittajaloukkua
Sinun palvelimesi — sinun sääntösi
KidsGames on tavallinen Node.js-sovellus. Ota se käyttöön missä tahansa: ei suljettuja ajonaikoja, ei suljettuja ekosysteemejä, ei yllätyksiä.
Tavallinen Node.js
Ei suljettua ajonaikaa. KidsGames-palvelimesi on tavallinen Node.js-sovellus: mikä tahansa npm-paketti, kaikki tutut työkalut.
Isännöinti missä tahansa
AWS, Google Cloud, DigitalOcean, Fly.io, Railway, bare metal — jos siellä toimii Node.js, siellä toimii KidsGames.
Etkö halua ylläpitää palvelimia?
KidsGames Cloud hoitaa käyttöönoton, skaalauksen ja valvonnan 32 sijainnissa ympäri maailmaa. Alk. 15 €/kk.
Vertailu
Miten KidsGames erottuu
vs Photon
- Avoin lähdekoodi, omat palvelimet
- Ei yllätyksiä CCU-hinnoittelussa
- Täysi hallinta palvelinpuolella
vs Mirror
- Toimii minkä tahansa pelimoottorin kanssa
- Ei sidottu Unityyn
- Toimii erillisenä palvelinprosessina
vs Nakama
- Yksinkertaisempi API, nopeampi oppia
- Natiivi TypeScript-tuki
- Rakennettu huonepohjaiseen moninpeliin
vs tyhjästä
- Todistettu tuotannossa
- Käynnistyy päivissä, ei kuukausissa
- Aktiivinen yhteisön tuki
Истории успеха
Нам доверяют инди-разработчики и студии по всему миру
"...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."
Сообщество
Присоединяйтесь к нашему сообществу
Общайтесь с тысячами разработчиков мультиплеерных игр
Нам доверяют
Нам доверяют игровые студии
Инди-разработчики и студии создают мультиплеерные игры в реальном времени на KidsGames.
Стать партнёром