Hráčské účty

Dejte hráčům své hry účet, který si ponesou napříč každou hrou Aukimi, s uloženými pozicemi, které je budou sledovat z jednoho zařízení na druhé, na službě Aukimi nebo na vlastním serveru.

V jedné větě#

Hráč se jednou přihlásí na play.aukimi.com a najde ten účet v každé hře vytvořené s Aukimi, uložené pozice včetně. Vaše hra si o účet řekne; heslo nikdy neuvidí.

Proč vaše hra nikdy neuvidí heslo#

Hru může vydat kdokoli. Hra, která by si žádala heslo od Aukimi, by byla naprosto věrohodná phishingová stránka, a žádné dobré úmysly z vaší strany by nezměnily, co by mohl vydat jiný vývojář.

Takže se heslo píše na play.aukimi.com a nikde jinde. Vaše hra zavolá PlayerLoginAsync(), otevře se okno prohlížeče ve vlastních barvách Aukimi, hráč to schválí, a okno vaší hře předá token.

Ten token je vydaný jen pro vaši hru. Token pro hru A předložený hře B je odmítnutý, ne ignorovaný, odmítnutý. V tom je smysl: účet je sdílený mezi hrami, přístup není. Bez toho by jedna škodlivá hra mohla číst uložené pozice hráče ve všech ostatních.

Co se o hráči dozvíte#

Dvě věci, a nic víc:

DostaneteNikdy nedostanete
Zobrazované jméno (PlayerName())E-mailovou adresu
Neprůhledné id, jiné v každé hře (PlayerID())Cokoli, co je identifikuje jinde

Id se mění z jedné hry na druhou záměrně. Dva vývojáři, kteří porovnávají své seznamy hráčů, nepoznají, že se dívají na stejného člověka. Zároveň vás to drží jako zpracovatele, ne správce těchto dat, což je právní rozdíl, ne dekorativní.

Nic neblokuje herní smyčku#

Každý příkaz, který mluví se sítí, vrací číslo úlohy, nikdy výsledek. Vaše smyčka běží dál na šedesáti snímcích za sekundu, zatímco požadavek letí, což je celý důvod, proč hra nemůže jednoduše "počkat na server".

job = PlayerLoginAsync()

Pak, jednou za snímek:

etat$ = PlatformJobState(job)
if etat$ = "done"
    resultat$ = PlatformJobResult(job)
    PlatformJobRelease(job)
endif
if etat$ = "error"
    Print(PlatformJobError(job))
    PlatformJobRelease(job)
endif

Uvolněte úlohu, jakmile jste ji přečetli. Úloha, kterou nikdy neuvolníte, si drží výsledek v paměti po zbytek sezení. Nic se nerozbije, nic vás nevaruje, a únik se projeví až v dlouhém herním sezení.

Hraní bez účtu#

Ne každý chce se před vyzkoušením hry registrovat. PlayerGuestAsync(name$) vytvoří účet bez e-mailu, uložený v tomto prohlížeči.

Je to skutečný účet: ukládá, načítá, a lze ho později přivlastnit, hráč přidá e-mail a heslo, a existující uložené pozice se přenesou, aniž by se pohnuly.

Poctivý háček: vymazání dat webu v prohlížeči tento účet ztratí, a není cesta, jak ho obnovit. To je cena za "žádnou registraci", a vaše hra by to měla říct rovnou místo toho, aby to hráč zjistil sám. PlayerIsGuest() je tu přesně pro tuhle větu.

Ukládání#

job = PlayerSaveAsync(donnees$)
job = PlayerLoadAsync()

Uložená pozice je JSON vlastního tvaru, uložený vůči dvojici (tento hráč, tato hra). Sleduje ho do jiného prohlížeče, jiného počítače, jiné platformy.

Pro pár hodnot jsou SetCloudDataVariable() a CloudDataVariable() jednodušší, žádná úloha, žádný JSON. Nejdřív zkontrolujte CloudDataAllowed(): vrátí 0, když není přihlášený žádný hráč, a zápis by přesto tiše nikam nevedl.

Kreslení obrazovky#

Aukimi nekreslí žádný přihlašovací formulář. Formulář poskládaný enginem by vždycky vypadal jako webová stránka spuštěná na pixel-artovou hru, a byl by to jediný kus vaší hry, který byste nemohli přestylovat.

Kreslíte ho vy. Jediný kus, který musí přijít z prohlížeče, je textové pole, takže CreateEditBox() vám dá skutečné vstupní pole, které umístíte sami:

CreateEditBox(1)
EditBoxPosition(1, 20, 42)
EditBoxSize(1, 60, 8)
nom$ = EditBoxText(1)

Demo Player Account v seznamu ukázek Engine je kompletní funkční obrazovka na zhruba sto řádcích. Otevřete ji, přečtěte, pak nahraďte každý Print() vlastní grafikou.

Než tohle všechno začne fungovat#

Hra musí být deklarovaná z vašeho účtu Aukimi, pod My games (aukimi.com/app/games): název, adresa, na které se dá hrát, a adresy, na které se vaše hra smí vracet. Do té doby PlayerAvailable() vrací 0, a dobrá hra řekne "účty nejsou dostupné", místo aby vypadala, že zamrzla.

Na téže obrazovce vidíte, kdo hraje. Čtěte ta čísla za to, čím jsou: počítají hráče, kteří se přihlásili a spuštěná sezení, nikdy odehrané hry. Hra, která se nikdy nikoho nezeptá na přihlášení, tam neukáže nic, a obrazovka to řekne, místo aby ukázala tichou nulu.

Použití vlastního serveru pro účty#

Všechno výše mluví se službou účtů Aukimi. Pokud hostujete svou hru na vlastním serveru, stejných dvanáct příkazů může mluvit místo toho s vaší službou, a váš skript se nezmění o jediný řádek.

V Engine: panel Multiplayer → sekce Player accounts → zvolte My own server → vyplňte jedno pole, adresu svého serveru. Ta adresa je nastavení scény, takže dvě hry mohou používat dvě různé služby.

Dva způsoby, jak hráče přihlásit#

Volba se dělá ve vašem skriptu, ne v nastavení. Obě formy existují bez ohledu na to, na jaký server míříte.

Okno (co už znáte)#

job = PlayerLoginAsync()

Otevře se okno, hráč se v něm přihlásí, a to vaší hře předá právo jednat jeho jménem. Se službou Aukimi je to okno play.aukimi.com. S vlastním serverem je ta stránka vaše, abyste ji postavili.

Přímo, jménem a heslem#

job = PlayerLoginAsync(username$, password$)

Žádné okno. Vaše hra přečte, co hráč napsal na vaší vlastní obrazovce, a pošle to vašemu serveru. Jednodušší na napsání, a umožní vám to udržet vzhled vaší hry od začátku do konce.

Varování: v této formě cestuje heslo z vaší hry na váš server tak, jak bylo napsané. Dva důsledky, oba pevné: adresa vašeho serveru musí začínat https:// (výjimkou je jen test na vlastním počítači), a tato forma je určená jen pro server, který vlastníte vy.

play.aukimi.com ji odmítá, záměrně. Aukimi si nikdy nechce být v pozici, kdy vidí heslo hráče, a totéž by nemělo platit ani pro hru, kterou jste nenapsali vy.

Obě volby jsou nezávislé na nastavení: domácí server může klidně nabízet jen okno a nikdy nepřijímat heslo přímo.

Konkrétní příklad#

Hra s vlastní obrazovkou "Přihlásit se": dvě textová pole nakreslená hrou, jedno tlačítko, a tohle za tlačítkem.

job = PlayerLoginAsync(typedName$, typedPassword$)
DO
    etat$ = PlatformJobState(job)
    if etat$ = "done"
        PlatformJobRelease(job)
        Print("Welcome " + PlayerName())
    endif
    if etat$ = "error"
        PlatformJobRelease(job)
        Print(PlayerLastError())
    endif
    Sync()
LOOP

Všechno po přihlášení je totožné se zbytkem této stránky: PlayerSaveAsync, PlayerLoadAsync, PlayerName a ostatní nevědí, a je jim jedno, který server odpověděl.

Co musí váš server umět odpovědět#

Čtyři adresy jsou povinné, ať nabízíte kterékoli přihlášení:

Na co sloužíCo hra očekává
Hrát jako hostVrátit účet bez e-mailu
Kdo je tento hráčZobrazované jméno, id, jestli je host
Přečíst uloženou poziciUložená data
Zapsat uloženou poziciUložit, co hra pošle

Pak, podle toho, co se rozhodnete nabídnout:

  • Forma s oknem potřebuje přihlašovací stránku na vašem serveru, která hře řekne, kdo se přihlásil, jakmile je hotovo.
  • Přímá forma potřebuje ještě jednu adresu, která vezme jméno a heslo a odpoví ano nebo ne.

Přesné adresy, tvar každé odpovědi a chybové kódy jsou v repozitáři, v docs/engine-player-accounts.md. Ten soubor je smlouva; tato stránka je mapa.

Poznámka: nic z tohohle nefunguje v nativním exportu. Příkazy Player* potřebují server, se kterým mluví, a prohlížeč, skrz který mluví, a nativní build nemá ani jedno.

Příkazy#

PříkazCo dělá
PlayerAvailable()Je pro tuto hru nastavená služba účtů
PlayerLoginAsync()Otevře přihlašovací okno. Vrací úlohu
PlayerLoginAsync(user, pass)Přihlásí přímo, jen na vašem vlastním serveru. Vrací úlohu
PlayerGuestAsync()Vytvoří účet bez e-mailu. Vrací úlohu
PlayerLoggedIn()Je právě teď někdo přihlášený
PlayerName()Jeho zobrazované jméno
PlayerID()Jeho neprůhledné id, specifické pro tuto hru
PlayerIsGuest()Je to účet bez e-mailu
PlayerSaveAsync()Zapíše uloženou pozici. Vrací úlohu
PlayerLoadAsync()Načte ji zpět. Vrací úlohu
PlayerRefreshAsync()Obnoví token, než vyprší
PlayerLogout()Odhlásí na tomto zařízení
PlayerLastError()Proč poslední volání selhalo