Таймер Java не работает. Вызов нескольких таймеров одновременно

1

Я начал делать игру с использованием Java. В настоящее время я работаю над основным врагом, который стреляет в радиусе действия, и когда он срабатывает, я хочу, чтобы он подождал х секунд и выстрелил 3 пули со скоростью y.

Поэтому я решил использовать таймер для создания этой задержки:

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

Затем, который я вызываю в классе Enemy, он 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;
}

Но после всей этой работы она создаст только две пули, когда я окажусь в радиусе действия. Пока я не уйду и снова не вернусь к вражескому зрелищу.

Примечание. Я помещаю только части своего кода, где я ожидаю, что будет допущена ошибка. Дайте мне знать, если вам нужно увидеть больше кода.

Теги:
timer
timertask

1 ответ

0
Лучший ответ

Вы абсолютно уверены, что стреляют только две пули? Вы можете попробовать вставить System.out.println("Hello, Bullet World!") В метод run() FireTask. Вы можете быть удивлены, обнаружив, что строка будет печататься три раза.

То, что вы испытываете, - это ассоциативность бросков. Рассмотрим эту часть вашего кода:

(int) seconds * 1000

Поскольку seconds являются двойными, и вам нужен int (или, возможно, длинный), естественно, что вы захотите его бросить. Тем не менее, бросок не передает целое выражение seconds * 1000 в int - всего несколько seconds. Затем рассмотрим ваши экземпляры вашего класса DelayFire:

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

Здесь вы используете двойные значения 2.0, 2.5 и 3.0. Тем не менее, 2.5 перед тем, как размножаться, бросается в int, заставляя его стать плоской 2. В результате ваша программа будет планировать запуск двух пулей через 2 секунды и одну пулю, которая будет запущена через 3 секунды.

Чтобы обойти эту проблему, вставьте несколько круглых скобок вокруг всего выражения с умножением на него:

(int) (seconds * 1000)

Это должно привести к правильному поведению. Однако могут быть другие ошибки в коде. Но сначала попробуйте это.

Изменить: как примечание, условия в вашем if -statements сложны. Вы в основном превращаете булевозначное выражение в другое if (unfire == true) выражение, записывая if (unfire == true). Поскольку unfire является булевым выражением, нет необходимости в операторе ==. Вы можете просто написать if (unfire). И вместо проверки, является ли значение ложным, используйте унарный ! -operator, чтобы отрицать выражение, if (!unfire).

  • 0
    Спасибо, что помогли!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню