libGDX - Android Studio 中的 Google Play 游戏服务

Posted

技术标签:

【中文标题】libGDX - Android Studio 中的 Google Play 游戏服务【英文标题】:libGDX - Google Play Game Services in Android Studio 【发布时间】:2016-01-04 02:36:55 【问题描述】:

从 Eclipse 迁移到 android Studio 后,我一直在苦苦挣扎。问题是您可以找到的大多数指南和教程都是针对 Eclipse 的,但是如果您可以找到针对 Android Studio 的指南和教程,那么它缺少最重要的部分——实现库或 3rd 方代码。经过一周的问题和错误,这里是一个指南

【问题讨论】:

无意冒犯,但您应该将答案作为教程发布到您的网站、博客或其他地方,但不要像这样发布。 我知道它会更好,但我没有页面。最后,如果我用这个节省任何人几个小时就可以了 【参考方案1】:

要求:Google play 服务和 Google Repostory(在 SDK 管理器的 Extras 下),BaseGameUtils

首先我们需要添加 BaseGameUtils 作为模块:

然后选择 Import Gradle Project 并选择 BaseGameUtil 文件夹(在该步骤之前不要将 BaseGameUtils 复制到项目中。让 Android Studio 执行此操作) 在 gradle 完成同步选择 Build > Make Module 'BaseGameUtils' 之后

注意如果您在构建时遇到 uses-sdk:minSdkVersion 错误,请检查此click here。在此之后再次构建:BaseGameUtils

集成 BaseGameUtils 的最后一步是将其包含到 android 模块中: 之后同步项目。

注意如果您在构建时遇到 uses-sdk:minSdkVersion 错误,这将有所帮助 - link

现在是时候打开您的 AndroidManifest 文件并包含:

应用标签之前

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

注意: 无需在 android gradle 脚本中添加 google play 依赖项,因为它已包含在 BaseGameUtils 中

应用程序中,在活动

之前
 <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" />

现在你需要在 Srtings (android/res/values/Strings.xml) 中设置 app_id 号

  <string name="app_id">928019648708</string>

您的应用 ID 位于 GooglePlay 开发者控制台的游戏服务部分(在游戏名称下)

为了将android原生代码传递给游戏代码,我们将在核心模块中创建ActionResolver接口:

package com.mygame.test;

public interface ActionResolver 
    public boolean getSignedInGPGS();
    public void loginGPGS();
    public void submitScoreGPGS(int score, String id);
    public void unlockAchievementGPGS(String achievementId);
    public void getLeaderboardGPGS();
    public void getAchievementsGPGS();

现在我们需要对 AndroidLauncher 类进行更改(如果有问题,请检查导入):

package com.mygame.test.android;

import android.os.Bundle;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.backends.android.AndroidApplication;
import com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;
import com.google.android.gms.games.Games;
import com.google.example.games.basegameutils.GameHelper;
import com.mygame.test.ActionResolver;
import com.mygame.test.MyGame;

public class AndroidLauncher extends AndroidApplication implements ActionResolver, GameHelper.GameHelperListener 

    private GameHelper gameHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        if (gameHelper == null) 
            gameHelper = new GameHelper(this, GameHelper.CLIENT_GAMES);
            gameHelper.enableDebugLog(true);
        
        gameHelper.setup(this);

        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        initialize(new MyGame(this), config);
    

    @Override
    public boolean getSignedInGPGS() 
        return gameHelper.isSignedIn();
    

    @Override
    public void loginGPGS() 
        if (!gameHelper.isSignedIn()) 
            try 
                runOnUiThread(new Runnable() 
                    public void run() 
                        gameHelper.beginUserInitiatedSignIn();
                    
                );
             catch (final Exception ex) 
                Gdx.app.log("MainActivity", "Log in failed: " + ex.getMessage() + ".");
            
         else 
            gameHelper.reconnectClient();
        
    

    @Override
    public void submitScoreGPGS(int score, String id) 
        Games.Leaderboards.submitScore(gameHelper.getApiClient(), id, score);
    

   @Override
    public void unlockAchievementGPGS(String achievementId) 
        Games.Achievements.unlock(gameHelper.getApiClient(), achievementId);
    

    @Override
    public void getLeaderboardGPGS() 
        if (gameHelper.isSignedIn()) 
            startActivityForResult(Games.Leaderboards.getLeaderboardIntent(gameHelper.getApiClient(), "CgkI5MyZk4FbHAJQXQ"), 100);
         else if (!gameHelper.isConnecting()) 
            loginGPGS();
        
    

    @Override
    public void getAchievementsGPGS() 
        if (gameHelper.isSignedIn()) 
            startActivityForResult(Games.Achievements.getAchievementsIntent(gameHelper.getApiClient()), 101);
         else if (!gameHelper.isConnecting()) 
            loginGPGS();
        

    

    @Override
    public void onSignInFailed() 
        gameHelper.getSignInError();
    

    @Override
    public void onSignInSucceeded() 

    

    @Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data)
        super.onActivityResult(requestCode, resultCode, data);
        gameHelper.onActivityResult(requestCode, resultCode, data); 
    

在主类中创建构造函数(本例中为 MyGame):

public ActionResolver resolver;

public Base(ActionResolver ar) 
    resolver = ar;

连接 gplay 服务调用:

if (!resolver.getSignedInGPGS())
    resolver.loginGPGS();

解锁成就并提交分数:

if (resolver.getSignedInGPGS())
    if (currentScore == 0)
        resolver.unlockAchievementGPGS("CgkI5MyZk4EbEAIQAg");
    
    if (Cookie.bestScore >= 100)
        resolver.unlockAchievementGPGS("CgkI5MyZk4EbEAIQAw");
    
    resolver.submitScoreGPGS(Cookie.bestScore, "CgkI5MyZk4EbEAIQAQ");

注意:为每个成就和排行榜使用在开发者控制台中找到的相应 id 值

并调用排行榜和成就

resolver.getLeaderboardGPGS();
resolver.getAchievementsGPGS();

最后桌面、ioshtml启动器可以用同样的方式解决(桌面启动器的例子)

public static void main (String[] arg) 
    LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();

    ActionResolver resolver= new ActionResolver() 
        @Override
        public boolean getSignedInGPGS() 
            return false;
        
        @Override
        public void loginGPGS() 
        
        @Override
        public void submitScoreGPGS(int score, String id) 
        
        @Override
        public void unlockAchievementGPGS(String achievementId) 
        
        @Override
        public void getLeaderboardGPGS() 
        
        @Override
        public void getAchievementsGPGS() 
        
    ;
    new LwjglApplication(new MyGame(resolver), config);

【讨论】:

谢谢你。不久前我试图解决这个问题。所有教程都是针对 Eclipse 的。不知何故,我解决了这个问题。这将在未来帮助许多人。我关注了official documentation,但作为一个新手非常困惑。 Np 我知道。您实际上必须为多个站点收集信息并希望它能够工作 你在 AndroidLauncher 中忘记了@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) super.onActivityResult(requestCode, resultCode, data); gameHelper.onActivityResult(requestCode, resultCode, data);

以上是关于libGDX - Android Studio 中的 Google Play 游戏服务的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio App 在使用 Libgdx 打开之前就停止工作

LibGdx 与 Android Studio 有多个错误

LibGDX - 无法从 Android Studio 运行 destop 版本

LibGDX 文件未在 Android Studio 上首次加载

libGDX - Android Studio 中的 Google Play 游戏服务

在 android studio 上部署 libgdx 到 html5