Akaun pemain

Berikan pemain permainan anda satu akaun yang mereka bawa merentasi setiap permainan Aukimi, dengan simpanan yang mengikut mereka dari satu peranti ke satu peranti lain, pada perkhidmatan Aukimi atau pada pelayan anda sendiri.

Secara ringkas#

Seorang pemain log masuk sekali pada play.aukimi.com dan mendapati akaun itu dalam setiap permainan yang dibuat dengan Aukimi, termasuk simpanannya. Permainan anda meminta akaun itu; ia tidak pernah mengendalikan kata laluan.

Mengapa permainan anda tidak pernah melihat kata laluan#

Sesiapa sahaja boleh menerbitkan satu permainan. Satu permainan yang meminta kata laluan Aukimi akan menjadi satu laman pancingan data yang amat meyakinkan, dan tidak kira sebaik mana niat anda, itu tidak mengubah apa yang boleh dihantar oleh seorang pembangun lain.

Jadi kata laluan itu ditaip di play.aukimi.com dan tiada di tempat lain. Permainan anda memanggil PlayerLoginAsync(), satu tetingkap pelayar dibuka dengan warna Aukimi sendiri, pemain itu bersetuju, dan tetingkap itu menyerahkan satu token kepada permainan anda.

Token itu dikeluarkan untuk permainan anda sahaja. Satu token untuk permainan A yang dibentangkan kepada permainan B ditolak, bukan diabaikan, ditolak. Itulah maksudnya: akaun itu dikongsi antara permainan, akses itu tidak. Tanpa ini, satu permainan yang jahat boleh membaca simpanan seorang pemain dalam semua permainan lain.

Apa yang anda terima tentang seorang pemain#

Dua perkara, tidak lebih:

Anda dapatAnda tidak akan pernah dapat
Satu nama paparan (PlayerName())Alamat e-mel
Satu id legap, berbeza dalam setiap permainan (PlayerID())Apa-apa yang mengenal pasti mereka di tempat lain

Id itu berubah dari satu permainan ke permainan lain dengan sengaja. Dua pembangun yang membandingkan senarai pemain mereka tidak dapat mengetahui mereka sedang melihat orang yang sama. Ia juga mengekalkan anda sebagai satu pemproses dan bukannya satu pengawal data itu, dan itu adalah satu perbezaan undang-undang, bukan sekadar hiasan.

Tiada apa yang menyekat gelung permainan#

Setiap arahan yang berkomunikasi dengan rangkaian memulangkan satu nombor job, tidak pernah satu keputusan. Gelung anda terus berjalan pada enam puluh bingkai sesaat sementara permintaan itu dalam perjalanan, dan itulah keseluruhan sebab satu permainan tidak boleh sekadar "menunggu pelayan".

job = PlayerLoginAsync()

Kemudian, sekali setiap bingkai:

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

Lepaskan job itu sebaik sahaja anda membacanya. Satu job yang tidak pernah anda lepaskan mengekalkan keputusannya dalam memori untuk selebihnya sesi itu. Tiada apa yang rosak, tiada apa yang memberi amaran kepada anda, dan kebocoran itu hanya kelihatan dalam satu sesi permainan yang panjang.

Bermain tanpa satu akaun#

Bukan semua orang mahu mendaftar sebelum mencuba satu permainan. PlayerGuestAsync(name$) mencipta satu akaun tanpa e-mel, disimpan dalam pelayar ini.

Ia satu akaun sebenar: ia menyimpan, ia memuatkan, dan ia boleh dituntut kemudian, pemain itu menambah satu e-mel dan satu kata laluan, dan simpanan sedia ada mengikutinya tanpa berpindah.

Peringatan jujur: mengosongkan data laman pelayar kehilangan akaun itu, dan tiada cara untuk memulihkannya. Itulah harga bagi "tiada pendaftaran", dan permainan anda sepatutnya menyatakan begitu berbanding membiarkan pemain mendapati sendiri. PlayerIsGuest() wujud tepat untuk ayat itu.

Menyimpan#

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

Simpanan itu ialah JSON dalam bentuk anda sendiri, disimpan terhadap pasangan (pemain ini, permainan ini). Ia mengikut mereka ke satu pelayar lain, satu mesin lain, satu platform lain.

Untuk beberapa nilai sahaja, SetCloudDataVariable() dan CloudDataVariable() lebih ringkas, tiada job, tiada JSON. Semak CloudDataAllowed() dahulu: ia memulangkan 0 apabila tiada pemain log masuk, dan menulis dalam keadaan begitu akan pergi ke mana-mana sahaja secara senyap.

Melukis skrin#

Aukimi tidak melukis sebarang borang log masuk. Satu borang yang disusun oleh enjin akan sentiasa kelihatan seperti satu laman web yang dijatuhkan ke atas satu permainan piksel-art, dan ia akan menjadi satu-satunya bahagian permainan anda yang tidak boleh anda gayakan semula.

Anda melukisnya. Satu-satunya bahagian yang perlu datang daripada pelayar ialah kemasukan teks, jadi CreateEditBox() memberi anda satu medan input sebenar yang anda letakkan kedudukannya sendiri:

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

Demo Player Account dalam senarai sampel Engine ialah satu skrin berfungsi yang lengkap dalam kira-kira seratus baris. Buka, baca, kemudian gantikan setiap Print() dengan karya seni anda sendiri.

Sebelum sebarang daripada ini berfungsi#

Permainan itu mesti diisytiharkan daripada akaun Aukimi anda, di bawah My games (aukimi.com/app/games): satu tajuk, alamat di mana ia boleh dimainkan, dan alamat yang dibenarkan untuk permainan anda kembali kepadanya. Sehingga itu PlayerAvailable() memulangkan 0, dan satu permainan yang baik akan berkata "akaun tidak tersedia" berbanding kelihatan seperti tergantung.

Skrin yang sama itulah tempat anda melihat siapa yang sedang bermain. Baca nombor-nombor itu untuk apa sebenarnya: ia mengira pemain yang log masuk dan sesi yang dimulakan, tidak pernah permainan yang dimainkan. Satu permainan yang tidak pernah meminta sesiapa log masuk tidak menunjukkan apa-apa di situ, dan skrin itu menyatakan begitu berbanding menunjukkan satu sifar yang senyap.

Menggunakan pelayan akaun anda sendiri#

Segala-galanya di atas berkomunikasi dengan perkhidmatan akaun Aukimi. Jika anda menginap permainan anda pada pelayan anda sendiri, dua belas arahan yang sama boleh berkomunikasi dengan perkhidmatan anda sebaliknya, dan skrip anda tidak berubah walaupun satu baris.

Dalam Engine: panel Multiplayer → bahagian Player accounts → pilih My own server → isi satu medan, alamat pelayan anda. Alamat itu adalah satu tetapan adegan, jadi dua permainan boleh menggunakan dua perkhidmatan yang berbeza.

Dua cara untuk melog masuk seorang pemain#

Pilihan itu dibuat dalam skrip anda, bukan dalam satu tetapan. Kedua-dua bentuk wujud tidak kira pelayan mana yang anda tujukan.

Tetingkap itu (yang telah anda ketahui)#

job = PlayerLoginAsync()

Satu tetingkap dibuka, pemain log masuk di situ, dan ia menyerahkan kepada permainan anda hak untuk bertindak bagi pihak mereka. Dengan perkhidmatan Aukimi, tetingkap itu ialah play.aukimi.com. Dengan pelayan anda sendiri, laman itu milik anda untuk dibina.

Secara terus, dengan satu nama pengguna dan satu kata laluan#

job = PlayerLoginAsync(username$, password$)

Tiada tetingkap. Permainan anda membaca apa yang ditaip oleh pemain pada skrin anda sendiri dan menghantarnya ke pelayan anda. Lebih mudah untuk ditulis, dan ia membolehkan anda mengekalkan penampilan permainan anda dari awal hingga akhir.

Amaran: dalam bentuk ini, kata laluan itu bergerak daripada permainan anda ke pelayan anda seperti yang ditaip. Dua akibat, kedua-duanya tegas: alamat pelayan anda mesti bermula dengan https:// (hanya satu ujian pada mesin anda sendiri dikecualikan), dan bentuk ini hanya sesuai untuk satu pelayan yang anda miliki.

play.aukimi.com menolaknya, dengan sengaja. Aukimi tidak pernah mahu berada dalam kedudukan untuk melihat kata laluan seorang pemain, dan begitu juga satu permainan yang tidak anda tulis.

Kedua-dua pilihan itu bebas daripada tetapan itu: satu pelayan buatan sendiri boleh sepenuhnya menawarkan hanya tetingkap itu, dan tidak pernah menerima satu kata laluan secara terus.

Satu contoh konkrit#

Satu permainan dengan skrin "Sign in" sendiri: dua medan teks yang dilukis oleh permainan itu, satu butang, dan ini di sebalik butang itu.

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

Segala-galanya selepas log masuk itu adalah sama seperti selebihnya halaman ini: PlayerSaveAsync, PlayerLoadAsync, PlayerName dan yang lain tidak tahu, dan tidak kisah, pelayan mana yang menjawab.

Apa yang perlu dijawab oleh pelayan anda#

Empat alamat diperlukan, tidak kira log masuk mana yang anda tawarkan:

Untuk apa ia digunakanApa yang dijangka oleh permainan
Bermain sebagai tetamuSerahkan satu akaun tanpa e-mel
Siapa pemain iniNama paparan, id, sama ada mereka seorang tetamu
Baca simpananData yang disimpan
Tulis simpananSimpan apa yang dihantar oleh permainan

Kemudian, bergantung kepada apa yang anda pilih untuk ditawarkan:

  • Bentuk tetingkap memerlukan satu laman log masuk pada pelayan anda, yang memberitahu permainan siapa yang telah log masuk sebaik sahaja selesai.
  • Bentuk terus memerlukan satu lagi alamat, yang mengambil satu nama pengguna dan satu kata laluan dan menjawab ya atau tidak.

Alamat yang tepat, bentuk setiap jawapan dan kod ralat berada dalam repositori, dalam docs/engine-player-accounts.md. Fail itu adalah kontrak itu; halaman ini adalah peta.

Nota: tiada satu pun daripada ini berfungsi dalam satu eksport native. Arahan Player* memerlukan satu pelayan untuk bercakap dengannya dan satu pelayar untuk bercakap menerusinya, dan satu binaan native tiada kedua-duanya.

Arahan-arahan#

ArahanApa fungsinya
PlayerAvailable()Adakah perkhidmatan akaun dikonfigurasikan untuk permainan ini
PlayerLoginAsync()Membuka tetingkap log masuk. Memulangkan satu job
PlayerLoginAsync(user, pass)Log masuk secara terus, hanya pada pelayan anda sendiri. Memulangkan satu job
PlayerGuestAsync()Mencipta satu akaun tanpa e-mel. Memulangkan satu job
PlayerLoggedIn()Adakah seseorang sedang log masuk sekarang
PlayerName()Nama paparan mereka
PlayerID()Id legap mereka, khusus untuk permainan ini
PlayerIsGuest()Adakah ini satu akaun tanpa e-mel
PlayerSaveAsync()Menulis simpanan. Memulangkan satu job
PlayerLoadAsync()Membacanya semula. Memulangkan satu job
PlayerRefreshAsync()Memperbaharui token sebelum ia luput
PlayerLogout()Log keluar pada peranti ini
PlayerLastError()Sebab panggilan terakhir gagal