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