Spillerkontoer

Gi spillerne i spillet ditt en konto de beholder på tvers av hvert Aukimi-spill, med lagringer som følger dem fra én enhet til den neste, på Aukimis egen tjeneste eller på din egen server.

På én linje#

En spiller logger inn én gang på play.aukimi.com og finner den kontoen i hvert spill laget med Aukimi, lagringer inkludert. Spillet ditt spør etter kontoen; det håndterer aldri passordet.

Hvorfor spillet ditt aldri ser passordet#

Hvem som helst kan publisere et spill. Et spill som ba om et Aukimi-passord ville vært en fullstendig overbevisende phishing-side, og ingen mengde gode intensjoner fra din side ville endret hva en annen utvikler kunne sendt ut.

Så passordet skrives på play.aukimi.com og ingen andre steder. Spillet ditt kaller PlayerLoginAsync(), et nettleservindu åpner seg i Aukimis egne farger, spilleren godkjenner, og vinduet gir spillet ditt et token.

Det tokenet er utstedt for bare ditt spill. Et token for spill A vist til spill B avvises, ikke ignoreres, avvises. Det er poenget: kontoen er delt mellom spill, tilgangen er det ikke. Uten dette ville ett ondsinnet spill kunne lese en spillers lagringer i alle de andre.

Hva du mottar om en spiller#

To ting, og ikke mer:

Du fårDu får aldri
Et visningsnavn (PlayerName())E-postadressen
En ugjennomsiktig id, forskjellig i hvert spill (PlayerID())Noe som identifiserer dem andre steder

Id-en endres fra ett spill til det neste med vilje. To utviklere som sammenligner spillerlistene sine, kan ikke se at de ser på samme person. Det holder deg også som en behandler i stedet for en behandlingsansvarlig for dataene, som er et juridisk skille og ikke et dekorativt et.

Ingenting blokkerer spillsløyfen#

Hver kommando som snakker med nettverket, returnerer et jobbnummer, aldri et resultat. Sløyfen din fortsetter å kjøre i seksti bilder per sekund mens forespørselen er underveis, som er hele grunnen til at et spill ikke bare kan «vente på serveren».

job = PlayerLoginAsync()

Deretter, én gang per ramme:

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

Frigi jobben så snart du har lest den. En jobb du aldri frigir, holder resultatet sitt i minnet resten av økten. Ingenting bryter sammen, ingenting advarer deg, og lekkasjen viser seg bare i en lang spilløkt.

Å spille uten en konto#

Ikke alle vil registrere seg før de prøver et spill. PlayerGuestAsync(name$) oppretter en konto uten e-post, holdt i denne nettleseren.

Det er en ekte konto: den lagrer, den laster, og den kan kreves senere, spilleren legger til en e-post og et passord, og de eksisterende lagringene følger med uten å flytte seg.

Den ærlige hemmeligheten: å tømme nettleserens nettstedsdata mister den kontoen, og det finnes ingen måte å hente den tilbake på. Det er prisen for «ingen registrering», og spillet ditt bør si det i stedet for å la spilleren finne det ut selv. PlayerIsGuest() finnes akkurat for den setningen.

Å lagre#

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

Lagringen er JSON i din egen form, lagret mot paret (denne spilleren, dette spillet). Den følger dem til en annen nettleser, en annen maskin, en annen plattform.

For en håndfull verdier er SetCloudDataVariable() og CloudDataVariable() enklere, ingen jobb, ingen JSON. Sjekk CloudDataAllowed() først: den returnerer 0 når ingen spiller er logget inn, og å skrive likevel ville gått stille i null.

Å tegne skjermen#

Aukimi tegner ingen innloggingsskjema. Et skjema komponert av motoren ville alltid sett ut som en nettside sluppet oppå et pikselkunst-spill, og det ville vært den ene delen av spillet ditt du ikke kunne omforme.

Du tegner det. Den eneste delen som må komme fra nettleseren, er tekstinntasting, så CreateEditBox() gir deg et ekte inntastingsfelt du plasserer selv:

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

Player Account-demoen i Engines eksempelliste er en komplett fungerende skjerm på rundt hundre linjer. Åpne den, les den, og erstatt så hver Print() med ditt eget artwork.

Før noe av dette fungerer#

Spillet må deklareres fra din Aukimi-konto, under My games (aukimi.com/app/games): en tittel, adressen der det kan spilles, og adressene spillet ditt har lov til å returnere til. Frem til da returnerer PlayerAvailable() 0, og et godt spill sier «kontoer er ikke tilgjengelige» i stedet for å se ut som det henger.

Den samme skjermen er der du ser hvem som spiller. Les tallene for det de er: den teller spillere som logget inn og økter startet, aldri spilte spill. Et spill som aldri ber noen om å logge inn, viser ingenting der, og skjermen sier det i stedet for å vise en stille null.

Å bruke din egen kontoserver#

Alt over snakker med Aukimis kontotjeneste. Hvis du er vert for spillet ditt på din egen server, kan de samme tolv kommandoene snakke med din tjeneste i stedet, og skriptet ditt endrer seg ikke med én eneste linje.

I Engine: panelet Multiplayer → seksjonen Player accounts → velg My own server → fyll inn ett felt, adressen til serveren din. Den adressen er en innstilling for scenen, så to spill kan bruke to forskjellige tjenester.

To måter å logge en spiller inn på#

Valget tas i skriptet ditt, ikke i en innstilling. Begge formene finnes uansett hvilken server du peker mot.

Vinduet (det du allerede kjenner)#

job = PlayerLoginAsync()

Et vindu åpnes, spilleren logger inn der, og det gir spillet ditt tilbake retten til å handle på deres vegne. Med Aukimis tjeneste er det vinduet play.aukimi.com. Med din egen server er den siden din å bygge.

Direkte, med et brukernavn og et passord#

job = PlayerLoginAsync(username$, password$)

Ingen vindu. Spillet ditt leser det spilleren skrev på din egen skjerm og sender det til din server. Enklere å skrive, og det lar deg beholde spillets utseende fra start til slutt.

Advarsel: i denne formen reiser passordet fra spillet ditt til serveren din slik det ble skrevet. To konsekvenser, begge faste: adressen til serveren din må starte med https:// (bare en test på din egen maskin er unntatt), og denne formen er bare noensinne ment for en server du eier.

play.aukimi.com avviser den, med vilje. Aukimi vil aldri være i en posisjon der de kan se en spillers passord, og det bør heller ikke et spill du ikke skrev.

De to valgene er uavhengige av innstillingen: en hjemmelaget server kan gjerne bare tilby vinduet, og aldri godta et passord direkte.

Et konkret eksempel#

Et spill med sin egen «Logg inn»-skjerm: to tekstfelt tegnet av spillet, én knapp, og dette bak knappen.

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

Alt etter innloggingen er identisk med resten av denne siden: PlayerSaveAsync, PlayerLoadAsync, PlayerName og de andre vet ikke, og bryr seg ikke, om hvilken server som svarte.

Hva serveren din må svare på#

Fire adresser kreves, uansett hvilken innlogging du tilbyr:

Hva den er til forHva spillet forventer
Spille som gjestGi tilbake en konto uten e-post
Hvem er denne spillerenVisningsnavnet, id-en, om de er en gjest
Lese lagringenDe lagrede dataene
Skrive lagringenLagre det spillet sender

Deretter, avhengig av hva du velger å tilby:

  • Vindusformen trenger en innloggingsside på serveren din, som forteller spillet hvem som logget inn når det er ferdig.
  • Den direkte formen trenger én adresse til, som tar imot et brukernavn og et passord og svarer ja eller nei.

De nøyaktige adressene, formen på hvert svar og feilkodene finnes i depotet, i docs/engine-player-accounts.md. Den filen er kontrakten; denne siden er kartet.

Merk: ingenting av dette fungerer i en native eksport. Player*-kommandoene trenger en server å snakke med og en nettleser å snakke gjennom, og et native bygg har ingen av delene.

Kommandoene#

KommandoHva den gjør
PlayerAvailable()Er kontotjenesten konfigurert for dette spillet
PlayerLoginAsync()Åpner innloggingsvinduet. Returnerer en jobb
PlayerLoginAsync(user, pass)Logger inn direkte, bare på din egen server. Returnerer en jobb
PlayerGuestAsync()Oppretter en konto uten e-post. Returnerer en jobb
PlayerLoggedIn()Er noen logget inn akkurat nå
PlayerName()Deres visningsnavn
PlayerID()Deres ugjennomsiktige id, spesifikk for dette spillet
PlayerIsGuest()Er dette en konto uten e-post
PlayerSaveAsync()Skriver lagringen. Returnerer en jobb
PlayerLoadAsync()Leser den tilbake. Returnerer en jobb
PlayerRefreshAsync()Fornyer tokenet før det utløper
PlayerLogout()Logger ut på denne enheten
PlayerLastError()Hvorfor det siste kallet feilet