我们在Android Studio中制作游戏,但我们陷入困境。用于特定法术的资源(法术力)应该按时恢复,例如:每5分钟1点法力值。在游戏结束时,我们真的无法让它恢复。有没有办法检查当前日期/时间并计算补充的法力值?将日期和时间转换为String并将其与新的日期/时间进行比较似乎是一个令人兴奋的"工作要做,但如果有办法,我们会绕过这些机制。 提前谢谢。
答案 0 :(得分:0)
无需使用Date
个对象,System.currentTimeMillis()
的简单用法应该有效。这是一个基本概要:
long mLastManaRefreshTime = System.currentTimeMillis();
void refreshMana()
{
long timeDelta = System.currentTimeMillis() - mLastManaRefreshTime;
mLastManaRefreshTime = System.currentTimeMillis();
float totalManaToRefresh = (float)AMOUNT_TO_REFRESH_IN_ONE_MINUTE * ((float)timeDelta / 60000f);
mMana += totalManaToRefresh;
if (mMana > MAX_MANA)
mMana = MAX_MANA;
}
这种方法当然只是一个大纲。每个更新周期都需要调用一次。它将计算自上次调用refreshMana
以来经过的时间,并补充所需的金额。
如果您在游戏关闭时需要此功能,则可以将mLastManaRefreshTime
保存到SharedPreferences
对象,并在游戏重新加载时重新加载。
答案 1 :(得分:0)
在后台执行此操作的最佳方法是在清单中注册接收器。这意味着即使应用程序关闭,接收器也会继续收听广播。
注册接收器Intent.ACTION_TIME_TICK
这里有关于此事的更详细的答案Time change listener
另一个解决方案是在java中使用Calendar类。有了它,您可以获得从过去的一个点到此刻的确切分钟数。这样您就不必担心解析日期和类似问题了。我不能为您提供具体的示例,因为我自己并没有非常使用Calendar类,但我相信您可以在官方文档和stackoverflow中找到很多东西。
答案 2 :(得分:0)
使用System.currentTimeMillis(),您可以以毫秒为单位显示当前时间戳。 您可以在正常运行游戏的每5分钟刻度线中保存最新的时间戳。对于另一种情况,当你的应用程序从不执行此操作的状态返回时(即第一次调用,唤醒等)。 像这样:
int manacycles = ((int) (((System.currentTimeMillis() - oldtimestamp) / 1000) / 60) ) % 5;
会给你你必须添加的法力点数。
或者你可以用Calendar类做同样的事情。
另外请记住,玩家可以通过简单地改变他们的时间来欺骗这种方式。如果您的游戏在线,您可以通过互联网获得时间,例如this:
try {
TimeTCPClient client = new TimeTCPClient();
try {
// Set timeout of 60 seconds
client.setDefaultTimeout(60000);
// Connecting to time server
// Other time servers can be found at : http://tf.nist.gov/tf-cgi/servers.cgi#
// Make sure that your program NEVER queries a server more frequently than once every 4 seconds
client.connect("nist.time.nosc.us");
System.out.println(client.getDate());
} finally {
client.disconnect();
}
} catch (IOException e) {
e.printStackTrace();
}