法力恢复问题

时间:2015-08-24 08:16:39

标签: android timer

我们在Android Studio中制作游戏,但我们陷入困境。用于特定法术的资源(法术力)应该按时恢复,例如:每5分钟1点法力值。在游戏结束时,我们真的无法让它恢复。有没有办法检查当前日期/时间并计算补充的法力值?将日期和时间转换为String并将其与新的日期/时间进行比较似乎是一个令人兴奋的"工作要做,但如果有办法,我们会绕过这些机制。 提前谢谢。

3 个答案:

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