Játékosfiókok

Adj a játékod játékosainak egy fiókot, amelyet minden Aukimi-játékban megtartanak, olyan mentésekkel, amelyek követik őket egyik eszközről a másikra, az Aukimi szolgáltatásán vagy a saját szerveredén.

Egy mondatban#

Egy játékos egyszer jelentkezik be a play.aukimi.com oldalon, és ezt a fiókot megtalálja minden Aukimival készült játékban, mentésekkel együtt. A játékod kéri a fiókot; a jelszót sosem kezeli.

Miért nem látja a jelszót a játékod soha#

Bárki kiadhat egy játékot. Egy játék, amely Aukimi-jelszót kér, tökéletesen meggyőző adathalász oldal lenne, és semennyi jó szándék a te részedről nem változtatna azon, mit adhatna ki egy másik fejlesztő.

Ezért a jelszó a play.aukimi.com oldalon íródik be, és sehol máshol. A játékod meghívja a PlayerLoginAsync()-t, egy böngészőablak nyílik meg Aukimi saját színeivel, a játékos jóváhagyja, és az ablak átad a játékodnak egy tokent.

Ez a token csak a te játékodhoz lett kiállítva. Egy A játékhoz kiadott token, ha B játéknak mutatod be, elutasításra kerül, nem figyelmen kívül hagyásra, elutasításra. Ez a lényeg: a fiók meg van osztva a játékok között, a hozzáférés nincs. Enélkül egy rosszindulatú játék elolvashatná egy játékos mentéseit az összes többiben.

Mit kapsz meg egy játékosról#

Két dolgot, és nem többet:

Amit megkapszAmit sosem kapsz meg
Egy megjelenítendő nevet (PlayerName())Az email címet
Egy átlátszatlan id-t, játékonként eltérőt (PlayerID())Bármit, ami máshol azonosítja őket

Az id szándékosan változik játékról játékra. Két fejlesztő, aki összehasonlítja a játékoslistáját, nem tudja megállapítani, hogy ugyanazt a személyt látják-e. Ez emellett feldolgozóvá tesz, nem adatkezelővé annak az adatnak a tekintetében, ami jogi megkülönböztetés, nem díszítés.

Semmi nem blokkolja a játékciklust#

Minden parancs, amely a hálózattal beszél, egy job számot ad vissza, sosem eredményt. A ciklusod tovább fut hatvan képkockával másodpercenként, amíg a kérés úton van, és éppen ez az egész oka annak, hogy egy játék nem várhat egyszerűen a szerverre.

job = PlayerLoginAsync()

Aztán, képkockánként egyszer:

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

Engedd el a jobot, amint elolvastad. Egy job, amelyet sosem engedsz el, megtartja az eredményét a memóriában a munkamenet hátralévő részére. Semmi nem törik el, semmi nem figyelmeztet, és a szivárgás csak egy hosszú játékmenetben mutatkozik meg.

Játék fiók nélkül#

Nem mindenki akar regisztrálni, mielőtt kipróbál egy játékot. A PlayerGuestAsync(name$) egy email nélküli fiókot hoz létre, amelyet ez a böngésző tart meg.

Ez egy valódi fiók: ment, betölt, és később igényelhető, a játékos hozzáad egy emailt és egy jelszót, és a meglévő mentések átköltözés nélkül követik.

Az őszinte hátulütő: a böngésző oldaladatainak törlése elveszti ezt a fiókot, és nincs mód a visszaszerzésére. Ez a "nincs regisztráció" ára, és a játékodnak ezt ki kellene mondania ahelyett, hogy hagyná a játékost rájönni. A PlayerIsGuest() pontosan erre a mondatra való.

Mentés#

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

A mentés a saját alakod JSON-ja, a (ez a játékos, ez a játék) pár alapján tárolva. Követi őket egy másik böngészőbe, egy másik gépre, egy másik platformra.

Néhány érték esetén a SetCloudDataVariable() és a CloudDataVariable() egyszerűbb, nincs job, nincs JSON. Ellenőrizd előbb a CloudDataAllowed()-et: 0-t ad vissza, amikor nincs bejelentkezett játékos, és az írás mégis csendben a semmibe menne.

A képernyő megrajzolása#

Az Aukimi semmilyen bejelentkezési űrlapot nem rajzol. Egy motor által összeállított űrlap mindig úgy nézne ki, mint egy weboldal, amelyet egy pixelműves játékra ejtettek, és ez lenne a játékod egyetlen olyan része, amelyet nem tudnál átstílusozni.

Te rajzolod meg. Az egyetlen darab, aminek a böngészőből kell jönnie, a szövegbevitel, így a CreateEditBox() ad egy valódi beviteli mezőt, amelyet te helyezel el:

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

A Player Account demó az Engine mintalistájában egy teljesen működő képernyő, körülbelül száz sorban. Nyisd meg, olvasd el, aztán cserélj le minden Print()-et a saját grafikádra.

Mielőtt bármi ebből működne#

A játékot be kell jelenteni az Aukimi fiókodból, a My games alatt (aukimi.com/app/games): egy cím, a cím, ahol a játék játszható, és azok a címek, ahová a játékod visszatérhet. Eddig a pontig a PlayerAvailable() 0-t ad vissza, és egy jó játék azt mondja, "a fiókok nem elérhetők" ahelyett, hogy úgy tűnne, lefagyott.

Ugyanez a képernyő az, ahol látod, ki játszik. Olvasd a számokat annak, amik: azt számolja, hányan jelentkeztek be és hány munkamenet indult, sosem azt, hány játékot játszottak. Egy játék, amely sosem kér senkitől bejelentkezést, semmit nem mutat ott, és a képernyő ezt jelzi ahelyett, hogy egy néma nullát mutatna.

A saját fiókszervered használata#

A fentiek mindegyike az Aukimi fiókszolgáltatásával beszél. Ha a saját szervereden hosztolod a játékodat, ugyanaz a tizenkét parancs a te szolgáltatásoddal is beszélhet, és a scripted egyetlen sort sem változik.

Az Engine-ben: Multiplayer panel → Player accounts szakasz → válaszd a My own server opciót → tölts ki egy mezőt, a szervered címét. Az a cím a jelenet egy beállítása, így két játék két különböző szolgáltatást is használhat.

Két mód egy játékos bejelentkeztetésére#

A választás a scriptedben történik, nem egy beállításban. Mindkét forma létezik, bármelyik szerverre is mutatsz.

Az ablak (amit már ismersz)#

job = PlayerLoginAsync()

Egy ablak nyílik meg, a játékos ott jelentkezik be, és átadja a játékodnak a jogot, hogy a nevében cselekedjen. Az Aukimi szolgáltatásával az az ablak a play.aukimi.com. A saját szervereddel az az oldal a tiéd, hogy megépítsd.

Közvetlenül, felhasználónévvel és jelszóval#

job = PlayerLoginAsync(username$, password$)

Nincs ablak. A játékod beolvassa, mit gépelt be a játékos a saját képernyődön, és elküldi a saját szerverednek. Egyszerűbb megírni, és lehetővé teszi, hogy a játékod megjelenése végig egységes maradjon.

Figyelmeztetés: ebben a formában a jelszó úgy utazik a játékodtól a szerveredig, ahogy be lett gépelve. Két következmény van, mindkettő szilárd: a szervered címének https:// -sel kell kezdődnie (csak a saját gépeden végzett teszt mentesül ez alól), és ez a forma csak olyan szerverhez való, amely a tiéd.

A play.aukimi.com szándékosan elutasítja. Az Aukimi sosem akar olyan helyzetbe kerülni, hogy lássa egy játékos jelszavát, és egy játéknak sem kellene, amelyet nem te írtál.

A két választás független a beállítástól: egy házilag épített szerver tökéletesen kínálhatja csak az ablakot, és sosem fogadhat el jelszót közvetlenül.

Egy konkrét példa#

Egy játék a saját "Sign in" képernyőjével: két, a játék által rajzolt szövegmező, egy gomb, és ez a gomb mögött:

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

Minden, ami a bejelentkezés után jön, azonos ezen az oldalon a többivel: a PlayerSaveAsync, a PlayerLoadAsync, a PlayerName és a többiek nem tudják, és nem érdekli őket, melyik szerver válaszolt.

Amit a szerverednek válaszolnia kell#

Négy cím szükséges, bármelyik bejelentkezést kínálod is:

Mire valóMit vár a játék
Vendégként játszaniAdjon vissza egy email nélküli fiókot
Ki ez a játékosA megjelenítendő nevet, az id-t, hogy vendég-e
A mentés beolvasásaA mentett adatot
A mentés írásaTárolja, amit a játék küld

Aztán, attól függően, mit döntesz felkínálni:

  • Az ablak forma egy bejelentkezési oldalt igényel a szervereden, amely jelzi a játéknak, ki jelentkezett be, amint ez megtörtént.
  • A közvetlen forma még egy címet igényel, amely fogad egy felhasználónevet és egy jelszót, és igennel vagy nemmel válaszol.

A pontos címek, minden válasz alakja és a hibakódok a repositoryban vannak, a docs/engine-player-accounts.md fájlban. Az a fájl a szerződés; ez az oldal a térkép.

Megjegyzés: ebből semmi nem működik natív exportban. A Player* parancsoknak szerverre van szükségük, amivel beszélnek, és böngészőre, amelyen keresztül, és egy natív buildnek egyik sincs.

A parancsok#

ParancsMit csinál
PlayerAvailable()Be van-e állítva a fiókszolgáltatás ehhez a játékhoz
PlayerLoginAsync()Megnyitja a bejelentkezési ablakot. Egy jobot ad vissza
PlayerLoginAsync(user, pass)Közvetlenül jelentkezik be, csak a saját szervereden. Egy jobot ad vissza
PlayerGuestAsync()Egy email nélküli fiókot hoz létre. Egy jobot ad vissza
PlayerLoggedIn()Van-e éppen bejelentkezve valaki
PlayerName()A megjelenítendő nevük
PlayerID()Az átlátszatlan id-jük, ehhez a játékhoz
PlayerIsGuest()Email nélküli fiók-e
PlayerSaveAsync()Kiírja a mentést. Egy jobot ad vissza
PlayerLoadAsync()Visszaolvassa. Egy jobot ad vissza
PlayerRefreshAsync()Megújítja a tokent, mielőtt lejárna
PlayerLogout()Kijelentkezik ezen az eszközön
PlayerLastError()Miért hiúsult meg az utolsó hívás