В моей игре я использую логическую переменную, называемую
onScreen
и он устанавливается в true каждый раз, когда начинается игра. У меня также есть переменная int, называемая
onScreenTime
когда игра начинается. Они используются для отображения текста "Подготовка к волне X" на экране в течение установленного промежутка времени. Поскольку onScreenTime равно 180, а fps равно 60, текст отображается только в течение 2 секунд. По прошествии 2 секунд на экране onScreen установлено значение false, и игра продолжается. Код:
if (onScreen){
g.setFont(new Font("Geneva", Font.BOLD, 50));
g.setColor(Color.BLACK);
g.drawString("Prepare for wave: " + currentLevel,400,500);
}
рисует текст на экране только тогда, когда onScreen = true. Следующий код находится в методе update() и манипулирует двумя упомянутыми переменными:
onScreenTime--;
if (onScreenTime == 0){
onScreen = false;
}
В основном, onScreenTime уменьшается на 1 каждый раз, когда вызывается update() (60 раз в секунду), и если оно равно 0, тогда onScreen = false. Тогда в том же методе update() у меня есть два оператора if, которые должны быть довольно понятными:
if (score > 500){
currentLevel = 2;
onScreen = true;
onScreenTime = 180;
}
if (score > 1000){
currentLevel = 3;
onScreen = true;
onScreenTime = 180;
}
И, наконец, в том же методе update(), у меня есть
if (currentLevel == 1 && onScreen == false){
wave(2,enemyP,100);
}
if (currentLevel == 2 && onScreen == false){
wave(3,enemyP1,90);
}
if (currentLevel == 3 && onScreen == false){
wave(3,enemyP2,80);
}
currentLevel определяет врага, его нарисованное изображение, сколько рисунков на экране за раз, и как часто они появляются. wave() - метод, который создает волны для каждого уровня. Он представлен:
public void wave(int amount, Image i, int seconds){
for (int x = amount; x > 0; x--){
if (frameCount % seconds == 0){
Random r = new Random();
int randX = r.nextInt(width - 20)+10;
army.add(new EnemyShip(randX,(int)(Math.random()*100)-300,enemyH,enemyW,i,10));
}
}
}
я - это изображение, врагH и врагW = 30, а 10 - жизнь. Это будет изменено позже. Моя проблема в том, что как только появится текст "Подготовка к волне: 2", он не исчезнет. Первая "Подготовка к волне: 1" работает и исчезает отлично, но вторая не делает, поэтому врагов не будет порождено.
EDIT: Как указано в комментариях, я написал 2 секунды, и это должно быть для 3. EDIT: я изменил свой предыдущий метод на это:
if (onScreenTime <= 0){
onScreen = false;
onScreenTime = 180;
}
а также изменил предыдущий метод:
if (score == 500){
currentLevel = 2;
onScreen = true;
onScreenTime = 180;
}
if (score == 1000){
currentLevel = 3;
onScreen = true;
onScreenTime = 180;
}
Счет увеличивается на 20 за каждый удар. Я считаю, что проблема заключалась в том, что я решил, что (оценка> 500) вместо == 500.
Попробуйте изменить
onScreenTime--;
if (onScreenTime == 0){
onScreen = false;
}
в
onScreenTime--;
if (onScreenTime <= 0){
onScreen = false;
onScreenTime = 180;
}
Состояние гонки может привести к тому, что onScreenTime станет ниже нуля, что затруднит отслеживание проблем.
сброс onScreenTime до 180 (скорее всего) приведет к исчезновению текущей проблемы.
КСТАТИ:
Поскольку onScreenTime равно 180, а fps равно 60, текст отображается только в течение 2 секунд.
Я ожидаю, что это будет 3 секунды: 180/60 =?
Не должна ли эта часть:
onScreenTime--;
if (onScreenTime == 0){
onScreen = false;
}
Также сбросьте onScreenTime:
onScreenTime--;
if (onScreenTime <= 0){
onScreen = false;
onScreenTime = 180;
}