Java 定时器不工作。一次调用多个定时器

标签 java timer timertask

我开始使用 Java 制作游戏。我目前正在研究一个基本敌人,它将在射程内开火,当它开火时,我希望它等待 x 秒并以 y 的速率发射 3 颗子弹。

所以我决定使用计时器来创建这个延迟:

public class DelayFire
{
    Toolkit toolkit;

    Timer timer;
    //The enemy firing
    Enemy com;

    public DelayFire(double seconds, Enemy e, boolean un)
    {
        toolkit = Toolkit.getDefaultToolkit();
        timer = new Timer();
        com = e;
        timer.schedule(new FireTask(un), (int) seconds * 1000);
    }

    class FireTask extends TimerTask
    {
        public boolean unfire = false;

        public FireTask (boolean x)
        {
            this.unfire = x;
        }

        public void run()
        {
            if(com.health>0)
            {
                com.charging = false;
                com.fire();
                if(unfire==true)
                {
                    com.fire = false;
                    com.canFire = true;
                }
                this.cancel();
            }
        }
    }
}

然后我在敌人类中调用它 3 次,每次都有不同的延迟:

void spray()
{
    new DelayFire(2.0,this,false);
    new DelayFire(2.5,this,false);
    new DelayFire(3.0,this,true);
}

当玩家处于射击范围内时,会调用此 void(这也在 Enemy 类中):

if(canFire==true && fire==false)
{
    spray();
    canFire = false;
    fire = true;
}

然而,完成所有这些工作后,一旦我进入射程,它只会产生两颗子弹。直到我离开,再次进入敌人的视线。

注意:我只将代码中我预计会出现错误的部分放在其中。如果您需要查看更多代码,请告诉我。

最佳答案

你绝对确定只发射了两颗子弹吗?您可以尝试在 FireTaskrun() 方法中插入 System.out.println("Hello, Bullet World!") 。您可能会惊讶地发现该行会打印三次。

您正在经历的是强制转换的关联性。考虑您的代码的这一部分:

(int) seconds * 1000

由于 seconds 是一个 double,而您想要一个 int(或者可能是一个 long),因此您很自然地会想要对其进行强制转换。但是,转换不会将整个表达式 seconds * 1000 转换为 int - 只是 seconds。接下来,考虑 DelayFire 类的实例化:

new DelayFire(2.0,this,false);
new DelayFire(2.5,this,false);
new DelayFire(3.0,this,true);

此处,您使用 double 值 2.02.53.0。然而,2.5 在乘法之前被转换为 int,导致它变成一个平面 2。因此,您的程序将安排在 2 秒后发射两颗子弹,并在 3 秒后发射一颗子弹。

要解决此问题,请在包含乘法的整个表达式周围添加一些括号:

(int) (seconds * 1000)

这应该会产生正确的行为。不过,您的代码中可能还存在其他错误。但请先尝试一下。

编辑:顺便说一下,if 语句中的条件过于复杂。基本上,您可以通过编写 if (unfire == true) 将一个 boolean 值表达式转换为另一个 boolean 值表达式。由于 unfire 是一个 boolean 表达式,因此不需要 == 运算符。您可以简单地编写if(unfire)。不检查值是否为 false,而是使用一元 ! 运算符来否定表达式,if (!unfire)

关于Java 定时器不工作。一次调用多个定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22468804/

相关文章:

java - HSQLDB 内存数据库 JDBC 模板查询失败

java - 正则表达式分隔字符串

java - 如果条件为真,Libgdx 计时器每 5 秒一次,直到条件为真

android - Android中带回调函数的通用定时器类

java - ReentrantLock.Sync 中当前线程变量的搭载是如何工作的?

java - Jackson 使用子类反序列化

c++ - 开关(event.type)不工作并且计时器不显示

c# - 可移植类库中的计时器

Android - 2 定时器或其他东西?

java - 使用 TimerTask 延迟攻击效果不佳