Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Окно JME закрывается даже при отказе от закрытия.

KiraLis39 Знаток (427), закрыт 1 неделю назад
Пишу игру на JMonkeyEngine.
Создано окно игры, расширяющее SimpleApplication, прописан слушатель на ESC - открывается модальное окно в стиле "Уверены, что хотите выйти на рабочий стол?". Если нажать Да - вызывается стоп и закрытие программы. Если нажать Нет - ничего не происходит, всё хорошо.

Проблема: если нажать крестик (Х) окна игры - тоже появляется запрос на выход, т.к. я переопределил метод public void destroy() из LegacyApplication class

Но, если нажать Да - всё хорошо, если же нажать Нет - окно закрывается, а программа продолжает работать, ведь моё метод завершения работы не сработал, я не хотел выходить.

Вопрос: как мне запретить JME вообще закрывать окно самостоятельно? Где найти и выпилить к такой-то матери слушатель или какие ещё методы переопределить? Я сам хочу решать, когда мне закрывать окно игры.

Дополнительно:
мой метод выхода слушателя игры
 private void onExit() { 
if ((int) new FOptionPane().buildFOptionPane("Подтвердить:", "Выйти на рабочий стол?", FOptionPane.TYPE.YES_NO_TYPE, Constants.getDefaultCursor()).get() == 0) {
// Нажали кнопку "Да, хочу":
super.destroy();
gameControllerService.exitTheGame(null, 0);
}
}

переопределённый метод уничтожения контекста, в этом же классе
 @Override 
public void destroy() {
onExit();
}
Лучший ответ
Kotakasi Мыслитель (6829) 1 неделю назад
Переопредели метод requestClose(boolean esc) вместо destroy(). Это позволит контролировать событие закрытия окна.
KiraLis39Знаток (427) 1 неделю назад
Я внутри его видел, но не совсем понял зачем он. Тем более, что boolean там игнорируется вообще. Но попробую..
Kotakasi Мыслитель (6829) KiraLis39, попробуй это перераспределение:
 @Override 
public void requestClose(boolean esc) { 
    onExit(); 
}  
А метод должен будет выглядеть так:
 private void onExit() {  
    int result = (int) new FOptionPane() 
        .buildFOptionPane("Подтвердить:", "Выйти на рабочий стол?", FOptionPane.TYPE.YES_NO_TYPE, Constants.getDefaultCursor()) 
        .get(); 
    if (result == 0) { 
        // Пользователь выбрал "Да" 
        super.stop(); // Корректно завершаем приложение 
    } 
    // Если пользователь выбрал "Нет", ничего не делаем — окно остается открытым 
} 
 
KiraLis39Знаток (427) 1 неделю назад
В классе LwjglWindow
В public void run() есть проверка флага, который надо прервать, если я нажимаю "нет"
 if (GLFW.glfwWindowShouldClose(this.window)) { 
this.listener.requestClose(false);
}
KiraLis39Знаток (427) 1 неделю назад
Решено, спасибо.
 private void onExit() { 
if ((int) new FOptionPane().buildFOptionPane("Подтвердить:", "Выйти на рабочий стол?", FOptionPane.TYPE.YES_NO_TYPE, Constants.getDefaultCursor()).get() == 0
) {
super.stop();
gameControllerService.exitTheGame(null, 0);
} else {
// Не закрываем окно:
glfwSetWindowShouldClose(((LwjglWindow) context).getWindowHandle(), false);
}
}

Теперь пойду думать как сделать фейковый полноэкранный режим так, чтоб рабочий стол не было видно через полосу снизу -_-"
Остальные ответы
Похожие вопросы