Google Play Spiele-Dienste: Bestenlisten
German (Deutsch) translation by Valentina (you can also view the original English article)
Die Google Play Spiele-Dienste bieten die Möglichkeit, Ihren Spielen über die Google+ Konten der Nutzer soziale Funktionen hinzuzufügen. In diesem Tutorial zeigen wir Ihnen, wie Sie einer Android-App Bestenlisten hinzufügen, Benutzerbewertungen einreichen und die aktuelle Rangliste innerhalb des Spiels präsentieren können.
Das Verwenden von Bestenlisten umfasst das Vorbereiten Ihrer IDE, das Konfigurieren der Bestenliste in der Google Play Entwickler-Konsole und das Hinzufügen von Funktionen zu Ihrer App.
Wenn Sie das kürzlich durchgeführte Tutorial zum Hinzufügen von Erfolgen zu Android-Apps abgeschlossen haben, können Sie einige der Schritte in diesem Schritt überspringen. Der angehängte Quellcode enthält dieselbe App, die wir für das Tutorial für Erfolge verwendet haben, wobei sowohl Funktionen für Erfolge als auch Bestenlisten hinzugefügt wurden.
1. Bereiten Sie Ihre IDE vor
Schritt 1
Um Google Play Dienste nutzen zu können, müssen bestimmte Dienstprogramme in Ihrer Entwicklungsumgebung installiert sein. Da wir Game Services verwenden, werden wir außerdem die BaseGameUtils-Bibliothek installieren, wodurch sich der Codierungsaufwand für die Implementierung von Funktionen wie der Google+ Anmeldung verringert.
Erstellen Sie zunächst eine neue App oder verwenden Sie eine vorhandene. Wenn Sie dem Leistungs-Tutorial gefolgt sind, können Sie die App verwenden, die Sie für dieses Tutorial erstellt haben. Wenn Sie Ihr eigenes Spiel erstellen, entscheiden Sie, wofür Sie Bestenlisten verwenden möchten und wann Sie eine Benutzerbewertung einreichen möchten. Jede Rangliste wird eine Zahl sein. Sie können die Rangliste so konfigurieren, dass niedrigere oder höhere Zahlenwerte in Bezug auf die Position in der Rangliste als besser angesehen werden. Dies hängt jedoch natürlich vom Zweck Ihres Spiels ab.
Der Code im Download-Ordner enthält ein einfaches Spiel, in dem der Benutzer eine Zahl errät. Wir werden die Anzahl der Vermutungen, die erforderlich sind, um die richtige Antwort zu erhalten, als Ranglistenpunktzahl verwenden. In diesem Fall sind weniger Vermutungen besser, sodass die Rangliste zuerst die niedrigsten Punktzahlen anzeigt. Der Einfachheit halber begrenzen wir die Anzahl der Vermutungen, die ein Benutzer treffen kann. Dies ist ein einfaches Beispiel, um das Konzept und die Funktionalität der Bestenliste zu demonstrieren. Ihre eigenen Spiele werden wahrscheinlich komplexer sein.
Schritt 2
Bereiten wir Eclipse für die Entwicklung mit Google Play Spiel-Dienste vor. Öffnen Sie den Android SDK Manager und scrollen Sie zum Ordner Extras. Erweitern Sie den Ordner und wählen Sie Google Play Dienste sowie das Google Repository aus. Installieren Sie die Google APIs-Plattform auch von einer der neuesten Android-Versionen, wenn Sie auf dem Emulator testen möchten. Installieren Sie die ausgewählten Pakete.
Schritt 3
Eclipse muss auch auf einige zusätzliche Ressourcen im Arbeitsbereich verweisen. Navigieren Sie auf Ihrem Computer unter extras/google/google_play_services/libproject/google-play-services_lib/ zum Speicherort der Google Play Dienste-Bibliothek, die sich im Android SDK-Ordner befinden sollte. Kopieren Sie die Bibliothek und fügen Sie sie an einer anderen Stelle auf Ihrem Computer ein.
Wir brauchen jetzt einen Verweis auf diese Kopie in Eclipse. Wählen Sie im Menü Datei die Option Importieren > Android > Vorhandenen Android-Code in den Arbeitsbereich importieren. Wählen Sie den Speicherort der von Ihnen erstellten Kopie. Die importierte Bibliothek sollte jetzt als neues Projekt in Eclipse angezeigt werden. Klicken Sie mit der rechten Maustaste darauf und wählen Sie Eigenschaften. Wählen Sie im Android-Bereich ein Build-Ziel für Google APIs aus und aktivieren Sie das Kontrollkästchen Ist Bibliothek.
Schritt 4
Das Importieren der BaseGameUtils-Ressource unterscheidet sich geringfügig. Die Bibliothek wird auf GitHub gehostet. Sie finden es im Bereich Downloads unter Beispielspiele. Laden Sie die Bibliothek herunter und speichern Sie sie auf Ihrem Computer.
Wählen Sie wie bei der Google Play Services-Bibliothek im Menü Datei die Option Importieren > Android > Vorhandenen Android-Code in den Arbeitsbereich importieren, um die BaseGameUtils-Bibliothek in Eclipse zu integrieren. Klicken Sie mit der rechten Maustaste, um zu den neuen Projekteigenschaften zu navigieren und sicherzustellen, dass das Projekt als Bibliothek markiert ist, indem Sie Ist Bibliothek aktivieren.
Schritt 5
Wir können die App jetzt dazu bringen, auf diese beiden Ressourcen im Arbeitsbereich zu verweisen. Klicken Sie im Paket-Explorer mit der rechten Maustaste auf Ihre App und wählen Sie Eigenschaften. Navigieren Sie zum Android-Bereich und wählen Sie im Bereich Bibliothek die Option Hinzufügen. Wählen Sie sowohl die Google Play Dienste-Bibliothek als auch BaseGameUtils aus und fügen Sie sie Ihrer App hinzu.
2. Bereiten Sie Ihr Spiel in der Entwicklerkonsole vor
Schritt 1
Bevor Sie eine Rangliste erstellen können, muss die App in der Google Play Entwickler-Konsole aufgeführt sein. Melden Sie sich an und klicken Sie links auf die Schaltfläche Spiel-Dienste. Wenn Sie dies bereits im Leistungs-Tutorial für Ihre App getan haben, müssen Sie es nicht erneut ausführen. Sie können zum Erstellen einer Rangliste mit Abschnitt 3 springen.
Klicken Sie auf Google Play-Spiel-Dienste einrichten.



Klicken Sie hier, um ein neues Spiel hinzuzufügen, wählen Sie Ich verwende noch keine Google-APIs in meinem Spiel und wählen Sie einen Namen und eine Kategorie für Ihr Spiel. Klicken Sie auf Weiter, um mit dem nächsten Schritt fortzufahren.



Fügen Sie den Titel Ihres Spiels hinzu. Sie können später weitere Details hinzufügen.
Schritt 2
Verknüpfen wir nun die App, damit wir in der App selbst auf diese Liste der Entwicklerkonsolen verweisen können. Klicken Sie links in der Liste auf den Eintrag Verknüpfte Apps und wählen Sie Android.



Geben Sie Ihre App-Informationen einschließlich des Paketnamens ein und stellen Sie sicher, dass diese mit denen übereinstimmen, die Sie in Ihrem Projekt verwenden.



Speichern Sie und klicken Sie auf Jetzt Ihre App autorisieren. Im Moment können Sie einfach den App-Namen hinzufügen, aber Sie können später weitere Details eingeben. Wählen Sie im Bereich Client-ID die Option Installierte Anwendung mit Android als Typ und geben Sie Ihren Paketnamen ein. Sie müssen jetzt das Dienstprogramm keytool verwenden, um ein Signaturzertifikat zu generieren. Sie können den folgenden Befehl in einem Terminal oder einer Eingabeaufforderung in Kombination mit dem Debug-Zertifikat verwenden:
1 |
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore -list -v |
Das Terminal oder die Eingabeaufforderung schreibt den Fingerabdruck für das Zertifikat aus. Kopieren Sie das, was Sie nach SHA1 sehen, und fügen Sie es in die Entwicklerkonsole im Textbereich Signaturzertifikat-Fingerabdruck ein.
Wählen Sie Client erstellen und kopieren Sie die ID für die Anwendung, die neben dem Anwendungsnamen in der Entwicklerkonsole aufgeführt ist. Sie fügen Ihrer App die ID zusammen mit der ID für die Bestenliste hinzu, die wir erstellen möchten.
3. Erstellen Sie eine Bestenliste
Schritt 1
Lassen Sie uns jetzt in der Entwicklerkonsole eine neue Bestenliste erstellen. Wählen Sie den Abschnitt Bestenlisten in Ihrer App-Liste aus und klicken Sie auf Bestenliste hinzufügen.



Stellen Sie sicher, dass Sie das Konzept der Bestenlisten unter Android und allgemein in Google Play Game Dienste verstehen. Sie können eine Übersicht auf der Website von Google Play Game Dienste lesen. Mit Bestenlisten können Sie tatsächlich viele verschiedene Dinge tun. Betrachten Sie also, was wir in diesem Tutorial tun, nur als Ausgangspunkt.
Geben Sie die Details für Ihre neue Rangliste ein. Für unseren Beispielcode verwenden wir den Namen "Least Guesses" und wählen im Abschnitt "Bestellen" die Option "Kleiner ist besser".



Fügen Sie ein Symbol hinzu, wenn Sie möchten. Wenn Sie dies nicht tun, wird ein Standardbild verwendet. Speichern Sie Ihre neue Rangliste und kopieren Sie ihre ID.
Schritt 2
Im Abschnitt Testen für Ihre App in der Entwicklerkonsole können Sie Konten hinzufügen, denen Zugriff zum Testen des Spiels gewährt wird. Standardmäßig wird dort Ihre eigene Google-Konto-E-Mail-Adresse angezeigt, sodass Sie sie zum Testen Ihrer App verwenden können sollten.
4. Vorbereiten Ihres Spiels für den Zugriff auf Spieledienste
Schritt 1
Es ist Zeit, die App für den Zugriff auf die Bestenliste in Eclipse vorzubereiten. Wenn Sie das Tutorial für Erfolge abgeschlossen haben, können Sie einen Teil dieses Abschnitts überspringen. Fügen wir zunächst die IDs für die App und die Bestenliste hinzu. Öffnen oder erstellen Sie eine Ressourcendatei res/values/ids.xml. Verwenden Sie die folgende Syntax, um die IDs einzugeben, die Sie für die App und die neue Bestenliste kopiert haben, als Sie sie in der Entwicklerkonsole erstellt haben:
1 |
<string name="app_id">1234567890</string> |
2 |
<string name="number_guesses_leaderboard">abcdefg1234567</string> |
Speichern Sie die Datei und öffnen Sie das Manifest des Projekts. Fügen Sie dem application-Element Folgendes hinzu:
1 |
<meta-data
|
2 |
android:name="com.google.android.gms.games.APP_ID" |
3 |
android:value="@string/app_id" /> |
4 |
<meta-data
|
5 |
android:name="com.google.android.gms.version" |
6 |
android:value="@integer/google_play_services_version" /> |
Die App ist jetzt so eingerichtet, dass sie mit den Einträgen verknüpft ist, die wir in der Entwicklerkonsole hinzugefügt haben.
Schritt 2
Wenn Sie Google Dienste in Ihren Android-Apps verwenden, müssen sich Ihre Nutzer in ihren Google-Konten anmelden. Sie können verschiedene Ansätze wählen, um dies zu implementieren. Wir werden jedoch Teile dieses Prozesses automatisieren, indem wir die BaseGameActivity-Klasse zusammen mit Standardschaltflächen zum An- und Abmelden verwenden. Wenn die Aktivität startet, versucht die App außerdem, den Benutzer sofort anzumelden.
Öffnen Sie die Hauptlayoutdatei Ihrer App und fügen Sie Schaltflächen zum An- und Abmelden hinzu:
1 |
<!-- sign-in button -->
|
2 |
|
3 |
<com.google.android.gms.common.SignInButton
|
4 |
android:id="@+id/sign_in_button" |
5 |
android:layout_width="wrap_content" |
6 |
android:layout_height="wrap_content" /> |
7 |
|
8 |
<!-- sign-out button -->
|
9 |
|
10 |
<Button
|
11 |
android:id="@+id/sign_out_button" |
12 |
android:layout_width="wrap_content" |
13 |
android:layout_height="wrap_content" |
14 |
android:text="Sign Out" |
15 |
android:visibility="gone" /> |
Schritt 3
Fügen Sie diese Importe Ihrer Haupt-Aktivity-Klasse hinzu:
1 |
import com.google.android.gms.games.Games; |
2 |
import com.google.example.games.basegameutils.BaseGameActivity; |
Lassen Sie die Activity-Klasse die BaseGameActivity-Klasse erweitern und auf Klicks warten:
1 |
public class MainActivity extends BaseGameActivity implements View.OnClickListener |
Bereiten Sie sich darauf vor, auf Klicks auf die Anmelde-/Abmeldeschaltflächen in onCreate zu reagieren:
1 |
findViewById(R.id.sign_in_button).setOnClickListener(this); |
2 |
findViewById(R.id.sign_out_button).setOnClickListener(this); |
Fügen Sie nun einer onClick-Methode in der Klasse die folgenden Standardmethoden hinzu:
1 |
@Override
|
2 |
public void onClick(View view) { |
3 |
if (view.getId() == R.id.sign_in_button) { |
4 |
beginUserInitiatedSignIn(); |
5 |
}
|
6 |
else if (view.getId() == R.id.sign_out_button) { |
7 |
signOut(); |
8 |
findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); |
9 |
findViewById(R.id.sign_out_button).setVisibility(View.GONE); |
10 |
}
|
11 |
}
|
Die Methoden, die wir hier aufrufen, werden von der BaseGameActivity-Klasse bereitgestellt, von der unsere Activity-Klasse erbt, sodass wir die Details nicht manuell verarbeiten müssen. Schließlich fügen wir einige Standardrückrufe hinzu:
1 |
public void onSignInSucceeded() { |
2 |
findViewById(R.id.sign_in_button).setVisibility(View.GONE); |
3 |
findViewById(R.id.sign_out_button).setVisibility(View.VISIBLE); |
4 |
}
|
5 |
|
6 |
@Override
|
7 |
public void onSignInFailed() { |
8 |
findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); |
9 |
findViewById(R.id.sign_out_button).setVisibility(View.GONE); |
10 |
}
|
Wenn wir die Leaderboard-Funktionalität aufrufen, überprüfen wir zunächst, ob die App eine Verbindung zu Google Dienste hat. Alternativ können Sie diesen Methoden Code hinzufügen, um die Kenntnis Ihrer App darüber zu verwalten, ob Spiel-Dienste aufgerufen werden können.
5. Implementieren Sie Ihre Bestenliste
Schritt 1
Jetzt können wir die App die Bestenliste verwenden lassen. Der Code in der Beispiel-App verwendet das folgende Layout. Ich werde nicht näher auf das Layout eingehen, da Ihre eigenen Apps ein anderes Layout haben.
1 |
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android" |
2 |
xmlns:tools="http://schemas.android.com/tools" |
3 |
android:layout_width="match_parent" |
4 |
android:layout_height="match_parent" |
5 |
android:paddingBottom="@dimen/activity_vertical_margin" |
6 |
android:paddingLeft="@dimen/activity_horizontal_margin" |
7 |
android:paddingRight="@dimen/activity_horizontal_margin" |
8 |
android:paddingTop="@dimen/activity_vertical_margin" |
9 |
tools:context="com.example.fungame.MainActivity" > |
10 |
|
11 |
<LinearLayout
|
12 |
android:id="@+id/sign_in_buttons" |
13 |
android:layout_width="fill_parent" |
14 |
android:layout_height="wrap_content" |
15 |
android:layout_alignParentTop="true" |
16 |
android:orientation="horizontal" > |
17 |
|
18 |
<!-- sign-in button -->
|
19 |
|
20 |
<com.google.android.gms.common.SignInButton
|
21 |
android:id="@+id/sign_in_button" |
22 |
android:layout_width="wrap_content" |
23 |
android:layout_height="wrap_content" /> |
24 |
|
25 |
<!-- sign-out button -->
|
26 |
|
27 |
<Button
|
28 |
android:id="@+id/sign_out_button" |
29 |
android:layout_width="wrap_content" |
30 |
android:layout_height="wrap_content" |
31 |
android:text="Sign Out" |
32 |
android:visibility="gone" /> |
33 |
</LinearLayout>
|
34 |
|
35 |
<RelativeLayout
|
36 |
android:id="@+id/gameArea" |
37 |
android:layout_width="fill_parent" |
38 |
android:layout_height="wrap_content" |
39 |
android:layout_below="@id/sign_in_buttons" > |
40 |
|
41 |
<TextView
|
42 |
android:id="@+id/guess_text" |
43 |
android:layout_width="fill_parent" |
44 |
android:layout_height="wrap_content" |
45 |
android:layout_centerHorizontal="true" |
46 |
android:text="Guess the number!" |
47 |
android:textSize="30sp" |
48 |
android:textStyle="bold" /> |
49 |
|
50 |
<LinearLayout
|
51 |
android:layout_width="fill_parent" |
52 |
android:layout_height="wrap_content" |
53 |
android:layout_below="@id/guess_text" |
54 |
android:orientation="vertical" > |
55 |
|
56 |
<LinearLayout
|
57 |
android:layout_width="fill_parent" |
58 |
android:layout_height="wrap_content" |
59 |
android:orientation="horizontal" > |
60 |
|
61 |
<Button
|
62 |
android:id="@+id/btn7" |
63 |
android:layout_width="0dp" |
64 |
android:layout_height="match_parent" |
65 |
android:layout_margin="1dp" |
66 |
android:layout_weight="1" |
67 |
android:background="#ff000033" |
68 |
android:gravity="center" |
69 |
android:onClick="btnPressed" |
70 |
android:padding="5dp" |
71 |
android:tag="7" |
72 |
android:text="7" |
73 |
android:textColor="#ffffffff" |
74 |
android:textSize="30sp" |
75 |
android:textStyle="bold" /> |
76 |
|
77 |
<Button
|
78 |
android:id="@+id/btn8" |
79 |
android:layout_width="0dp" |
80 |
android:layout_height="match_parent" |
81 |
android:layout_margin="1dp" |
82 |
android:layout_weight="1" |
83 |
android:background="#ff000033" |
84 |
android:gravity="center" |
85 |
android:onClick="btnPressed" |
86 |
android:padding="5dp" |
87 |
android:tag="8" |
88 |
android:text="8" |
89 |
android:textColor="#ffffffff" |
90 |
android:textSize="30sp" |
91 |
android:textStyle="bold" /> |
92 |
|
93 |
<Button
|
94 |
android:id="@+id/btn9" |
95 |
android:layout_width="0dp" |
96 |
android:layout_height="match_parent" |
97 |
android:layout_margin="1dp" |
98 |
android:layout_weight="1" |
99 |
android:background="#ff000033" |
100 |
android:gravity="center" |
101 |
android:onClick="btnPressed" |
102 |
android:padding="5dp" |
103 |
android:tag="9" |
104 |
android:text="9" |
105 |
android:textColor="#ffffffff" |
106 |
android:textSize="30sp" |
107 |
android:textStyle="bold" /> |
108 |
</LinearLayout>
|
109 |
|
110 |
<LinearLayout
|
111 |
android:layout_width="fill_parent" |
112 |
android:layout_height="wrap_content" |
113 |
android:layout_weight="1" |
114 |
android:orientation="horizontal" > |
115 |
|
116 |
<Button
|
117 |
android:id="@+id/btn4" |
118 |
android:layout_width="0dp" |
119 |
android:layout_height="match_parent" |
120 |
android:layout_margin="1dp" |
121 |
android:layout_weight="1" |
122 |
android:background="#ff000033" |
123 |
android:gravity="center" |
124 |
android:onClick="btnPressed" |
125 |
android:padding="5dp" |
126 |
android:tag="4" |
127 |
android:text="4" |
128 |
android:textColor="#ffffffff" |
129 |
android:textSize="30sp" |
130 |
android:textStyle="bold" /> |
131 |
|
132 |
<Button
|
133 |
android:id="@+id/btn5" |
134 |
android:layout_width="0dp" |
135 |
android:layout_height="match_parent" |
136 |
android:layout_margin="1dp" |
137 |
android:layout_weight="1" |
138 |
android:background="#ff000033" |
139 |
android:gravity="center" |
140 |
android:onClick="btnPressed" |
141 |
android:padding="5dp" |
142 |
android:tag="5" |
143 |
android:text="5" |
144 |
android:textColor="#ffffffff" |
145 |
android:textSize="30sp" |
146 |
android:textStyle="bold" /> |
147 |
|
148 |
<Button
|
149 |
android:id="@+id/btn6" |
150 |
android:layout_width="0dp" |
151 |
android:layout_height="match_parent" |
152 |
android:layout_margin="1dp" |
153 |
android:layout_weight="1" |
154 |
android:background="#ff000033" |
155 |
android:gravity="center" |
156 |
android:onClick="btnPressed" |
157 |
android:padding="5dp" |
158 |
android:tag="6" |
159 |
android:text="6" |
160 |
android:textColor="#ffffffff" |
161 |
android:textSize="30sp" |
162 |
android:textStyle="bold" /> |
163 |
</LinearLayout>
|
164 |
|
165 |
<LinearLayout
|
166 |
android:layout_width="fill_parent" |
167 |
android:layout_height="wrap_content" |
168 |
android:layout_weight="1" |
169 |
android:orientation="horizontal" > |
170 |
|
171 |
<Button
|
172 |
android:id="@+id/btn1" |
173 |
android:layout_width="0dp" |
174 |
android:layout_height="match_parent" |
175 |
android:layout_margin="1dp" |
176 |
android:layout_weight="1" |
177 |
android:background="#ff000033" |
178 |
android:gravity="center" |
179 |
android:onClick="btnPressed" |
180 |
android:padding="5dp" |
181 |
android:tag="1" |
182 |
android:text="1" |
183 |
android:textColor="#ffffffff" |
184 |
android:textSize="30sp" |
185 |
android:textStyle="bold" /> |
186 |
|
187 |
<Button
|
188 |
android:id="@+id/btn2" |
189 |
android:layout_width="0dp" |
190 |
android:layout_height="match_parent" |
191 |
android:layout_margin="1dp" |
192 |
android:layout_weight="1" |
193 |
android:background="#ff000033" |
194 |
android:gravity="center" |
195 |
android:onClick="btnPressed" |
196 |
android:padding="5dp" |
197 |
android:tag="2" |
198 |
android:text="2" |
199 |
android:textColor="#ffffffff" |
200 |
android:textSize="30sp" |
201 |
android:textStyle="bold" /> |
202 |
|
203 |
<Button
|
204 |
android:id="@+id/btn3" |
205 |
android:layout_width="0dp" |
206 |
android:layout_height="match_parent" |
207 |
android:layout_margin="1dp" |
208 |
android:layout_weight="1" |
209 |
android:background="#ff000033" |
210 |
android:gravity="center" |
211 |
android:onClick="btnPressed" |
212 |
android:padding="5dp" |
213 |
android:tag="3" |
214 |
android:text="3" |
215 |
android:textColor="#ffffffff" |
216 |
android:textSize="30sp" |
217 |
android:textStyle="bold" /> |
218 |
</LinearLayout>
|
219 |
|
220 |
<LinearLayout
|
221 |
android:layout_width="fill_parent" |
222 |
android:layout_height="wrap_content" |
223 |
android:layout_weight="1" |
224 |
android:orientation="horizontal" > |
225 |
|
226 |
<Button
|
227 |
android:id="@+id/btn0" |
228 |
android:layout_width="0dp" |
229 |
android:layout_height="match_parent" |
230 |
android:layout_margin="1dp" |
231 |
android:layout_weight="1" |
232 |
android:background="#ff000033" |
233 |
android:gravity="center" |
234 |
android:onClick="btnPressed" |
235 |
android:padding="5dp" |
236 |
android:tag="0" |
237 |
android:text="0" |
238 |
android:textColor="#ffffffff" |
239 |
android:textSize="30sp" |
240 |
android:textStyle="bold" /> |
241 |
|
242 |
<Button
|
243 |
android:id="@+id/btnAgain" |
244 |
android:layout_width="0dp" |
245 |
android:layout_height="match_parent" |
246 |
android:layout_margin="1dp" |
247 |
android:layout_weight="1" |
248 |
android:background="#ffffff00" |
249 |
android:enabled="false" |
250 |
android:gravity="center" |
251 |
android:onClick="btnPressed" |
252 |
android:padding="5dp" |
253 |
android:tag="-1" |
254 |
android:text="Again" |
255 |
android:textColor="#ffffff00" |
256 |
android:textSize="30sp" |
257 |
android:textStyle="bold" /> |
258 |
</LinearLayout>
|
259 |
</LinearLayout>
|
260 |
</RelativeLayout>
|
261 |
|
262 |
<LinearLayout
|
263 |
android:id="@+id/play_buttons" |
264 |
android:layout_width="fill_parent" |
265 |
android:layout_height="wrap_content" |
266 |
android:layout_below="@id/gameArea" |
267 |
android:gravity="center" |
268 |
android:orientation="horizontal" > |
269 |
|
270 |
<!-- show achievements -->
|
271 |
|
272 |
<Button
|
273 |
android:id="@+id/show_achievements" |
274 |
android:layout_width="wrap_content" |
275 |
android:layout_height="wrap_content" |
276 |
android:text="Achievements" /> |
277 |
|
278 |
<!-- show leaderboards -->
|
279 |
|
280 |
<Button
|
281 |
android:id="@+id/show_leaderboard" |
282 |
android:layout_width="wrap_content" |
283 |
android:layout_height="wrap_content" |
284 |
android:text="Leaderboard" /> |
285 |
</LinearLayout>
|
286 |
|
287 |
</RelativeLayout>
|
Wir fügen Schaltflächen hinzu, um sowohl auf Erfolge als auch auf Bestenlisten für die App zuzugreifen. Wenn Sie das Tutorial für Erfolge noch nicht abgeschlossen haben, können Sie die Schaltfläche Erfolge entfernen.
Zurück in der Aktivity-Klasse Ihrer Anwendung verwenden wir die folgenden Instanzvariablen:
1 |
private Button button0, button1, button2, button3, button4, button5, |
2 |
button6, button7, button8, button9, buttonAgain; |
3 |
private int number; |
4 |
private Random rand; |
5 |
private TextView info; |
6 |
private int numGuesses=0; |
Wenn Sie das Tutorial für Erfolge abgeschlossen haben, werden Sie möglicherweise eine zusätzliche Variable, numGuesses, bemerken, um die Anzahl der Benutzerschätzungen jedes Mal zu verfolgen, wenn sie das Spiel spielen.
Sie benötigen den folgenden zusätzlichen Code in der onCreate-Methode der Activity-Klasse. Wenn Sie die Schaltfläche "Erfolge" nicht verwenden, entfernen Sie die Zeile, die darauf verweist.
1 |
findViewById(R.id.show_achievements).setOnClickListener(this); |
2 |
findViewById(R.id.show_leaderboard).setOnClickListener(this); |
3 |
|
4 |
button0=(Button)findViewById(R.id.btn0); |
5 |
button1=(Button)findViewById(R.id.btn1); |
6 |
button2=(Button)findViewById(R.id.btn2); |
7 |
button3=(Button)findViewById(R.id.btn3); |
8 |
button4=(Button)findViewById(R.id.btn4); |
9 |
button5=(Button)findViewById(R.id.btn5); |
10 |
button6=(Button)findViewById(R.id.btn6); |
11 |
button7=(Button)findViewById(R.id.btn7); |
12 |
button8=(Button)findViewById(R.id.btn8); |
13 |
button9=(Button)findViewById(R.id.btn9); |
14 |
buttonAgain=(Button)findViewById(R.id.btnAgain); |
15 |
|
16 |
info=(TextView)findViewById(R.id.guess_text); |
17 |
|
18 |
rand=new Random(); |
19 |
number=rand.nextInt(10); |
Wir verwenden auch die folgenden Methoden, um die Schaltflächen während des Spiels zu deaktivieren und zu aktivieren:
1 |
private void disableNumbers(){ |
2 |
button0.setEnabled(false); button0.setTextColor(Color.parseColor("#ff000033")); |
3 |
button1.setEnabled(false); button1.setTextColor(Color.parseColor("#ff000033")); |
4 |
button2.setEnabled(false); button2.setTextColor(Color.parseColor("#ff000033")); |
5 |
button3.setEnabled(false); button3.setTextColor(Color.parseColor("#ff000033")); |
6 |
button4.setEnabled(false); button4.setTextColor(Color.parseColor("#ff000033")); |
7 |
button5.setEnabled(false); button5.setTextColor(Color.parseColor("#ff000033")); |
8 |
button6.setEnabled(false); button6.setTextColor(Color.parseColor("#ff000033")); |
9 |
button7.setEnabled(false); button7.setTextColor(Color.parseColor("#ff000033")); |
10 |
button8.setEnabled(false); button8.setTextColor(Color.parseColor("#ff000033")); |
11 |
button9.setEnabled(false); button9.setTextColor(Color.parseColor("#ff000033")); |
12 |
buttonAgain.setEnabled(true); buttonAgain.setTextColor(Color.parseColor("#ff000033")); |
13 |
}
|
14 |
private void enableNumbers(){ |
15 |
button0.setEnabled(true); button0.setTextColor(Color.WHITE); |
16 |
button1.setEnabled(true); button1.setTextColor(Color.WHITE); |
17 |
button2.setEnabled(true); button2.setTextColor(Color.WHITE); |
18 |
button3.setEnabled(true); button3.setTextColor(Color.WHITE); |
19 |
button4.setEnabled(true); button4.setTextColor(Color.WHITE); |
20 |
button5.setEnabled(true); button5.setTextColor(Color.WHITE); |
21 |
button6.setEnabled(true); button6.setTextColor(Color.WHITE); |
22 |
button7.setEnabled(true); button7.setTextColor(Color.WHITE); |
23 |
button8.setEnabled(true); button8.setTextColor(Color.WHITE); |
24 |
button9.setEnabled(true); button9.setTextColor(Color.WHITE); |
25 |
buttonAgain.setEnabled(false); buttonAgain.setTextColor(Color.parseColor("#ffffff00")); |
26 |
}
|
Wir benötigen außerdem die folgende Methode, die wir als onClick-Attribut für die Nummernschaltflächen im Layout angegeben haben. Der Spieler tippt auf eine davon, um eine Vermutung anzustellen:
1 |
public void btnPressed(View v){ |
2 |
int btn = Integer.parseInt(v.getTag().toString()); |
3 |
if(btn<0){ |
4 |
//again btn
|
5 |
numGuesses=0; |
6 |
number=rand.nextInt(10); |
7 |
enableNumbers(); |
8 |
info.setText("Set the number!"); |
9 |
}
|
10 |
else{ |
11 |
//number button
|
12 |
numGuesses++; |
13 |
if(btn==number){ |
14 |
info.setText("Yes! It was "+number); |
15 |
if(getApiClient().isConnected()){ |
16 |
Games.Achievements.unlock(getApiClient(), |
17 |
getString(R.string.correct_guess_achievement)); |
18 |
Games.Leaderboards.submitScore(getApiClient(), |
19 |
getString(R.string.number_guesses_leaderboard), |
20 |
numGuesses); |
21 |
}
|
22 |
disableNumbers(); |
23 |
}
|
24 |
else if(numGuesses==5){ |
25 |
info.setText("No! It was "+number); |
26 |
disableNumbers(); |
27 |
}
|
28 |
else
|
29 |
info.setText("Try again!"); |
30 |
}
|
31 |
}
|
Nehmen Sie sich einen Moment Zeit, um den Code zu überprüfen. Selbst wenn Sie die App im Leistungs-Tutorial abgeschlossen haben, gibt es neben dem zusätzlichen Bestenliste-Code einige Änderungen an der Logik. Wenn der Spieler auf die Schaltfläche Erneut tippt, setzen wir die Variable numGuesses auf 0 zurück. Wenn der Benutzer auf eine Zifferntaste tippt, erhöhen wir numGuesses. Wenn Sie keine Erfolge verwenden, können Sie jeden Code entfernen, der auf Erfolge verweist.
Wir senden die Punktzahl an die Bestenliste, wenn der Benutzer richtig geraten hat. Der Benutzer kann bis zu fünf Vermutungen anstellen.
Die Schlüsselzeile hier ist submitScore. Wir geben die Anzahl der Vermutungen an, die der Spieler gemacht hat, um die richtige Anzahl zu erhalten. Wenn die Anzahl der Vermutungen geringer ist als ein vorhandener Eintrag für den Benutzer in der Bestenliste, wird dessen Eintrag durch diesen neuen Wert ersetzt. Beachten Sie, dass wir den Zeichenfolgenressourcenwert verwenden, den wir für die Bestenliste definiert haben.
Schritt 2
Bevor wir fertig sind, können die Benutzer die Bestenliste des Spiels anzeigen, indem sie auf die von uns hinzugefügte Schaltfläche "Bestenliste" tippen. Wir haben den folgenden Code in onClick für die Erfolge verwendet:
1 |
else if (view.getId() == R.id.show_achievements){ |
2 |
startActivityForResult(Games.Achievements.getAchievementsIntent( |
3 |
getApiClient()), 1); |
4 |
}
|
Die Präsentation der Bestenliste ist ähnlich:
1 |
else if(view.getId() == R.id.show_leaderboard){ |
2 |
startActivityForResult(Games.Leaderboards.getLeaderboardIntent( |
3 |
getApiClient(), getString(R.string.number_guesses_leaderboard)), |
4 |
2); |
5 |
}
|
Auf diese Weise kann der Benutzer die aktuelle Rangliste in der Rangliste anzeigen. Der Integer-Parameter ist beliebig.
Wenn Sie die App ausführen, wird versucht, den Benutzer anzumelden, nach Berechtigungen zu suchen und die Anmeldung zu bestätigen, wenn dies erfolgreich ist:



Dem Benutzer steht es frei, sich jederzeit abzumelden und wieder anzumelden. Wenn er die App verlässt, versucht er, sich automatisch wieder anzumelden, wenn er sie erneut öffnet. Wenn der Benutzer richtig vermutet, wird seine Punktzahl an die Rangliste übermittelt. Durch Drücken der Bestenliste-Taste wird die aktuelle Bestenliste angezeigt:



Von hier aus kann der Nutzer über sein Google-Konto auf soziale Funktionen von Google Services zugreifen. Sie können Ihre Apps so einrichten, dass sie öffentliche und soziale Bestenlisten verwenden. In sozialen Bestenlisten werden Listen von Personen in den Benutzerkreisen angezeigt, die für das Spiel selbst verwaltet werden können. Für eine öffentliche Rangliste muss sich der Benutzer dafür entschieden haben, seine Ergebnisse öffentlich zu teilen.
Abschluss
In diesem Tutorial haben wir grundlegende Bestenliste-Funktionen mit Google Play Spiel-Dienste implementiert. Beachten Sie, dass Sie mit Bestenlisten in Ihren Apps viel mehr tun können. Beispielsweise können Sie Bestenlisten-Daten für bestimmte Zeitskalen anfordern, z. B. täglich, wöchentlich und jederzeit. Wenn eine Rangliste viele Punkte enthält, kann Ihre App nur die besten oder die dem aktuellen Spieler am nächsten liegenden Punkte abrufen. Versuchen Sie, mit einigen dieser Verbesserungen in Ihren eigenen Apps zu experimentieren.



