1

私はいくつかの魔法の呪文を作成していますが、明らかに各使用の間に遅延が必要です.

現在、google によると、1 秒は 1000000000 ナノ秒です。

ただし、魔法の呪文は 2 秒以内に再充電されます。

@EventHandler
public void onInteract(PlayerInteractEvent e){
    Player p = e.getPlayer();
    if (p.getItemInHand().getType().equals(Material.BLAZE_ROD)){
        {
            {
                if (!kam.containsKey(p.getName())) kam.put(p.getName(), (long) 0);
                if (kam.get(p.getName()) < System.nanoTime()){
                    kam.remove(p.getName());
                    kam.put(p.getName(), System.nanoTime() + (1000000000 * 30));
                    //Do magic spell attack here.
                    }
                }
            }else{
                p.sendMessage(ChatColor.AQUA + "Skill recharging!");
            }
}

明らかに、私のコードはSystem.nanoTime()プラス 30 秒を追加しようとしており、現在のシステムnanoTimeがハッシュマップに入れたシステムよりも大きいかどうかを確認し、大きい場合は呪文を実行します。

4

2 に答える 2

5

値を印刷して確認することをお勧めします1000000000 * 30。大きすぎて整数に収まらないため、ラップアラウンドしていることがわかります。

つまり、次のプログラムです。

public class Test
{
    public static void main(String args[])
    {
        System.out.println(1000000000 * 30);
        System.out.println(1000000000L * 30);
    }
}

プリントアウト:

-64771072
30000000000

したがって、longバリアントを使用すると、正常に動作します。

于 2014-11-29T11:20:06.463 に答える
5

Java の裸の数値リテラルは s として扱われるintため、計算がオーバーフローします。これを修正する 1 つの方法は、リテラルの後に次longを追加して、リテラルを使用して計算を実行することです。L

kam.put(p.getName(), System.nanoTime() + (1000000000L * 30L));
于 2014-11-29T11:21:03.770 に答える