安卓游戏-时间跟踪

4
我有一个安卓的益智游戏。当游戏开始时,我会记录下当前时间:long startTime = System.currentTimeInMillis()。当玩家完成拼图后,我会再次记录时间并减去起始时间,这样就可以计算出经过的时间。这部分没问题。
我的问题在于应用程序被打断时该怎么办。例如电话打进来。此时,拼图会自动保留在之前的状态(因为已经在视图中了)。但是,计算 completionTime = currentTime - startTime 将不再有效。
我曾尝试使用onSaveInstaceState(Bundle)保存经过的时间。然而,其对应方法onRestoreInstanceState(Bundle)并没有在重新进入应用程序时被调用。相反,在这种情况下,将调用onResume()方法。我读到这是因为应用程序还没有被“杀死”,而只是仍然在内存中。在“杀死”应用程序的情况下,我想象视图的状态也会丢失?在这种情况下,我认为跟踪视图并不是非常必要的,因此我不会担心时间丢失。
有没有一种方法可以从onResume()方法中读取捆绑包,或者我是否应该使用共享首选项?我想避免在游戏循环中更新经过的时间,因为这似乎效率不高。
2个回答

9
我建议不要使用SharedPreference。
您只需要两个字段:startTimeelapsedTime
当玩家开始时,将elapsedTime初始化为0,并将startTime初始化为System.currentTimeMillis()
当调用onPause()时,使用以下方法初始化elapsedTime
elapsedTime = elapsedTime + (System.currentTimeMillis() - startTime);

当调用onResume()方法时,将startTime初始化为System.currentTimeMillis()

当播放器完成时,时间为

elapsedTime = elapsedTime + (System.currentTimeMillis() - startTime);

如果逻辑有缺陷,请评论(:

注意:存在一种只使用一个字段的方法!但我们将让读者自行发现。


如果系统重新启动,变量会受到影响。所以考虑到游戏没有被关闭或手机没有重新启动,你的想法是好的。但在这些极端情况下,存储时间是必要的。 - Yashwanth Kumar
如果游戏被终止,一切都会消失!但是,如果你选择保存游戏的状态!请保存这两个变量。这比使用SharedPreferences更好。 - Sherif elKhatib
是的,你再一次说得对。只要游戏没有保存,但一般游戏都有保存功能,我是从那个角度考虑的。 - Yashwanth Kumar
我还没有添加保存功能。我认为我不会费心,因为大多数游戏只需要几分钟就能完成。我已经实现了与你建议的Sherif相似的东西,并且它看起来是有效的。在onPause()中,我有elapsed = System.currentTimeMillis() - startTime,而在onResume()中,我有startTime = System.currentTimeMillis() - elapsed。并不是我认为你的建议不可行,但是这种方法需要在我的代码其他地方进行较少的更改(尽管我有一个变量startTime,它实际上并不代表开始时间) - Wozza
这是关于编程的灵感...我很高兴。 - Sherif elKhatib

2

我认为shared preference是一个更好的选择。

  1. 在onPause()中计算时间差,当游戏进入后台时,假设用户已经在玩游戏。将这个差值加上之前在shared preference中存储的时间并再次存储。

  2. 在onResume()中重新启动时钟,并根据需要重复步骤1。

希望你明白我的意思。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接