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 dapat | Anda 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.commenolaknya, 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 digunakan | Apa yang dijangka oleh permainan |
|---|---|
| Bermain sebagai tetamu | Serahkan satu akaun tanpa e-mel |
| Siapa pemain ini | Nama paparan, id, sama ada mereka seorang tetamu |
| Baca simpanan | Data yang disimpan |
| Tulis simpanan | Simpan 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#
| Arahan | Apa 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 |