Для проекта колледжа мне поручили сделать приключенческую игру на Java. Среди прочего, я использовал потоки и библиотеку свинга, но теперь столкнулся с проблемой.
// The following is in the constructor of a subclass of JPanel
gameViewThread = new Thread(() -> {
double previous = System.currentTimeMillis();
double lag = 0.0;
double current;
double elapsed;
while(true){
current = System.currentTimeMillis();
elapsed = current - previous;
previous = current;
lag += elapsed;
System.out.println("Checking up on stuff...");
while(OverworldMap.initialised && lag >= 17) {
generateBackground();
lag -= 17;
}
}
});
В строке 11 приведенного выше вставленного кода у меня есть оператор печати, который я хотел бы удалить. (Я не хочу заливать консоль ненужной информацией). Однако, когда я удаляю это утверждение, визуальные эффекты не обновляются. Я проверял это снова и снова и убедился, что OverworldMap.initialized возвращает true. При запуске кода в режиме отладки я убедился, что работает generateBackground(). Так что мне кажется, что визуальные эффекты просто не обновляются, пока вы не «разбудите» Систему.
ПРИМЕЧАНИЕ. generateBackground() создает и сохраняет изображение в переменной BufferedImage, а repaint() обеспечивает его отрисовку в правильном месте. (repaint() вызывается в основном потоке 30 раз в секунду) Эти два метода работают. Они работали до того, как я попытался перенести генерацию фона (вспомните анимацию тайлов из Pokemon Fire Red o/e) в другой поток. (Я не хотел, чтобы логика и анимация мешали друг другу. (У меня была низкая частота кадров))
generateBackground()
вrepaint()
? Есть ли изменчивая переменная синхронизированного раздела? - person   schedule 22.03.2017