游戏技术在不断发展。 然而,数十年来,许多核心游戏玩法元素保持不变。 高分,排行榜,任务,成就和多人支持就是例子。 如果您正在为Android平台开发游戏,则无需手动实现任何这些元素。 您可以直接使用Google Play游戏服务 API。
在本教程中,我将向您展示如何创建一个简单的Android游戏,如何向其中添加Google Play游戏服务以及如何使用排行榜和成就API。
先决条件
为了能够遵循本教程,您需要具备以下条件:
- 最新版本的Android Studio 。
- 安装了最新版本的Google Play服务应用的Android设备。
1.创建一个简单的游戏
将Play游戏服务API添加到空白的Android Studio项目中没有任何乐趣。 因此,现在让我们创建一个游戏,用户只需单击一个按钮即可获得积分。 更准确地说,游戏的目标是在60秒内尽可能多地单击一个按钮。
第1步:创建游戏布局
游戏的布局将具有一个Button
小部件,用户将单击该Button
小部件以获取积分,以及两个TextView
小部件以显示分数和剩余时间。 如果将它们全部放置在RelativeLayout
并在水平和垂直方向上居中,则应具有如下所示的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.tutsplus.mylittlegame.MainActivity">
<Button
android:text="Start"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true"
android:id="@+id/main_button" />
<TextView
android:text="Time remaining: 0 seconds"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/main_button"
android:layout_centerHorizontal="true"
android:layout_marginTop="25dp"
android:id="@+id/time_view" />
<TextView
android:text="Score: 0"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_above="@+id/main_button"
android:layout_marginBottom="28dp"
android:layout_centerHorizontal="true"
android:id="@+id/score_view" />
</RelativeLayout>
我们的游戏将有一个排行榜屏幕和一个成就屏幕。 要允许用户导航到这些屏幕,请在布局文件的末尾添加两个以上的Button
小部件。
<Button
android:text="Achievements"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:id="@+id/achievements_button"
android:onClick="showAchievements"
/>
<Button
android:text="Leaderboard"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:id="@+id/leaderboard_button"
android:onClick="showLeaderboard"/>
请注意,两个按钮都具有onClick
属性。 我们将在以后的步骤中创建它们引用的Java方法。
步骤2:实施游戏逻辑
在活动内部,为我们在布局XML文件中定义的游戏小部件创建成员变量。 此外,为得分创建一个int
变量,为游戏状态创建一个boolean
变量。
private Button mainButton;
private TextView scoreView;
private TextView timeView;
private int score = 0;
private boolean playing = false;
使用findViewById()
方法初始化活动的onCreate()
方法内的小部件。
mainButton = (Button)findViewById(R.id.main_button);
scoreView = (TextView)findViewById(R.id.score_view);
timeView = (TextView)findViewById(R.id.time_view);
要侦听Button
小部件上的单击,请创建一个OnClickListener
并将其添加到其中。
mainButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// More code goes here
}
});
现在,我们必须实现以下要求:
- 用户第一次单击按钮时,游戏必须开始。
- 随后的每次点击都应增加
score
变量。
- 游戏必须在60秒后结束。
我们可以使用playing
变量来区分首次点击和所有后续点击。 为了跟踪时间,我们可以使用抽象的CountDownTimer
类,它非常适合我们的需求。 它内部有一个onTick()
方法,可以准确地更新timeView
以显示剩余的秒数。 它还具有onFinish()
方法,当倒计时结束时将调用该方法。
因此,将以下代码添加到onClick()
方法:
if(!playing) {
// The first click
playing = true;
mainButton.setText("Keep Clicking");
// Initialize CountDownTimer to 60 seconds
new CountDownTimer(60000, 1000) {
@Override
public void onTick(long millisUntilFinished) {
timeView.setText("Time remaining: " + millisUntilFinished/1000);
}
@Override
public void onFinish() {
playing = false;
timeView.setText("Game over");
mainButton.setVisibility(View.GONE);
}
}.start(); // Start the timer
} else {
// Subsequent clicks
score++;
scoreView.setText("Score: " + score + " points");
}
此时,您可以运行项目以玩游戏。

2.添加游戏服务依赖项
配置项目以使用Play游戏服务API涉及许多步骤。 通过使用Android Studio的Firebase助手,可以使其中一些自动化。
转到“ 工具”>“ Firebase”,打开助手窗口。 接下来,在“ 分析”部分中,单击“ 记录分析事件”链接。 现在,您可以通过单击“ 连接 到Firebase”按钮将 Android Studio项目连接到Firebase项目。 确保在弹出的对话框中选择“ 创建新的Firebase项目”选项。

建立连接后,请按向应用程序添加分析按钮以将所有必需的更改添加到build.gradle文件。
您必须手动添加Play游戏服务的依赖关系。 因此,转到app
模块的build.gradle文件并添加以下compile
依赖项:
compile 'com.google.android.gms:play-services-games:9.8.0'
此外,游戏服务API需要XML配置文件。 在res / values文件夹中创建一个名为games-ids.xml的文件。 我们将在以后的步骤中添加内容。
3.注册游戏
所有使用Google Play游戏服务的游戏都必须在Play开发者控制台上注册。 您必须支付25美元的一次性注册费才能访问控制台。
在控制台中,单击游戏板图标以打开“ 游戏服务”屏幕。

接下来,点击设置Google Play游戏服务按钮以开始注册游戏。
在弹出的对话框中,选择第二个标签,因为我们的游戏已经在使用Google API。 现在,您必须能够在可用项目列表中查看Firebase项目的名称。 选择它之后,为游戏选择一个类别。 目前,您可以使用“ 休闲”类别。

按“ 继续”后 ,您可以通过单击“ 链接Firebase”按钮来链接Firebase Analytics和Play游戏服务。
接下来,转到“ 链接的应用程序”部分,将您的Android Studio项目链接到Play开发者控制台。 在弹出的对话框中,按Android按钮,然后在“ 包名称”字段中输入项目的包名称。

按“ 保存并继续”按钮为您的游戏生成客户端ID。

我们的游戏现已成功在Google Play开发者控制台中注册。
4.添加测试用户
仅当您的游戏在Google Play上发布时,Play游戏服务API才有效。 但是,为了允许您测试游戏,开发人员控制台可让您关联一些测试用户帐户。 通过转到“ 测试”部分,您可以添加或删除测试用户帐户。 确保在此处添加您在手机或模拟器上使用的Google帐户。

5.创建排行榜
排行榜不过是显示用户高分的屏幕。 Play游戏服务排行榜可让用户查看其每日,每周和历史最高分。
在Play开发者控制台上创建排行榜只需点击几下。 转到排行榜部分,然后按添加排行榜按钮。 在下一个屏幕中,给排行榜起一个有意义的名称,然后按保存按钮。

现在我们的排行榜已经准备就绪。
6.创造成就
成就是用户在管理方面做出的特殊贡献而获得的游戏奖励。 具有很多成就可以解锁的游戏通常比没有游戏要有趣。 因此,当今Google Play上的大多数热门游戏都有数十种甚至数百种成就。
在本教程中,我们将仅向游戏添加一项成就。 其名称将为Lightning Fast ,当用户每分钟要尝试点击按钮100次以上时,它将被解锁。 要创建成就,请转到“ 成就”部分,然后按“ 添加成就”按钮。 输入成就的名称和描述后,按保存按钮。

7.更新游戏配置XML
排行榜和成就都有唯一的标识符。 现在,我们必须将这些标识符以及注册过程中生成的应用程序ID添加到我们的Android Studio项目中。 您可以通过手动更新我们之前创建的games-ids.xml文件来实现。 但是,我建议您使用开发者控制台中可用的自动生成的配置代码。
要获取自动生成的配置代码,您可以转到“ 成就”部分或“ 排行榜”部分,然后按“ 获取资源”链接。 您将看到如下所示的XML代码:
<?xml version="1.0" encoding="utf-8"?>
<!--
Google Play game services IDs.
Save this file as res/values/games-ids.xml in your project.
-->
<resources>
<string name="app_id">1234567890</string>
<string name="package_name">com.tutsplus.mylittlegame</string>
<string name="achievement_lightning_fast">HzkA4Kz04F8MRYIAze</string>
<string name="leaderboard_my_little_leaderboard">HzkA4Kz04F8MRYIBVU</string>
</resources>
复制所有代码并将其粘贴到项目的games-ids.xml文件中。
8.连接到Play游戏服务
在使用排行榜和成就API之前,我们必须创建一个GoogleApiClient
实例并将其连接到Play游戏服务。 因此,将GoogleApiClient
对象添加为您的活动的成员变量。
我们必须使用GoogleApiClient.Builder
类来构建GoogleApiClient
实例。 在构建客户端时,我们可以使用addApi()
和addScope()
方法指定我们感兴趣的API和API范围。
此外,我建议您调用enableAutoManage()
方法以确保客户端自动管理与游戏服务的连接。 但是,该方法需要一个OnConnectionFailedListener
,当连接失败时将调用该方法。 现在,我们将简单地调用finish()
方法以在连接失败的情况下关闭应用程序。
因此,在onCreate()
方法的开头添加以下代码:
apiClient = new GoogleApiClient.Builder(this)
.addApi(Games.API)
.addScope(Games.SCOPE_GAMES)
.enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.e(TAG, "Could not connect to Play games services");
finish();
}
}).build();
如果立即运行该应用程序,系统将提示您为自己创建一个玩家ID。 输入您选择的玩家ID,然后按“ 登录”按钮。

9.使用排行榜
将分数提交到排行榜仅需一行代码。 您需要做的就是调用Games.Leaderboards
类的submitScore()
方法。 作为参数,它需要GoogleApiClient
实例,排行榜的ID和得分。
在我们的游戏中,我们必须在60秒结束时提交分数。 因此,将以下代码添加到onFinish()
方法中:
Games.Leaderboards.submitScore(apiClient,
getString(R.string.leaderboard_my_little_leaderboard),
score);
要查看排行榜,我们必须以排行榜意图开始新的活动。 要获取页首横幅意图,请调用Games.Leaderboards
类的getLeaderboardIntent()
方法,并将GoogleApiClient
实例和页首横幅ID传递给它。
我们游戏的布局已经有一个按钮,可以按下该按钮来打开排行榜。 其onClick
属性的值为showLeaderboard
。 因此,将以下代码添加到您的活动中:
public void showLeaderboard(View v) {
startActivityForResult(
Games.Leaderboards.getLeaderboardIntent(apiClient,
getString(R.string.leaderboard_my_little_leaderboard)), 0);
}
您可以立即运行该应用程序,然后再次玩游戏。 这次,游戏结束时,您的分数将被提交到排行榜。 这是默认排行榜的样子:

10.使用成就
通过调用Games.Achievements
类的unlock()
方法,您可以解锁任何成就。 该方法期望GoogleApiClient
实例和成就的ID作为其唯一参数。
当用户的分数超过100分时,我们必须解锁在控制台中定义的“闪电般的成就”。 因此,在增加分数的代码之后,添加以下代码:
if(score>100) {
Games.Achievements
.unlock(apiClient,
getString(R.string.achievement_lightning_fast));
}
显示成绩屏幕所需的代码与我们编写的用于显示排行榜屏幕的代码非常相似。 您需要做的就是将getAchievementsIntent()
方法的返回值传递给startActivityForResult()
方法。
public void showAchievements(View v) {
startActivityForResult(
Games.Achievements
.getAchievementsIntent(apiClient),
1
);
}
如果您运行应用并再次玩游戏,当您的分数首次超过100分时,您会看到一个成就弹出窗口。

结论
现在,您知道如何在Android Studio项目中使用Google Play游戏服务API。 Play游戏服务不仅限于Android平台。 它们也可以在Web和iOS平台上轻松使用。 因此,Play游戏服务可让您创建跨平台游戏,并为多个平台上的用户提供一致的游戏体验。
翻译自: https://code.tutsplus.com/tutorials/get-started-with-google-play-games-services--cms-27755