我想在libgdx引擎上实现googleplay游戏服务。我试过用gdxgamesvc来做这个。但我在保存数据时遇到了问题。我从示例中了解到,保存的是一个值,而不是整个游戏状态。所以我决定检查一下:使用 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()
方法):
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();
下一步是加载。
异常没有被捕获,我删除了它,一切都像以前一样工作。
2条答案
按热度按时间rmbxnbpk1#
主要问题是
gameState
是null
,这是因为在开发人员控制台中启用save功能后必须等待24小时,而关于清除测试设备上google play games内存的建议没有帮助。过了一会儿gameState
开始传递现有的值,但我开始在图形流中遇到问题,可能是由于异步加载。qyswt5oh2#
好吧,libgdx不提供内置的云存储,很难使用它来实现这一点。:-)
在任何情况下,您都应该保存到本地和云,因为云的加载速度不是很快。
我看不出你的代码有什么问题,除了你吞下了一个
UnsupportedOperationException
如果您没有激活云保存功能,则会引发此错误。所以有趣的问题是:如果你不接受这个异常会发生什么,你初始化了吗GpgsClient
是否启用了云存储?你真的登录到gpgs了吗?这个功能在你的开发者控制台中也被激活了吗?