Проблема со сбросом логического значения и значения int в методе update ()

1

В моей игре я использую логическую переменную, называемую

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.

Теги:
int
boolean
updates

2 ответа

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

Попробуйте изменить

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 =?

  • 0
    Как уже упоминалось выше, я изменил его, но это не решило проблему. Текст по-прежнему остается на экране. И да, я имел в виду 3 секунды xD мой плохой
  • 0
    Сообщение о полном методе обновления может быть интересным сейчас.
Показать ещё 1 комментарий
0

Не должна ли эта часть:

onScreenTime--;
if (onScreenTime == 0){
    onScreen = false;
}

Также сбросьте onScreenTime:

onScreenTime--;
if (onScreenTime <= 0){
    onScreen = false;
    onScreenTime = 180;
}
  • 0
    Добавил эту часть, однако проблема все еще сохраняется :(
  • 0
    Возможно, это глупый вопрос, но уверен, что набрал 1000 баллов, необходимых для третьего уровня?
Показать ещё 4 комментария

Ещё вопросы

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