Spillerkonti
Giv dit spils spillere en konto, de beholder på tværs af ethvert Aukimi-spil, med gemte spil, der følger dem fra én enhed til en anden, på Aukimis egen tjeneste eller på din egen server.
I én sætning#
En spiller logger ind én gang på play.aukimi.com og finder den konto i ethvert spil lavet med Aukimi, gemte spil inklusive. Dit spil beder om kontoen; det håndterer aldrig adgangskoden.
Hvorfor dit spil aldrig ser adgangskoden#
Alle kan udgive et spil. Et spil, der bad om en Aukimi-adgangskode, ville være en fuldstændig overbevisende phishing-side, og ingen mængde gode intentioner fra din side ville ændre, hvad en anden udvikler kunne udgive.
Så adgangskoden tastes på play.aukimi.com og ingen andre steder. Dit spil
kalder PlayerLoginAsync(), et browservindue åbner i Aukimis egne farver,
spilleren godkender, og vinduet giver dit spil et token.
Det token er udstedt kun til dit spil. Et token for spil A, der fremvises til spil B, afvises, ikke ignoreres, afvises. Det er hele pointen: kontoen deles mellem spil, adgangen gør ikke. Uden dette ville ét ondsindet spil kunne læse en spillers gemte spil i alle de andre.
Hvad du modtager om en spiller#
To ting, og ikke mere:
| Du får | Du får aldrig |
|---|---|
Et visningsnavn (PlayerName()) | E-mailadressen |
Et uigennemsigtigt id, forskelligt i hvert spil (PlayerID()) | Noget, der identificerer dem andre steder |
Id'et ændrer sig med vilje fra det ene spil til det næste. To udviklere, der sammenligner deres spillerlister, kan ikke se, at de kigger på den samme person. Det holder dig også som en processor snarere end en controller af de data, hvilket er en juridisk skelnen og ikke en dekorativ én.
Intet blokerer spil-loopet#
Enhver kommando, der taler med netværket, returnerer et job-nummer, aldrig et resultat. Dit loop bliver ved med at køre ved tres billeder i sekundet, mens forespørgslen er undervejs, hvilket er hele grunden til, at et spil ikke bare kan "vente på serveren".
job = PlayerLoginAsync()
Så, én gang pr. billede:
etat$ = PlatformJobState(job)
if etat$ = "done"
resultat$ = PlatformJobResult(job)
PlatformJobRelease(job)
endif
if etat$ = "error"
Print(PlatformJobError(job))
PlatformJobRelease(job)
endif
Frigiv jobbet, når du har læst det. Et job, du aldrig frigiver, holder sit resultat i hukommelsen resten af sessionen. Intet går i stykker, intet advarer dig, og lækagen viser sig først i en lang spilsession.
At spille uden en konto#
Ikke alle vil oprette sig, før de prøver et spil. PlayerGuestAsync(name$)
opretter en konto uden e-mail, gemt i denne browser.
Det er en rigtig konto: den gemmer, den indlæser, og den kan kræves senere, spilleren tilføjer en e-mail og en adgangskode, og de eksisterende gemte spil følger med uden at flytte sig.
Den ærlige hage: at rydde browserens webstedsdata mister den konto, og der er
ingen måde at genskabe den på. Det er prisen for "ingen oprettelse", og dit
spil bør sige det i stedet for at lade spilleren finde ud af det selv.
PlayerIsGuest() findes præcis til den sætning.
Gemme#
job = PlayerSaveAsync(donnees$)
job = PlayerLoadAsync()
Det gemte er JSON i din egen form, gemt mod parret (denne spiller, dette spil). Det følger dem til en anden browser, en anden maskine, en anden platform.
Til en håndfuld værdier er SetCloudDataVariable() og CloudDataVariable()
enklere, intet job, ingen JSON. Tjek CloudDataAllowed() først: den
returnerer 0, når ingen spiller er logget ind, og at skrive alligevel ville
stiltiende gå ingen steder.
Tegne skærmen#
Aukimi tegner ingen login-formular. En formular sammensat af motoren ville altid ligne en webside droppet ned på et pixel-art-spil, og det ville være den ene del af dit spil, du ikke kunne omstyle.
Du tegner den. Den eneste del, der skal komme fra browseren, er tekstindtastning,
så CreateEditBox() giver dig et rigtigt inputfelt, du selv placerer:
CreateEditBox(1)
EditBoxPosition(1, 20, 42)
EditBoxSize(1, 60, 8)
nom$ = EditBoxText(1)
Demoen Player Account i Engines eksempelliste er en komplet, fungerende
skærm på omkring hundrede linjer. Åbn den, læs den, og erstat derefter hvert
Print() med din egen grafik.
Før noget af dette virker#
Spillet skal erklæres fra din Aukimi-konto, under My games
(aukimi.com/app/games): en titel, adressen hvor det kan spilles, og de
adresser, dit spil har lov til at vende tilbage til. Indtil da returnerer
PlayerAvailable() 0, og et godt spil siger "konti er ikke tilgængelige" i
stedet for at fremstå som om det hænger.
Den samme skærm er, hvor du ser, hvem der spiller. Læs tallene for, hvad de er: den tæller spillere, der har logget ind og sessioner, der er startet, aldrig spil spillet. Et spil, der aldrig beder nogen om at logge ind, viser ingenting der, og skærmen siger det, i stedet for at vise en stiltiende nul.
Brug din egen kontoserver#
Alt ovenfor taler med Aukimis kontotjeneste. Hvis du hoster dit spil på din egen server, kan de samme tolv kommandoer tale med din tjeneste i stedet, og dit script ændrer sig ikke med en eneste linje.
I Engine: panelet Multiplayer → sektionen Player accounts → vælg My own server → udfyld ét felt, adressen på din server. Den adresse er en indstilling for scenen, så to spil kan bruge to forskellige tjenester.
To måder at logge en spiller ind på#
Valget træffes i dit script, ikke i en indstilling. Begge former findes, uanset hvilken server du peger på.
Vinduet (det, du allerede kender)#
job = PlayerLoginAsync()
Et vindue åbner, spilleren logger ind der, og det giver dit spil retten til
at handle på deres vegne. Med Aukimis tjeneste er det vindue
play.aukimi.com. Med din egen server er den side din at bygge.
Direkte, med et brugernavn og en adgangskode#
job = PlayerLoginAsync(username$, password$)
Intet vindue. Dit spil læser, hvad spilleren har tastet på din egen skærm, og sender det til din server. Enklere at skrive, og det lader dig beholde dit spils look fra start til slut.
Advarsel: i denne form rejser adgangskoden fra dit spil til din server som tastet. To konsekvenser, begge faste: adressen på din server skal starte med
https://(kun en test på din egen maskine er undtaget), og denne form er kun nogensinde ment til en server, du selv ejer.
play.aukimi.comafviser den, med vilje. Aukimi vil aldrig være i en position, hvor det kan se en spillers adgangskode, og det bør et spil, du ikke selv har skrevet, heller ikke.
De to valg er uafhængige af indstillingen: en hjemmelavet server kan udmærket kun tilbyde vinduet, og aldrig acceptere en adgangskode direkte.
Et konkret eksempel#
Et spil med sin egen "Log ind"-skærm: to tekstfelter tegnet af spillet, én knap, og dette bag 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 efter login er identisk med resten af denne side: PlayerSaveAsync,
PlayerLoadAsync, PlayerName og de andre ved ikke, og er ligeglade med,
hvilken server der svarede.
Hvad din server skal svare#
Fire adresser er påkrævet, uanset hvilken login du tilbyder:
| Hvad den er til | Hvad spillet forventer |
|---|---|
| Spil som gæst | Giv en konto uden e-mail tilbage |
| Hvem er denne spiller | Visningsnavnet, id'et, om de er en gæst |
| Læs det gemte | De gemte data |
| Skriv det gemte | Gem det, spillet sender |
Så, afhængigt af hvad du vælger at tilbyde:
- Vinduesformen kræver en login-side på din server, som fortæller spillet, hvem der loggede ind, når det er gjort.
- Den direkte form kræver én adresse mere, som tager et brugernavn og en adgangskode og svarer ja eller nej.
De præcise adresser, formen på hvert svar, og fejlkoderne findes i
repositoryet, i docs/engine-player-accounts.md. Den fil er kontrakten;
denne side er kortet.
Bemærk: intet af dette virker i en native eksport.
Player*-kommandoerne har brug for en server at tale med og en browser at tale igennem, og en native build har hverken eller.
Kommandoerne#
| Kommando | Hvad den gør |
|---|---|
PlayerAvailable() | Er kontotjenesten konfigureret til dette spil |
PlayerLoginAsync() | Åbner login-vinduet. Returnerer et job |
PlayerLoginAsync(user, pass) | Logger ind direkte, kun på din egen server. Returnerer et job |
PlayerGuestAsync() | Opretter en konto uden e-mail. Returnerer et job |
PlayerLoggedIn() | Er nogen logget ind lige nu |
PlayerName() | Deres visningsnavn |
PlayerID() | Deres uigennemsigtige id, specifikt for dette spil |
PlayerIsGuest() | Er dette en konto uden e-mail |
PlayerSaveAsync() | Skriver det gemte. Returnerer et job |
PlayerLoadAsync() | Læser det tilbage. Returnerer et job |
PlayerRefreshAsync() | Fornyer tokenet, før det udløber |
PlayerLogout() | Logger ud på denne enhed |
PlayerLastError() | Hvorfor det seneste kald fejlede |