有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我开始用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);
}

当玩家在射程内时(这也是敌人的职业),该虚空被调用:

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

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

注意:我只把我的代码的一部分放在我预期会出错的地方。如果您需要查看更多代码,请告诉我


共 (1) 个答案

  1. # 1 楼答案

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

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

    (int) seconds * 1000
    

    因为seconds是一个双精度数,并且您需要一个int(或者可能是一个long),所以您自然会想要对它进行强制转换。但是,强制转换不会将整个表达式seconds * 1000强制转换为int-just seconds。接下来,考虑您的^ {< CD7>}类的实例化:

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

    这里,使用双值2.02.53.0。但是,在乘法之前2.5被强制转换为int,导致它变成平坦的2。因此,您的程序将安排2秒后发射两颗子弹,3秒后发射一颗子弹

    若要解决此问题,请在整个表达式周围插入一些括号,其中包含乘法:

    (int) (seconds * 1000)
    

    这将导致正确的行为。不过,代码中可能还有其他错误。但是先试试看

    Edit:作为旁注,if-语句中的条件过于复杂。通过写入if (unfire == true),基本上可以将一个布尔值表达式转换为另一个布尔值表达式。由于unfire是一个布尔表达式,因此不需要==运算符。您只需编写if (unfire)。使用一元!-运算符对表达式if (!unfire)求反,而不是检查值是否为false