de Shukant Pal

Cum se folosește Firebase pentru construirea de jocuri Android multiplayer

Tocmai ți-ai construit jocul de masă pentru Android? Doriți să îl obțineți online? Sunteți în locul potrivit – să-l construim împreună!

Cum se foloseste Firebase pentru construirea de jocuri Android multiplayer

În acest articol, vom implementa potrivirea cu baza de date Firebase Realtime. Pentru aceasta, aveți nevoie de configurarea Firebase în proiectul dvs. Android – vedeți cum să faceți acest lucru aici.

Condiții prealabile

  • Utilizatorii Firebase – aici, presupunem că ați putut să vă autentificați utilizatorul în Firebase folosind orice metodă. Acest lucru este necesar pentru a identifica cu cine să comunice după terminarea meciurilor.
  • Dependențe Gradle – Adăugați acestea la dependencies blocați în fișierul de notă al modulului aplicației.
implementation 'com.google.firebase:firebase-core:16.0.6' implementation 'com.google.firebase:firebase-auth:16.1.0' implementation 'com.google.firebase:firebase-database:16.0.6'
  • Nu ați terminat după implementarea meciurilor. Asta pentru că ați găsit doar doi jucători care vor juca – dar nu ați implementat modul în care mișcările lor se vor răspândi în rețea.

Modelul nostru

Vom folosi un nod în baza de date Firebase numit camera de joc, care va stoca toate provocările active pe care utilizatorii le-au împins. Fiecare utilizator va căuta provocările existente în sala de joc și va accepta prima găsită. În caz contrar, utilizatorul își va încărca propria provocare și va aștepta până când cineva acceptă provocarea.

Veți putea adăuga mai multe funcții în implementarea de potrivire, cum ar fi potrivirea bazată pe evaluări de performanță similare, prieteni, părtinire regională etc.

Cum naiba vom implementa asta?

Am împărțit problema noastră în trei obiecte:

  • Matcher: Găsește orice meciuri existente în sala de joc.
  • SelfChallengeManager: Gestionează provocarea pe care un utilizator o încarcă dacă Matcher nu reușește să găsească pe cineva.
  • SelfChallengeCanceller: Anulează procesul de asociere dacă acest utilizator nu mai vrea să joace.

În plus, vom solicita un obiect „Provocare” care are două proprietăți – referința nodului de comunicare și ID-ul utilizatorului provocatorului (aflați de ce trebuie să ne conectăm acum la Firebase?). Acest obiect va fi încărcat în sala de jocuri de către SelfChallengeManager.

Scrierea componentelor noastre mai întâi

Înainte de a scrie cele trei componente ale noastre, trebuie să înțelegem ce este un Firebase tranzacţie este. Nu vrem ca doi utilizatori să accepte aceeași provocare în același timp – ceea ce ne-ar corupe baza de date și ne-ar enerva pe prețioșii noștri utilizatori. Tranzacțiile vin în ajutor prin prevenirea operațiunilor simultane pe un nod din baza de date (care va fi sala de joc).

Ce legătură are asta cu componentele noastre? – Componentele noastre vor fi modelate ca tranzacții ca clase interioare în clasa noastră „FirebasePlayerMatchMaker”.

https://gist.github.com/SukantPal/2c1f5daedfaee784bfeb622d4e26736e

Folosim două interfețe de apel invers – OnMatchMadeCallback și intern OnFailCallback. Metoda din fabrică necesită un OnMatchMadeCallback care se numește ori de câte ori se face o potrivire. OnFailCallback este invocat ori de câte ori MatchMaker nu reușește să găsească o potrivire.

Aici, findMatch rulează pe un fir separat și creează un OnFailCallback dacă Matcher nu găsește o potrivire. În acest caz, trebuie să creăm un SelfChallengeManager și rulați-l ca o tranzacție.

  1. Matcher

Aici doTransaction() metoda iterează peste toți copiii nodului camerei de joc și caută un Challenge care este compatibil pentru utilizatorul nostru. În mod implicit, isChallengeCompat se intoarce true, dar puteți schimba acest lucru adăugând constrângeri suplimentare, cum ar fi evaluările. Prima provocare compatibilă este apoi stocată și nodul provocării este șters (prin setarea valorii la null) în baza de date. Rețineți că prin ștergerea nodului, celălalt jucător va fi informat despre acceptare.

2. SelfChallengeManager

Aici doTransaction metoda adaugă un nod copil la GAME_RECORD nod din baza noastră de date. Aici se vor comunica mișcările jocului după meci. Apoi încarcă un Challenge în sala de joc și se adaugă ca un ValueEventListener. Ori de câte ori un alt utilizator acceptă cererea, acesta va șterge acest nod și acest utilizator va primi o notificare în timp ce ascultăm.

3. SelfChallengeCanceller

Codul nostru șterge doar nodul creat de SelfChallengeManager iterând peste toată sala de joc și găsind provocarea noastră. DAR ESTE INCOMPLET !! (Opțional) ar trebui să adăugați o caracteristică în care acest utilizator să demisioneze automat din joc dacă meciul a fost deja acceptat.

În OnMatchMadeCallback tu le furnizezi FirebasePlayerMatchMaker.newInstance, trebuie să inițializați comunicarea de joc care trebuie făcută în nod (pe cale) mGamePath.

Ai făcut-o. Mulțumesc pentru lectură!

Publicat inițial la hashnode.com.