Замените этот код ...
while (hAct == 0){
continue;
}
... этим вместо этого:
while (hAct == 0){
try {
Thread.yield();
} catch (InterruptedException interruptedEx) {
// Log the interruption somewhere.
}
}
Предполагается, что вы используете AWT / Swing на каком-то уровне?Это бесконечный цикл, предотвращающий запуск других потоков.Делая это, вы никогда не позволяете потоку пользовательского интерфейса фактически выполнять какие-либо обновления, что означает, что он кажется зависшим.Возможно, вы не выполняете какие-либо потоки самостоятельно, но AWT / Swing поставляется с потоками, встроенными для выполнения различных функций, и им необходимо периодически получать время ЦП для выполнения своей работы.
Причина, по которой это работает при отладкепотому что отладчик приостанавливает метод herosTurn
, пока вы проходите по нему, позволяя потоку пользовательского интерфейса выполнять свои обновления (включая получение информации от пользователя), но при простом запуске игры метод herosTurn
никогда не останавливаетсяи этот метод занимает 100% доступного процессорного времени для вашего приложения.
Наконец, как упоминает Майк Кларк , вы обычно не должны писать пользовательский интерфейс с бесконечными циклами.Вместо этого вы определяете компоненты, которые запускают события.Ваш код уведомляется об этих событиях и реагирует соответствующим образом.Это то, что известно как модель событий пользовательского интерфейса.Если вы используете Swing, вводная информация о работе в модели событий описана здесь .
Я бы также не стал использовать AWT / Swing для игр из-за сложностей, связанных сКодирование пользовательского интерфейса, производительность рендеринга и ряд других причин, связанных с реальностью того, что AWT / Swing не были созданы, чтобы быть хорошими инструментами для игр.При этом пошаговая игра может нормально работать таким образом (поскольку требования к производительности рендеринга часто намного ниже), если вы хотите углубиться в код пользовательского интерфейса, чтобы выполнить это, в дополнение к нескольким другим причинам, которые яизложил в предыдущий ответ .