Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用gdx GameSvc将游戏数据保存到云?_Java_Android_Libgdx_Google Play Games - Fatal编程技术网

Java 如何使用gdx GameSvc将游戏数据保存到云?

Java 如何使用gdx GameSvc将游戏数据保存到云?,java,android,libgdx,google-play-games,Java,Android,Libgdx,Google Play Games,我想在libgdx引擎上的游戏中实现Google Play Games服务。我试着用gdx游戏机来做这个。但我在保存数据时遇到了问题。我从示例中了解到,保存的是一个值,而不是整个游戏状态。所以我决定检查一下:使用gsClient.loadGameState和gsClient.saveGameState保存并加载一个值。我故意从设备上删除了游戏数据。但结果,不仅测试值发生了变化,其他许多值也发生了变化。我以为整个游戏的状态都被保存了,但是​​获得的不符合游戏的逻辑,无法在游戏中获得。 我应该如何使

我想在libgdx引擎上的游戏中实现Google Play Games服务。我试着用gdx游戏机来做这个。但我在保存数据时遇到了问题。我从示例中了解到,保存的是一个值,而不是整个游戏状态。所以我决定检查一下:使用
gsClient.loadGameState
gsClient.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 是的,保存同时发生在云和设备上,用于保存到我使用的设备首选项。我在游戏中有一个Google帐户登录按钮,它可以工作,我反复看到我帐户级别的这个标准栏,当我登录时它会出现在顶部。一切都在开发者控制台中设置好了,我有一个成就和排行榜的id。在代码中,我像这样处理客户机(在
create()
方法中):

公共服务客户端gsClient;
if(gsClient==null){
gsClient=新的MockGameServiceClient(1){
@凌驾
受保护的阵列getLeaderboardEntries(){
返回null;
}
@凌驾
受保护的数组getGameStates(){
返回null;
}
@凌驾
受保护字节[]getGameState(){
返回新字节[0];
}
@凌驾
受保护的阵列(0){
返回null;
}
@凌驾
受保护的字符串getPlayerName(){
返回null;
}
};
}
gsClient.setListener(this);
gsClient.resumeSession();
接下来是加载。

异常没有被捕获,我删除了它,一切都像以前一样正常。

好吧,libgdx没有内置的云存储,很难使用它。:-)

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


我看不出你的代码有什么问题,除了你吞下了一个
不支持操作异常
,如果你没有激活cloud save功能就会抛出这个异常。因此,有趣的问题是:如果不接受异常,会发生什么情况?是否在启用云存储的情况下初始化了
GpgsClient
?您是否真的登录到Gpgs,并且该功能在您的开发人员控制台中也被激活了?

嗯,libgdx没有内置的云存储,很难使用它来实现这一点。:-)

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


我看不出你的代码有什么问题,除了你吞下了一个
不支持操作异常
,如果你没有激活cloud save功能就会抛出这个异常。因此,有趣的问题是:如果不接受异常,会发生什么情况?是否在启用云存储的情况下初始化了
GpgsClient
?您是否真的登录到Gpgs,并且该功能是否在开发人员控制台中也被激活?

主要问题是
游戏状态
null
,这是因为您在开发人员控制台中启用保存功能后必须等待24小时,关于在测试设备上清除google play游戏内存的建议也无济于事。过了一段时间,
gameState
开始传递现有值,但我开始在图形流方面出现问题,可能是由于异步加载。

主要问题是
gameState
null
,这是因为在开发人员控制台中启用保存功能后,您必须等待24小时,并且关于在测试设备上清除google play游戏内存的建议没有帮助。过了一段时间,
gameState
开始传递现有值,但我开始出现图形流问题,可能是因为异步加载。

我已经更新了问题中的信息,您可以看看,从云端加载数据时,会话没有时间启动,因此,我根本没有进入
gsClient.loadGameState()
。然后你应该调用
loadGameState
。我创建了一个加载屏幕,它的问题消失了,尽管我显然写得不好,而且从云端加载后所有变量都为零。我想我解决了这个问题,但我根本不明白是什么原因造成的。我已经更新了问题中的信息,你可以看一下,从云端加载数据时会话没有时间启动,所以我没有进入
gsClient.loadGameState()
一点也不。然后你应该调用
loadGameState
以后我创建了一个加载屏幕,它的问题消失了,尽管我显然写得很糟糕,而且从云端加载后,所有变量总是为零。我想我解决了这个问题,但我根本不明白是什么原因造成的。
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();