Я начал делать игру с использованием 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;
}
Но после всей этой работы она создаст только две пули, когда я окажусь в радиусе действия. Пока я не уйду и снова не вернусь к вражескому зрелищу.
Примечание. Я помещаю только части своего кода, где я ожидаю, что будет допущена ошибка. Дайте мне знать, если вам нужно увидеть больше кода.
Вы абсолютно уверены, что стреляют только две пули? Вы можете попробовать вставить 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)
.