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år | Du 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.comavviser 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 for | Hva spillet forventer |
|---|---|
| Spille som gjest | Gi tilbake en konto uten e-post |
| Hvem er denne spilleren | Visningsnavnet, id-en, om de er en gjest |
| Lese lagringen | De lagrede dataene |
| Skrive lagringen | Lagre 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#
| Kommando | Hva 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 |