一,前期基础知识储备

1)排行榜官方文档:https://developers.google.com/games/services/common/concepts/leaderboards

Leaderboards can be a fun way to drive competition among your players, both for your most hardcore fans (who will be fighting for the top spot in a public leaderboard) and for your more casual players (who will be interested in comparing their progress to their friends').

2)成就系统官方文档:https://developers.google.com/games/services/common/concepts/achievements

Achievements can be a great way to increase your users' engagement within your game. You can implement achievements in your game to encourage players to experiment with features they might not normally use, or to approach your game with entirely different play styles.

3)实际应用中需要安装 Google Play Game游戏服务应用,打开登录谷歌账号,这样才能正常进行显示之后的内容。

4)后台同事帮忙在谷歌控制台(Google Play Console)对应用进行注册,拿到应用对应的 APP_ID,用以注册该应用,然后需要为排行榜和成就系统各自注册ID。一个排行榜对应一个ID一个成就对应一个ID,在注册排行榜时默认需要注册5个成就,这样才能配置成功,另外在应用内成就可以选择是否进行展示。

二,上代码,具体实现

1)添加依赖

①应用级添加依赖:

    dependencies {classpath 'com.android.tools.build:gradle:3.4.1'classpath 'com.google.gms:google-services:4.0.1'}

②项目级添加依赖:

    // gameimplementation 'com.google.android.gms:play-services-auth:16.0.0'implementation 'com.google.android.gms:play-services-games:16.0.0'

2)Manifest中进行注册

        <meta-data android:name="com.google.android.gms.games.APP_ID"android:value="@string/app_id" /><meta-data android:name="com.google.android.gms.version"android:value="@integer/google_play_services_version"/>

这里使用到的APPID,即为之前在谷歌后台注册时拿到的12位数ID。

3)下载好了GooglePlay,然后判断应用是否登录成功

    /*登录状态验证*/private boolean isSignedIn() {Log.d(TAG, "onAnimationEnd: onActivityResult 88,," + GoogleSignIn.getLastSignedInAccount(this));return GoogleSignIn.getLastSignedInAccount(this) != null;}

这里有一个关键的理论需要理顺,就是在使用排行榜和成就系统前,需要先对Google Paly账号登录的状态做一个判断。若是登录成功,则可以直接执行之后的逻辑,若是登录失败,则需要先登录账号。

4)登录 GooglePlay 账号

    /*判断是否已经登录*/private boolean signInIfNotAlready() {if (!isSignedIn()) {/*未登录 则开始登录*/signIn();Log.d(TAG, "onAnimationEnd: onActivityResult 66");return true;} else {Log.d(TAG, "onAnimationEnd: onActivityResult 77");/*为登录状态 则返回false 直接通过判断*/return false;}}/*登录 登录代理 先是静默登录 然后是显示UI登录*/private void signIn() {//get the sign in client and configure for games 创建ClientsignInClient = GoogleSignIn.getClient(this, new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).build());Log.d(TAG, "onAnimationEnd: onActivityResult 55,,," + signInClient);//if silent sign in doesn't work display UI sign in 发起登录if (!isSignedIn()) {Log.d(TAG, "onAnimationEnd: onActivityResult 33");startActivityForResult(signInClient.getSignInIntent(), RC_SIGN_IN);} else {//try to sign user in silentlysignInSilently();}}private void signInSilently() {signInClient.silentSignIn().addOnCompleteListener(this,task -> {if (task.isSuccessful()) {signedInAccount = task.getResult();Log.d(TAG, "signInSilently(): success");/*以下代码和设置弹窗内账号的状态勾连*//*settingsDialog.setPlaySignedIn(true);updateSettingsIfDisplaying();*/} else {/*settingsDialog.setPlaySignedIn(false);updateSettingsIfDisplaying();*/Log.d(TAG, "signInSilently(): failure", task.getException());}});}

先判断是否登录,若是没有登录,则开始登录,初始化 GoogleSignInClient,然后链接Google Play。

5)监听登录GooglePlay的结果

    @Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {super.onActivityResult(requestCode, resultCode, data);Log.d(TAG, "onActivityResult: 000,,," + data + ",," + resultCode);/*0*/if (requestCode == RC_SIGN_IN) {GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);Log.d(TAG, "onActivityResult: 99,,," + result);if (result.isSuccess()) {/*点击登录Google Play成功*/signedInAccount = result.getSignInAccount();/*settingsDialog.setPlaySignedIn(true);updateSettingsIfDisplaying();*/setPopUpView();Log.d(TAG, "onActivityResult: sign in success");} else {/*点击登录Google Play失败*/Toast.makeText(this, "sign in failed", Toast.LENGTH_LONG).show();Log.d(TAG, "onActivityResult: sign in failed");/*settingsDialog.setPlaySignedIn(false);updateSettingsIfDisplaying();*/}}}/*onActivityResult登录成功的回调 这里利用登录账号拿到 游戏代理*/private void setPopUpView() {gamesClient = Games.getGamesClient(this, signedInAccount);/*这句话用来设置登录结果及google成就完成时浮窗的父窗口。若未设置,也可以正常登录及完成成就,但无google自己的浮窗提示。*/gamesClient.setViewForPopups(findViewById(R.id.gps_popup_welcome));}

这里的逻辑是登录成功,则拿到游戏代理“gameClient”,然后给它绑定一个布局容器,该容器添加再布局中。

    <FrameLayoutandroid:id="@+id/gps_popup_welcome"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent" />

6)点击按钮显示排行榜和显示成就系统

显示排行榜

        if (!signInIfNotAlready()) {//if already signed in display leaderboard// 全局该方法调用两次 首页 这里是用于显示排行榜Games.getLeaderboardsClient(WelcomeActivity.this,GoogleSignIn.getLastSignedInAccount(WelcomeActivity.this)).getLeaderboardIntent(getString(com.lianliankan.game.R.string.leaderboard_high_scores)).addOnSuccessListener(intent -> startActivityForResult(intent, RC_LEADERBOARD_UI));}

这里使用到的字符 “leaderboard_high_scores” 即是后台注册的排行榜ID

显示成就系统

        if (!signInIfNotAlready()) {//if already signed in display achievements// 全局该方法调用两次 首页 这里是用于显示成就系统Games.getAchievementsClient(WelcomeActivity.this,GoogleSignIn.getLastSignedInAccount(WelcomeActivity.this)).getAchievementsIntent().addOnSuccessListener(intent -> startActivityForResult(intent, RC_ACHIEVEMENT_UI));}

实例截图如下:

排行榜 截图

成就系统 截图

7)完成一局游戏,提交分数

        //submit overall score to Google Play leaderboard if signed in// 全局该方法调用两次 游戏页 这里是用于提交分数至排行榜if (isSignedIn()) {Games.getLeaderboardsClient(this, GoogleSignIn.getLastSignedInAccount(this)).submitScore(getString(R.string.leaderboard_high_scores), questionModel.getScore());Log.d(TAG, "updateScore: " + questionModel.getScore());}

8)完成游戏后,解锁某项游戏成就

①拿到成就代理对象

首先也要拿到登录账号GoogleSignInAccount 对象,然后通拿到游戏代理 GamesClient,最后拿到成就代理AchievementsClient

    private GoogleSignInAccount signedInAccount; /*登录账号代理 只使用了一处*/private GamesClient gamesClient; /*游戏代理 只使用了一处*/private AchievementsClient achievementsClient; /*成就代理 使用了多处 unlock 即解锁成就 每次使用都要判断是否登录*///if signed in on google play setup achievements and leaderboardssignedInAccount = getIntent().getParcelableExtra(MenuActivity.ACCOUNT_PARCEL);if (signedInAccount != null) {gamesClient = Games.getGamesClient(this, signedInAccount);gamesClient.setViewForPopups(findViewById(R.id.gps_popup));/*成就激活*/achievementsClient = Games.getAchievementsClient(this, signedInAccount);}

②解锁成就

                //give the player hintsif (isSignedIn()) {/*完成一项成就——看广告 获取更多的帮助*/achievementsClient.unlock(getString(R.string.achievement_more_help_please));}

这里使用到的字符“achievement_more_help_please”,就是在谷歌后台注册不同成就时拿到的不同的成就ID;一项成就对应一个成就ID。

9)退出当前谷歌账号

    /*退出 GooglePlay 账号*/private void signOut() {signInClient.signOut().addOnCompleteListener(this,task -> {StyleableToast.makeText(this, "Signed out", R.style.infoToast).show();/*设置弹窗 里面登录状态改变*/settingsDialog.setPlaySignedIn(false);updateSettingsIfDisplaying();});}

最后,推荐一个开源项目帮助理解上述步骤:

https://github.com/OliverStenning/Riddler/commits/master

实例:Google Play游戏服务接入排行榜和成就系统相关推荐

  1. Google Play游戏服务入门

    游戏技术在不断发展. 然而,数十年来,许多核心游戏玩法元素保持不变. 高分,排行榜,任务,成就和多人支持就是例子. 如果您正在为Android平台开发游戏,则无需手动实现任何这些元素. 您可以直接使用 ...

  2. 在 Android 中使用 Google Play 游戏服务登录出现12501 报错

    在 Android 中使用 Google Play 游戏服务进行登录出现12501报错 添加Google Play服务 配置Google API控制台项目 配置AndroidManifest.xml ...

  3. PHP怎么写游戏成就系统,游戏成就系统成就了什么

    现年 25 岁的 Steven Rollins 是一家游戏网站的编辑.作为一名资深玩家,自打记事起,他就开启了自己的电子游戏生涯.小时候,他玩自己感兴趣的游戏,还和口味相投的小伙伴们彼此交换游戏,渐渐 ...

  4. 游戏服务端框架之本服实时排行榜

    目录 设计背景 知识储备 数据结构封装 排行榜设计 设计背景 在游戏服务端框架之使用Redis实现跨服排行榜这篇文章里,讲述了如何使用Redis设计一个全服排行榜工具. 本文主要介绍如何实现一个本服的 ...

  5. 游戏服务端开发-排行榜

    开头 排行榜几乎是每个网络游戏都有的系统,以下用Erlang以例,分享一种排行榜实现方式. 结构 每个排行榜对应一个actor,State使用如下结构: %% 通用排行榜结构 -record(rank ...

  6. 揭秘百度微服务监控:百度游戏服务监控的演进

    导读:臣闻防患于未然者易,除患于已然者难 -- 明·马文升<添风宪以抚流民疏> 作为一个程序员,是否有留意到每逢节假日在各大景区时有程序员打开电脑紧急处理线上问题?如果线上出现大量的报警, ...

  7. mmhmm重塑视频会议、2020新款emoji可爱来袭、微软将推云游戏服务xCloud等| Decode the Week...

    Social Media Sucks. Decode the Week≠音视频技术周刊  News Briefing 1. Evernote前CEO推出虚拟摄影棚应用mmhmm 重塑视频会议 Phil ...

  8. 2017全球ROI Top25游戏广告平台排行榜

    http://news.gamedog.cn/a/20171120/2261712.html Facebook Ads AdWords UnityAds Applovin Chartboost Vun ...

  9. 如何使用私有网络部署全球同服游戏服务

    近年来,随着移动互联网技术和全球社交化的发展,全球同服的玩法越来越受到游戏玩家的喜爱,最火爆的如<皇室战争>自16年3月份发布来便长期霸榜,支持全球同服的游戏架构在知乎上一度引起热议,面对 ...

最新文章

  1. 11、查看及测试网络、配置网络地址、内核及模块管理
  2. 如何自学python爬虫-python爬虫学习过程:
  3. iOS 开发 需要的版本管理工具,UI图,bug管理工具等
  4. 运筹学(最优化理论)学习笔记 | 共轭梯度法
  5. 盛骁杰:对于充满好奇心的技术人来说多媒体技术是个宝藏
  6. 谷歌入职邮件_为什么我全职学习了8个月以接受Google采访
  7. 1 常用Windows命令大全
  8. web前端基础面试题
  9. 美颜重磅技术之GPUImage源码分析
  10. TCP完成端口服务器构建
  11. 如何做好企业绩效管理?
  12. Nuc做文件服务器,Intel NUC 安装Windows Server 2016 图解教程
  13. CF417D--- Cunning Gena(排序+状压dp)
  14. 磨金石教育摄影技能干货分享|王汉冰摄影作品欣赏—《沙狐之眼》
  15. UE4关于材质的几个小技巧
  16. ViewCompanion Premium(HPGL、HPGL2和HP-RTL文件浏览和打印软件)官方正式版V13.10 | 内置viewcompanion注册码
  17. 【技术分享】使用opencv进行火焰分割
  18. iphone照片恢复至android,将照片从Android传输到iPhone的8种方法很容易
  19. 华为设备配置MAC地址
  20. 使用腾讯云服务器搭建离线(中转)网盘

热门文章

  1. 港科夜闻|香港科大研发氧聚解空气处理技术,耐用环保而且节省成本
  2. 计算机四级考证难不难考
  3. 人工智能来了吗,身边的人工智能应用有哪些?
  4. openwrt 3G驱动
  5. windows系统下安装JDK8
  6. string C语言 什么意思,includestring.h是什么意思
  7. 安装框架断路器要注意什么?该如何选择断路器?
  8. 职场打怪宝鉴:努力不是优势,实力才是王道!
  9. 基于SECS协议开发的简明教程(6)
  10. javascript小技巧!