You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX游戏集成Google Play Games排行榜技术咨询

如何在LibGDX游戏中集成Google Play服务排行榜

嘿,我之前刚好做过LibGDX和Google Play排行榜的集成,你的问题核心是解决LibGDX的Android入口与示例中FragmentActivity的适配问题,下面给你一步步梳理具体实现方案:

1. 先搞定Android端的基础配置

首先在你的LibGDX项目的android模块里完成Google Play服务的基础配置:

  • 在build.gradle(Module: android)中添加依赖:
    implementation "com.google.android.gms:play-services-games:23.1.0"
    implementation "com.google.android.gms:play-services-auth:21.0.0"
    
  • 在AndroidManifest.xml中添加权限和元数据:
    <uses-permission android:name="android.permission.INTERNET"/>
    
    <application ...>
        <!-- Google Play Games 配置 -->
        <meta-data
            android:name="com.google.android.gms.games.APP_ID"
            android:value="@string/game_services_app_id"/>
        <meta-data
            android:name="com.google.android.gms.version"
            android:value="@integer/google_play_services_version"/>
    </application>
    
  • 在res/values/strings.xml中添加从Google Play Console获取的APP ID:
    <string name="game_services_app_id" translatable="false">你的APP ID</string>
    

2. 改造LibGDX的Android入口Activity

LibGDX默认的AndroidLauncher继承自AndroidApplication(本质是Activity),而Google Play示例用的是FragmentActivity。我们可以把AndroidLauncher改成继承FragmentActivity,同时通过AndroidApplicationHelper兼容LibGDX的逻辑:

public class AndroidLauncher extends FragmentActivity implements AndroidApplication {
    private static final int RC_SIGN_IN = 9001;
    private static final int RC_LEADERBOARD = 9002;

    private AndroidApplicationHelper appHelper;
    private GooglePlayServicesManager playServicesManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 初始化LibGDX的应用助手
        appHelper = new AndroidApplicationHelper(this);
        // 初始化Google Play服务管理器
        playServicesManager = new GooglePlayServicesManager(this);
        // 设置LibGDX游戏视图
        View gameView = appHelper.initialize(new MyGame(playServicesManager), getDefaultConfiguration());
        setContentView(gameView);
    }

    // 处理Google Play的登录和排行榜回调
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == RC_SIGN_IN) {
            playServicesManager.handleSignInResult(data);
        } else if (requestCode == RC_LEADERBOARD) {
            // 排行榜关闭后的逻辑(可选)
        }
    }

    // 实现AndroidApplication接口的所有方法,委托给appHelper
    @Override
    public Application getApplication() {
        return appHelper.getApplication();
    }

    @Override
    public Input getInput() {
        return appHelper.getInput();
    }

    // 其他接口方法同理,全部委托给appHelper即可...

    // 生命周期方法中处理Google Play服务的连接/断开
    @Override
    protected void onStart() {
        super.onStart();
        playServicesManager.onStart();
    }

    @Override
    protected void onStop() {
        super.onStop();
        playServicesManager.onStop();
    }

    // 构建LibGDX的配置
    private AndroidApplicationConfiguration getDefaultConfiguration() {
        AndroidApplicationConfiguration config = new AndroidApplicationConfiguration();
        // 根据你的游戏需求配置(比如是否开启加速度计、状态栏等)
        config.useImmersiveMode = true;
        return config;
    }
}

3. 创建跨平台的Play服务接口

为了让核心游戏代码(LibGDX的core模块)不依赖Android平台代码,我们定义一个接口:

// core模块中的接口
public interface PlayServicesInterface {
    void signIn();
    void signOut();
    void submitScore(long score);
    void showLeaderboard();
    boolean isSignedIn();
}

4. 实现Android端的Google Play服务管理器

在android模块中创建GooglePlayServicesManager类,实现上面的接口:

public class GooglePlayServicesManager implements PlayServicesInterface {
    private static final String LEADERBOARD_ID = "你的排行榜ID"; // 从Play Console获取
    private final FragmentActivity activity;
    private GoogleSignInClient signInClient;
    private GamesClient gamesClient;

    public GooglePlayServicesManager(FragmentActivity activity) {
        this.activity = activity;
        // 配置Google登录选项
        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN).build();
        signInClient = GoogleSignIn.getClient(activity, gso);
    }

    @Override
    public void signIn() {
        activity.startActivityForResult(signInClient.getSignInIntent(), AndroidLauncher.RC_SIGN_IN);
    }

    // 处理登录结果
    public void handleSignInResult(Intent data) {
        Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
        try {
            GoogleSignInAccount account = task.getResult(ApiException.class);
            // 初始化GamesClient
            gamesClient = Games.getGamesClient(activity, account);
            gamesClient.setViewForPopups(activity.getWindow().getDecorView());
            gamesClient.setGravityForPopups(Gravity.TOP | Gravity.CENTER_HORIZONTAL);
            // 登录成功后的逻辑,比如提示用户
        } catch (ApiException e) {
            // 登录失败处理,比如打印日志或提示用户
            Log.e("PlayServices", "登录失败: " + e.getMessage());
        }
    }

    @Override
    public void submitScore(long score) {
        if (gamesClient != null && isSignedIn()) {
            gamesClient.submitScore(LEADERBOARD_ID, score);
        }
    }

    @Override
    public void showLeaderboard() {
        if (gamesClient != null && isSignedIn()) {
            gamesClient.getLeaderboardIntent(LEADERBOARD_ID)
                .addOnSuccessListener(intent -> activity.startActivityForResult(intent, AndroidLauncher.RC_LEADERBOARD));
        }
    }

    @Override
    public boolean isSignedIn() {
        return GoogleSignIn.getLastSignedInAccount(activity) != null;
    }

    @Override
    public void signOut() {
        signInClient.signOut().addOnCompleteListener(task -> {
            // 登出后的逻辑
            gamesClient = null;
        });
    }

    // 生命周期方法
    public void onStart() {
        if (isSignedIn()) {
            gamesClient.connect();
        }
    }

    public void onStop() {
        if (gamesClient != null) {
            gamesClient.disconnect();
        }
    }
}

5. 在核心游戏中调用Play服务逻辑

修改你的MyGame类(core模块),接收PlayServicesInterface实例,然后在需要的地方调用:

public class MyGame extends Game {
    private final PlayServicesInterface playServices;

    public MyGame(PlayServicesInterface playServices) {
        this.playServices = playServices;
    }

    @Override
    public void create() {
        // 比如在游戏启动时尝试登录
        if (!playServices.isSignedIn()) {
            playServices.signIn();
        }

        // 假设玩家完成关卡后得分,提交分数
        // playServices.submitScore(1000);

        // 假设点击排行榜按钮时显示
        // playServices.showLeaderboard();
    }

    // 其他游戏逻辑...
}

最后注意事项

  • 确保在Google Play Console中创建了对应的排行榜,并获取到正确的LEADERBOARD_ID
  • 添加测试账号到Play Console的测试列表中,否则普通账号无法登录测试
  • 测试时需要用真实设备(模拟器可能无法正常连接Google Play服务)

内容的提问来源于stack exchange,提问作者paarth batra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:10:15