விளையாட்டாளர் கணக்குகள்
உங்கள் விளையாட்டின் விளையாட்டாளர்களுக்கு, ஒவ்வொரு Aukimi விளையாட்டிலும் தொடரும் ஒரு கணக்கைக் கொடுங்கள், Aukimi-இன் சேவையிலோ உங்கள் சொந்த சர்வரிலோ, ஒரு சாதனத்திலிருந்து மற்றொன்றுக்கு அவர்களைப் பின்தொடரும் saves-உடன்.
ஒரே வரியில்#
ஒரு விளையாட்டாளர் play.aukimi.com-இல் ஒருமுறை உள்நுழைந்து, Aukimi-ஆல் செய்யப்பட்ட ஒவ்வொரு விளையாட்டிலும் அந்தக் கணக்கைக் காண்கிறார் (saves உட்பட). உங்கள் விளையாட்டு கணக்கைக் கேட்கும்; அது கடவுச்சொல்லை ஒருபோதும் கையாளாது.
உங்கள் விளையாட்டு கடவுச்சொல்லை ஒருபோதும் ஏன் பார்ப்பதில்லை#
யார் வேண்டுமானாலும் ஒரு விளையாட்டை வெளியிடலாம். ஒரு Aukimi கடவுச்சொல்லைக் கேட்கும் ஒரு விளையாட்டு, முற்றிலும் நம்பத்தகுந்த ஒரு phishing பக்கமாக இருக்கும், மேலும் உங்கள் தரப்பில் எவ்வளவு நல்ல எண்ணங்கள் இருந்தாலும், வேறு ஒரு developer என்ன வெளியிடலாம் என்பதை அது மாற்றாது.
எனவே கடவுச்சொல் play.aukimi.com-இல் மட்டுமே தட்டச்சு
செய்யப்படுகிறது, வேறு எங்கும் இல்லை. உங்கள் விளையாட்டு
PlayerLoginAsync()-ஐ அழைக்கிறது, Aukimi-இன் சொந்த வண்ணங்களில் ஒரு
உலாவி சாளரம் திறக்கிறது, விளையாட்டாளர் ஒப்புதல் அளிக்கிறார்,
மேலும் சாளரம் உங்கள் விளையாட்டுக்கு ஒரு token-ஐ கொடுக்கிறது.
அந்த token உங்கள் விளையாட்டுக்கு மட்டும் வழங்கப்படுகிறது. விளையாட்டு A-க்கான ஒரு token, விளையாட்டு B-க்கு காட்டப்பட்டால் நிராகரிக்கப்படும், புறக்கணிக்கப்படுவதில்லை, நிராகரிக்கப்படும். அதுதான் விஷயம்: கணக்கு விளையாட்டுகளுக்கிடையே பகிரப்படுகிறது, அணுகல் பகிரப்படுவதில்லை. இது இல்லாவிட்டால், ஒரு தீங்கிழைக்கும் விளையாட்டு, மற்ற அனைத்திலும் ஒரு விளையாட்டாளரின் saves-ஐ படித்துவிடும்.
ஒரு விளையாட்டாளரைப் பற்றி நீங்கள் பெறுவது#
இரண்டு விஷயங்கள், அதற்கு மேல் இல்லை:
| நீங்கள் பெறுவது | நீங்கள் ஒருபோதும் பெறாதது |
|---|---|
ஒரு display பெயர் (PlayerName()) | மின்னஞ்சல் முகவரி |
ஒவ்வொரு விளையாட்டிலும் வேறுபட்ட ஒரு opaque id (PlayerID()) | வேறு எங்காவது அவர்களை அடையாளம் காட்டும் எதுவும் |
id ஒரு விளையாட்டிலிருந்து அடுத்ததற்கு வேண்டுமென்றே மாறுகிறது. தங்கள் விளையாட்டாளர் பட்டியல்களை ஒப்பிடும் இரண்டு developers-ஆல், அவர்கள் அதே நபரைப் பார்க்கிறார்கள் என்று சொல்ல முடியாது. இது அந்த தரவின் ஒரு controller-ஆக அல்லாமல் ஒரு processor-ஆக உங்களை வைத்திருக்கிறது, இது ஒரு சட்ட வேறுபாடு, அலங்காரமானது அல்ல.
எதுவும் game loop-ஐ தடுக்காது#
network-உடன் பேசும் ஒவ்வொரு command-உம் ஒரு job number-ஐ தரும், ஒருபோதும் ஒரு result அல்ல. request நடந்துகொண்டிருக்கும் போது உங்கள் loop ஒரு நொடிக்கு அறுபது frames-இல் இயங்கிக்கொண்டே இருக்கும் (ஒரு விளையாட்டால் வெறுமனே "சர்வருக்காகக் காத்திருக்க" முடியாததற்கான முழுக் காரணமும் இதுவே).
job = PlayerLoginAsync()
பிறகு, ஒரு frame-க்கு ஒருமுறை:
etat$ = PlatformJobState(job)
if etat$ = "done"
resultat$ = PlatformJobResult(job)
PlatformJobRelease(job)
endif
if etat$ = "error"
Print(PlatformJobError(job))
PlatformJobRelease(job)
endif
நீங்கள் படித்ததும் job-ஐ release செய்யுங்கள். நீங்கள் ஒருபோதும் release செய்யாத ஒரு job, அமர்வின் மீதம் அதன் result-ஐ நினைவகத்தில் வைத்திருக்கும். எதுவும் உடையாது, எதுவும் உங்களை எச்சரிக்காது, மேலும் அந்த leak ஒரு நீண்ட play அமர்வில் மட்டுமே தெரியும்.
கணக்கு இல்லாமல் விளையாடுதல்#
எல்லோரும் ஒரு விளையாட்டை முயற்சிப்பதற்கு முன் sign up செய்ய
விரும்புவதில்லை. PlayerGuestAsync(name$), இந்த உலாவியில்
வைக்கப்படும், மின்னஞ்சல் இல்லாத ஒரு கணக்கை உருவாக்குகிறது.
இது ஒரு உண்மையான கணக்கு: இது save செய்கிறது, load செய்கிறது, மற்றும் பின்னர் claim செய்யப்படலாம் (விளையாட்டாளர் ஒரு மின்னஞ்சலையும் கடவுச்சொல்லையும் சேர்க்கிறார், இருக்கும் saves நகராமலேயே பின்தொடரும்).
நேர்மையான சிக்கல்: உலாவியின் site தரவை அழிப்பது அந்தக் கணக்கை
இழக்கச் செய்கிறது, மேலும் அதை மீட்க வழி இல்லை. இதுதான் "no
sign-up"-இன் விலை, மேலும் விளையாட்டாளரே கண்டுபிடிக்க விடாமல் உங்கள்
விளையாட்டு இதைச் சொல்ல வேண்டும். சரியாக அந்த வாக்கியத்திற்காகவே
PlayerIsGuest() இருக்கிறது.
Saving#
job = PlayerSaveAsync(donnees$)
job = PlayerLoadAsync()
save என்பது உங்கள் சொந்த வடிவத்தின் JSON, (இந்த விளையாட்டாளர், இந்த விளையாட்டு) என்ற ஜோடிக்கு எதிராக சேமிக்கப்படுகிறது. இது அவர்களை வேறொரு உலாவிக்கும், வேறொரு கணினிக்கும், வேறொரு platform-க்கும் பின்தொடர்கிறது.
ஒரு சில மதிப்புகளுக்கு, SetCloudDataVariable() மற்றும்
CloudDataVariable() எளிமையானவை: job இல்லை, JSON இல்லை. முதலில்
CloudDataAllowed()-ஐ சரிபார்க்கவும்: எந்த விளையாட்டாளரும் sign in
செய்யவில்லை என்றால் இது 0-ஐ தரும், மேலும் எப்படியும் எழுதுவது
அமைதியாக எங்கும் போகாது.
திரையை வரைதல்#
Aukimi ஒரு sign-in படிவத்தையும் வரையாது. engine-ஆல் compose செய்யப்பட்ட ஒரு படிவம், எப்போதும் ஒரு பிக்சல்-ஆர்ட் விளையாட்டில் விழுந்த ஒரு web page போலவே தோன்றும், மேலும் அது உங்கள் விளையாட்டில் நீங்கள் restyle செய்ய முடியாத ஒரே பகுதியாக இருக்கும்.
அதை நீங்களே வரைகிறீர்கள். உலாவியிலிருந்து வர வேண்டிய ஒரே துண்டு
text entry, எனவே CreateEditBox(), நீங்களே position செய்யும் ஒரு
உண்மையான input field-ஐ தருகிறது:
CreateEditBox(1)
EditBoxPosition(1, 20, 42)
EditBoxSize(1, 60, 8)
nom$ = EditBoxText(1)
Engine-இன் sample பட்டியலில் உள்ள Player Account டெமோ, சுமார்
நூறு வரிகளில் முழுமையாக வேலை செய்யும் ஒரு திரை. அதைத் திறந்து,
படித்து, பிறகு ஒவ்வொரு Print()-ஐயும் உங்கள் சொந்த artwork-ஆல்
மாற்றவும்.
இவை எதுவும் வேலை செய்வதற்கு முன்#
விளையாட்டு உங்கள் Aukimi கணக்கிலிருந்து, My games-இன் கீழ்
(aukimi.com/app/games) அறிவிக்கப்பட வேண்டும்: ஒரு தலைப்பு, அது
விளையாடக்கூடிய முகவரி, மற்றும் உங்கள் விளையாட்டு திரும்பச் செல்ல
அனுமதிக்கப்பட்ட முகவரிகள். அது வரை PlayerAvailable() 0-ஐ தரும்,
மேலும் தொங்குவது போல் தோன்றுவதற்குப் பதிலாக, ஒரு நல்ல விளையாட்டு
"கணக்குகள் கிடைக்கவில்லை" என்று சொல்லும்.
யார் விளையாடுகிறார்கள் என்பதை நீங்கள் காணும் இடமும் அதே திரைதான். எண்களை அவை என்னவோ அப்படியே படிக்கவும்: இது sign in செய்த players-ஐயும் தொடங்கப்பட்ட sessions-ஐயும் கணக்கிடுகிறது, விளையாடப்பட்ட விளையாட்டுகளை அல்ல. யாரையும் sign in செய்யச் சொல்லாத ஒரு விளையாட்டு அங்கு எதையும் காட்டாது, மேலும் ஒரு அமைதியான பூஜ்ஜியத்தைக் காட்டுவதற்குப் பதிலாக திரை இதைச் சொல்லும்.
உங்கள் சொந்த account சர்வரைப் பயன்படுத்துதல்#
மேலே உள்ள அனைத்தும் Aukimi-இன் account சேவையுடன் பேசுகின்றன. நீங்கள் உங்கள் விளையாட்டை உங்கள் சொந்த சர்வரில் host செய்தால், அதே பன்னிரண்டு commands-உம் அதற்குப் பதிலாக உங்கள் சேவையுடன் பேசலாம், மேலும் உங்கள் script ஒரு வரி கூட மாறாது.
Engine-இல்: Multiplayer பேனல் → Player accounts பிரிவு → My own server-ஐ தேர்ந்தெடுக்கவும் → ஒரு field-ஐ நிரப்பவும், உங்கள் சர்வரின் முகவரி. அந்த முகவரி scene-இன் ஒரு அமைப்பு, எனவே இரண்டு விளையாட்டுகள் இரண்டு வெவ்வேறு சேவைகளைப் பயன்படுத்தலாம்.
ஒரு விளையாட்டாளரை sign in செய்ய இரண்டு வழிகள்#
தேர்வு ஒரு அமைப்பில் அல்ல, உங்கள் script-இல் செய்யப்படுகிறது. நீங்கள் எந்த சர்வரை நோக்கினாலும் இரண்டு வடிவங்களும் இருக்கும்.
சாளரம் (நீங்கள் ஏற்கனவே அறிந்தது)#
job = PlayerLoginAsync()
ஒரு சாளரம் திறக்கிறது, விளையாட்டாளர் அங்கு sign in செய்கிறார்,
மேலும் அது அவர்கள் சார்பாக செயல்படும் உரிமையை உங்கள்
விளையாட்டுக்குத் திருப்பித் தருகிறது. Aukimi-இன் சேவையுடன் அந்த
சாளரம் play.aukimi.com. உங்கள் சொந்த சர்வருடன், அந்தப் பக்கம்
நீங்கள் கட்டமைக்க வேண்டியது.
நேரடியாக, ஒரு username-உடனும் password-உடனும்#
job = PlayerLoginAsync(username$, password$)
சாளரம் இல்லை. விளையாட்டாளர் உங்கள் சொந்த திரையில் தட்டச்சு செய்ததை உங்கள் விளையாட்டு படித்து உங்கள் சர்வருக்கு அனுப்புகிறது. எழுத எளிமையானது, மேலும் இது உங்கள் விளையாட்டின் தோற்றத்தை முதலிலிருந்து கடைசி வரை வைத்திருக்க அனுமதிக்கிறது.
எச்சரிக்கை: இந்த வடிவத்தில், கடவுச்சொல் உங்கள் விளையாட்டிலிருந்து உங்கள் சர்வருக்கு தட்டச்சு செய்யப்பட்டபடியே பயணிக்கிறது. இரண்டு விளைவுகள், இரண்டும் உறுதியானவை: உங்கள் சர்வரின் முகவரி
https://-உடன் தொடங்க வேண்டும் (உங்கள் சொந்த கணினியில் ஒரு சோதனை மட்டுமே விதிவிலக்கு), மேலும் இந்த வடிவம் எப்போதுமே நீங்கள் சொந்தமாக வைத்திருக்கும் ஒரு சர்வருக்கானது மட்டுமே.
play.aukimi.comஇதை வேண்டுமென்றே நிராகரிக்கிறது. Aukimi ஒரு விளையாட்டாளரின் கடவுச்சொல்லைப் பார்க்கக்கூடிய நிலையில் ஒருபோதும் இருக்க விரும்பவில்லை, நீங்கள் எழுதாத ஒரு விளையாட்டும் அப்படி இருக்கக்கூடாது.
இரண்டு தேர்வுகளும் அமைப்பிலிருந்து சுயாதீனமானவை: ஒரு வீட்டில் தயாரிக்கப்பட்ட சர்வர், சாளரத்தை மட்டும் நன்றாக வழங்கி, ஒரு கடவுச்சொல்லை நேரடியாக ஒருபோதும் ஏற்காமல் இருக்கலாம்.
ஒரு உறுதியான உதாரணம்#
தன் சொந்த "Sign in" திரையுடன் ஒரு விளையாட்டு: விளையாட்டால் வரையப்பட்ட இரண்டு text fields, ஒரு பொத்தான், மற்றும் அந்த பொத்தானுக்குப் பின்னால் இது.
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
sign-in-க்குப் பிறகு அனைத்தும் இந்தப் பக்கத்தின் மற்ற பகுதியைப்
போலவே அப்படியே: PlayerSaveAsync, PlayerLoadAsync, PlayerName
மற்றும் மற்றவை, எந்த சர்வர் பதிலளித்தது என்பதை அறியாது,
கவலைப்படுவதும் இல்லை.
உங்கள் சர்வர் பதிலளிக்க வேண்டியது#
நீங்கள் எந்த sign-in-ஐ வழங்கினாலும், நான்கு முகவரிகள் தேவை:
| எதற்காக | விளையாட்டு எதிர்பார்ப்பது |
|---|---|
| ஒரு guest-ஆக விளையாடுதல் | மின்னஞ்சல் இல்லாத ஒரு கணக்கைத் திருப்பித் தருதல் |
| இந்த விளையாட்டாளர் யார் | display பெயர், id, அவர் ஒரு guest-ஆ என்பது |
| save-ஐ படித்தல் | சேமிக்கப்பட்ட தரவு |
| save-ஐ எழுதுதல் | விளையாட்டு அனுப்புவதை சேமிக்கவும் |
பிறகு, நீங்கள் எதை வழங்குகிறீர்கள் என்பதைப் பொறுத்து:
- சாளர வடிவத்திற்கு உங்கள் சர்வரில் ஒரு sign-in பக்கம் தேவை, அது முடிந்ததும் யார் sign in செய்தார்கள் என்பதை விளையாட்டுக்குச் சொல்லும்.
- நேரடி வடிவத்திற்கு இன்னும் ஒரு முகவரி தேவை, அது ஒரு username-ஐயும் password-ஐயும் எடுத்து ஆம் அல்லது இல்லை என்று பதிலளிக்கும்.
சரியான முகவரிகள், ஒவ்வொரு பதிலின் வடிவம் மற்றும் error codes
repository-இல், docs/engine-player-accounts.md-இல் உள்ளன. அந்த
கோப்பு தான் ஒப்பந்தம்; இந்தப் பக்கம் வரைபடம்.
குறிப்பு: இவை எதுவும் ஒரு native export-இல் வேலை செய்யாது.
Player*commands-க்கு பேச ஒரு சர்வரும், அதன் வழியாக பேச ஒரு உலாவியும் தேவை, ஒரு native build-க்கு இரண்டுமே இல்லை.
Commands#
| Command | அது என்ன செய்கிறது |
|---|---|
PlayerAvailable() | இந்த விளையாட்டுக்கு account சேவை கட்டமைக்கப்பட்டுள்ளதா |
PlayerLoginAsync() | sign-in சாளரத்தைத் திறக்கும். ஒரு job-ஐ தரும் |
PlayerLoginAsync(user, pass) | நேரடியாக, உங்கள் சொந்த சர்வரில் மட்டும் sign in செய்யும். ஒரு job-ஐ தரும் |
PlayerGuestAsync() | மின்னஞ்சல் இல்லாத ஒரு கணக்கை உருவாக்கும். ஒரு job-ஐ தரும் |
PlayerLoggedIn() | இப்போது யாராவது sign in செய்துள்ளனரா |
PlayerName() | அவர்களின் display பெயர் |
PlayerID() | இந்த விளையாட்டுக்கு உரிய, அவர்களின் opaque id |
PlayerIsGuest() | இது மின்னஞ்சல் இல்லாத ஒரு கணக்கா |
PlayerSaveAsync() | save-ஐ எழுதும். ஒரு job-ஐ தரும் |
PlayerLoadAsync() | அதை மீண்டும் படிக்கும். ஒரு job-ஐ தரும் |
PlayerRefreshAsync() | token காலாவதியாவதற்கு முன் அதை புதுப்பிக்கும் |
PlayerLogout() | இந்த சாதனத்தில் sign out செய்யும் |
PlayerLastError() | கடைசி அழைப்பு ஏன் தோல்வியடைந்தது |