【问题标题】:How to save game data to the cloud using gdx-gamesvcs?如何使用 gdx-gamesvcs 将游戏数据保存到云端?
【发布时间】:2020-12-10 03:45:05
【问题描述】:

我想在 libgdx 引擎上的游戏中实现 Google Play 游戏服务。我为此尝试使用 gdx-gamesvcs。但我无法保存数据。我从示例中了解到,正在保存一个值,而不是整个游戏状态。所以我决定检查一下:使用gsClient.loadGameStategsClient.saveGameState 保存并加载一个值。我故意从设备中删除了游戏数据。但结果,不仅测试值发生了变化,许多其他值也发生了变化。我以为是整个游戏的状态正在被保存,但是得到的值不符合游戏的逻辑,无法在里面获取。 我应该如何使用这个工具,它是否值得,还是使用 libgdx 本身提供的更好? 下面是一段代码:

if (gsClient.isSessionActive()) {
            try {
                gsClient.saveGameState("data", intToByteArray(testValue), 0, null);
            } catch (UnsupportedOperationException unsupportedOperationException) {
}


if (gsClient.isSessionActive()) {
            try {
                gsClient.loadGameState("data", new ILoadGameStateResponseListener() {
                    @Override
                    public void gsGameStateLoaded(byte[] gameState) {
                        if (gameState != null) {
                            setTestValue(bytesToInt(gameState));
                        }
                    }
                });
            } catch (UnsupportedOperationException unsupportedOperationException) {
            }
}

UPD 是的,保存到云和设备都发生,为了保存到我使用首选项的设备。我在游戏中有一个谷歌帐户登录按钮,它可以工作,我多次看到我的帐户级别的这个标准栏,当我登录时出现在顶部。一切都在开发者控制台中设置,我有一个 id成就和排行榜。在代码中,我像这样与客户端一起工作(在create() 方法中):

public IGameServiceClient gsClient;

if (gsClient == null) {

            gsClient = new MockGameServiceClient(1) {
                @Override
                protected Array<ILeaderBoardEntry> getLeaderboardEntries() {
                    return null;
                }

                @Override
                protected Array<String> getGameStates() {
                    return null;
                }

                @Override
                protected byte[] getGameState() {
                    return new byte[0];
                }

                @Override
                protected Array<IAchievement> getAchievements() {
                    return null;
                }

                @Override
                protected String getPlayerName() {
                    return null;
                }
            };
        }
        gsClient.setListener(this);
        gsClient.resumeSession();

接下来正在加载。
异常没有被捕获,我删除了它,一切都和以前一样。

【问题讨论】:

    标签: java android libgdx google-play-games


    【解决方案1】:

    好吧,libgdx 没有提供内置的云保存,因此很难使用它。 :-)

    在任何情况下,您都应该保存到本地和云端,因为云端加载其状态的速度不是很快。

    我看不出你的代码有什么问题,除了你吞下了一个UnsupportedOperationException,如果你没有激活云保存功能就会抛出这个问题。所以有趣的问题是:如果您不吞下异常会发生什么,并且您是否在启用云保存的情况下初始化GpgsClient?您是否真的登录了 Gpgs,并且该功能是否也在您的开发者控制台中激活?

    【讨论】:

    • 我已经更新了问题中的信息,你可以看看
    • 从云端加载数据时会话没有时间开始,所以我根本没有进入gsClient.loadGameState()
    • 那你应该稍后打电话给loadGameState
    • 我创建了一个加载屏幕,它的问题消失了,虽然我显然写得不好,而且从云加载后我总是把所有变量都归零。我想我解决了这个问题,但我根本不明白是什么原因造成的。
    【解决方案2】:

    主要问题是gameStatenull,这是因为你在开发者控制台中启用保存功能后必须等待24小时,以及关于清除google play游戏内存的建议对测试设备没有帮助。一段时间后gameState 开始传递现有值,但我开始遇到图形流问题,可能是由于异步加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-01
      • 1970-01-01
      • 2015-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多