如何使用 gdx-gamesvcs 将游戏数据保存到云端?

Posted

技术标签:

【中文标题】如何使用 gdx-gamesvcs 将游戏数据保存到云端?【英文标题】:How to save game data to the cloud using 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();

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

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

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

【讨论】:

以上是关于如何使用 gdx-gamesvcs 将游戏数据保存到云端?的主要内容,如果未能解决你的问题,请参考以下文章

使用 NSData 和 NSMutableArrays 保存 OS X 游戏数据

如何保存文件以免被删除——就像小塔

如何在我的游戏中保存用户的等级?

如何保存游戏数据[关闭]

如何使用 UserDefaults 快速将高分保存到游戏中? [复制]

保存游戏状态 Android