且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2023-01-01 10:44:11

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

然后选择导入 Gradle 项目并选择 BaseGameUtil 文件夹(在此步骤之前不要复制项目中的 BaseGameUtils.让 Android Studio 这样做)在 gradle 完成同步 seefct Build > Make Module 'BaseGameUtils' 后

注意如果您在构建时使用了-sdk:minSdkVersion 错误,请检查此之后同步项目.

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

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

应用程序标签之前

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

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

应用程序中,在活动

之前
 <元数据 android:name="com.google.android.gms.version"android:value="@integer/google_play_services_version"/>

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

 928019648708

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

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

package com.mygame.test;公共接口 ActionResolver {公共布尔 getSignedInGPGS();公共无效登录GPGS();public void submitScoreGPGS(int score, String id);公共无效解锁成就GPGS(字符串成就Id);public void getLeaderboardGPGS();public void getAchievementsGPGS();}

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

package com.mygame.test.android;导入 android.os.Bundle;导入 com.badlogic.gdx.Gdx;导入 com.badlogic.gdx.backends.android.AndroidApplication;导入 com.badlogic.gdx.backends.android.AndroidApplicationConfiguration;导入 com.google.android.gms.games.Games;导入 com.google.example.games.basegameutils.GameHelper;导入 com.mygame.test.ActionResolver;导入 com.mygame.test.MyGame;公共类 AndroidLauncher 扩展 AndroidApplication 实现 ActionResolver,GameHelper.GameHelperListener {私人游戏助手游戏助手;@覆盖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();初始化(新我的游戏(这个),配置);}@覆盖公共布尔 getSignedInGPGS() {返回 gameHelper.isSignedIn();}@覆盖公共无效登录GPGS(){如果 (!gameHelper.isSignedIn()) {尝试 {runOnUiThread(new Runnable() {公共无效运行(){gameHelper.beginUserInitiatedSignIn();}});} 捕获(最终异常前){Gdx.app.log("MainActivity", "登录失败:" + ex.getMessage() + ".");}} 别的 {gameHelper.reconnectClient();}}@覆盖public void submitScoreGPGS(int score, String id) {Games.Leaderboards.submitScore(gameHelper.getApiClient(), id, score);}@覆盖公共无效解锁成就GPGS(字符串成就Id){Games.Achievements.unlock(gameHelper.getApiClient(),成就ID);}@覆盖公共无效 getLeaderboardGPGS() {如果(gameHelper.isSignedIn()){startActivityForResult(Games.Leaderboards.getLeaderboardIntent(gameHelper.getApiClient(), "CgkI5MyZk4FbHAJQXQ"), 100);} else if (!gameHelper.isConnecting()) {登录GPGS();}}@覆盖public void getAchievementsGPGS() {如果(gameHelper.isSignedIn()){startActivityForResult(Games.Achievements.getAchievementsIntent(gameHelper.getApiClient()), 101);} else if (!gameHelper.isConnecting()) {登录GPGS();}}@覆盖公共无效 onSignInFailed() {gameHelper.getSignInError();}@覆盖公共无效 onSignInSucceeded() {}@覆盖protected void onActivityResult(int requestCode, int resultCode, Intent data){super.onActivityResult(requestCode, resultCode, data);gameHelper.onActivityResult(requestCode, resultCode, data);}}

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

public ActionResolver 解析器;公共基地(ActionResolver ar){解析器 = ar;}

连接 gplay 服务调用:

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

解锁成就并提交分数:

if (resolver.getSignedInGPGS()){如果(当前分数 == 0){resolver.unlockAchievementGPGS("CgkI5MyZk4EbEAIQAg");}如果(Cookie.bestScore >= 100){resolver.unlockAchievementGPGS("CgkI5MyZk4EbEAIQAw");}resolver.submitScoreGPGS(Cookie.bestScore, "CgkI5MyZk4EbEAIQAQ");}

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

并调用排行榜和成就

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

最后桌面,ios和html启动器可以用同样的方式解决(桌面启动器的例子)

public static void main (String[] arg) {LwjglApplicationConfiguration config = new LwjglApplicationConfiguration();ActionResolver 解析器 = 新 ActionResolver() {@覆盖公共布尔 getSignedInGPGS() {返回假;}@覆盖公共无效登录GPGS(){}@覆盖public void submitScoreGPGS(int score, String id) {}@覆盖公共无效解锁成就GPGS(字符串成就Id){}@覆盖公共无效 getLeaderboardGPGS() {}@覆盖public void getAchievementsGPGS() {}};new LwjglApplication(new MyGame(resolver), config);}

After migrating to Android Studio from Eclipse, I was struggling at best with it. Problem was that most guides and tutorials you could find are for Eclipse , but if you can find one for Android Studio, it is missing most important parts - implementing libraries or 3rd party code. After week of problems and errors here is a guide

Requirements: Google play services and Google Repostory (under Extras in SDK manager), BaseGameUtils

Firstly we need to add BaseGameUtils as Module:

then select Import Gradle Project and chose BaseGameUtil folder (do not copy BaseGameUtils in project before that step. Let Android Studio do that) After gradle is done with syncing selefct Build > Make Module 'BaseGameUtils'

NOTE if u have uses-sdk:minSdkVersion error while build check this click here. Build :BaseGameUtils again after this

Last step for integranting BaseGameUtils is to include it into android module: Sync project afterwards.

NOTE if you get uses-sdk:minSdkVersion error while build this will help - link

Now it's time to open your AndroidManifest file and include:

before application tag

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

NOTE: there is no need to add google play dependencies in android gradle script becouse it is already included in BaseGameUtils

in application, before activity

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

Now you need to set app_id number in Srtings (android/res/values/Strings.xml)

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

Your app id is located in GooglePlay developer console under Game Services section (under game name)

For passing android native code to game code we will create ActionResolver interface in core module:

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();
}

Now we need to make changes in AndroidLauncher class (check imports if you have problems):

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); 
    }
}

Create constructor in your main class (MyGame in this example):

public ActionResolver resolver;

public Base(ActionResolver ar) {
    resolver = ar;
}

to connect with gplay services call:

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

unlock achievements and submit scores with:

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

note: use corresponding id valuses found in developer console for each achievement and for leaderbord

and call leaderboards and achievements with

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

Lastly desktop, ios and html launcher can be resolved in the same way (example for desktop launcher)

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);
}