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 megkapsz | Amit 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.comszá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átszani | Adjon vissza egy email nélküli fiókot |
| Ki ez a játékos | A megjelenítendő nevet, az id-t, hogy vendég-e |
| A mentés beolvasása | A mentett adatot |
| A mentés írása | Tá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#
| Parancs | Mit 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 |