#java #lwjgl
#java #lwjgl
Вопрос:
Я только начал использовать LWJGL, и поэтому это невероятно простая проблема, с которой можно столкнуться, но я просмотрел Интернет и не могу придумать никакого решения. Также, вероятно, уместно: я на Mac.
Даже когда я нажимаю кнопку x, метод Display.isCloseRequested() отказывается возвращать true . Ниже приведен код для всего моего класса «window», который в основном является оболочкой для отображаемого объекта.
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.*;
public class Window {
public static void createWindow(int width, int height, String title){
Display.setTitle(title);
try {
Display.setDisplayMode(new DisplayMode(width,height));
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
}
}
public static void render(){
Display.update();
}
public static boolean isCloseRequested(){
System.out.println(Display.isCloseRequested());
return Display.isCloseRequested();
}
public static int getWidth(){
return Display.getDisplayMode().getWidth();
}
public static int getHeight(){
return Display.getDisplayMode().getHeight();
}
public static String getTitle(){
return Display.getTitle();
}
}
На этот класс ссылается метод в основном классе, который выглядит следующим образом:
private void run(){
isRunning = true;
while(isRunning){
if (Window.isCloseRequested())
stop();
render();
}
}
Метод stop никогда не запускается, даже когда я нажимаю x-кнопку.
Комментарии:
1.
System.out.println(Display.isCloseRequested());
— вы поставили это для устранения неполадок? Последующий вызовDisplay.isCloseRequested()
будет (почти) всегда возвращать false .
Ответ №1:
Сделал несколько простых уроков, таких как http://ninjacave.com/lwjglbasics1 производить подобное ошибочное поведение?
Важно: я думаю, что существует также сброс события intern, которое id вызвало нажатием кнопки x, если вы дважды вызываете isCloseRequested.
Поэтому попробуйте сохранить событие и удалить системную строку
Ответ №2:
Ваша цель — просто остановить render()
процесс, когда окно приложения закрыто?
Если это так, просто добавьте это в свое основное JFrame
определение:
//replace frame with your main JFrame containing the X close button
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent we) {
isRunning = false;
frame.setVisible(false);
frame.dispose();
}
});
… и измените свой 2-й код на это:
private void run(){
isRunning = true;
while(isRunning){
render();
}
}
Таким образом, когда вы закрываете главное окно своего приложения, значение переменной isRunning
изменяется на false
, и ваш while()
цикл завершается завершением вашего render()
.
На самом деле, сегодня я сам имел дело именно с этой проблемой. Я нажал на ваш пост до решения моей проблемы, но как только я ее решил, я возвращаюсь сюда, чтобы опубликовать свое решение (или, по крайней мере, то, как оно работало для меня).
Конечно, вы должны сделать одну и ту же isRunning
переменную доступной для обоих.
На самом деле я тоже так и не узнал, почему это isCloseRequested()
никогда не меняется false
после того, как я закрыл свое приложение. Неважно, это мой рабочий файл — надеюсь, он сработает и для вас.