Android 法力恢复问题

Android 法力恢复问题,android,timer,Android,Timer,我们在安卓工作室制作游戏,结果被卡住了。用于特定法术的资源(法力)应及时恢复,例如每5分钟恢复1点法力。我们真的不知道如何在比赛结束时恢复。是否有方法检查当前日期/时间并计算补充的法力值?将日期和时间转换为字符串并将其与新的日期/时间进行比较似乎是一项“令人兴奋的”工作,但如果有办法,我们将绕过这些机制。 提前感谢。无需使用Date对象,只要使用System.currentTimeMillis()就可以了。这里有一个基本的大纲: long mLastManaRefreshTime = Syste

我们在安卓工作室制作游戏,结果被卡住了。用于特定法术的资源(法力)应及时恢复,例如每5分钟恢复1点法力。我们真的不知道如何在比赛结束时恢复。是否有方法检查当前日期/时间并计算补充的法力值?将日期和时间转换为字符串并将其与新的日期/时间进行比较似乎是一项“令人兴奋的”工作,但如果有办法,我们将绕过这些机制。
提前感谢。

无需使用
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
以来经过的时间,并补充所需的数量


如果在游戏关闭时需要此功能,可以将
mlastmanarefreshttime
保存到
SharedReferences
对象中,并在游戏再次加载时重新加载它。

在后台执行此操作的最佳方法是在清单中注册一个接收者。这意味着即使应用程序关闭,接收器也会继续收听广播

您需要的是在注册收件人时执行此特定操作。
Intent.action\u TIME\u TICK

关于这件事,这里有一个更详细的答案

另一个解决方案是在java中使用Calendar类。有了它,你可以得到从过去的某一点到现在的确切时间。这样,您就不必担心解析日期和类似的问题。我不能提供具体的例子,因为我本人没有太多使用Calendar类,但我相信您可以在官方文档和stackoverflow上找到很多关于它的内容。

使用Calendar类,可以以毫秒为单位显示当前时间戳。 您可以在跑步游戏中每隔5分钟在首选项中保存最新的时间戳。对于另一种情况,当你的应用程序从没有这样做的状态返回时(即第一次调用、唤醒等)。 大概是这样的:

int manacycles = ((int) (((System.currentTimeMillis() - oldtimestamp) / 1000) / 60) ) % 5;
会给你必须增加的法力值

或者你也可以在课堂上做同样的事情

同时要记住,玩家可以通过改变时间来作弊。如果您的游戏在线,您可以通过以下方式从互联网获得时间:

 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();
    }