Manejando solicitudes de salida

Abandonando

La mayoría de las plataformas tienen la opción de solicitar que la aplicación se cierre. En las computadoras de escritorio, esto suele hacerse con el ícono "x" en la barra de título de la ventana. En Android, se utiliza el botón de retroceso para salir cuando se encuentra en la pantalla principal (y para retroceder en otras situaciones).

Manejando la notificación

En plataformas de escritorio, el MainLoop tiene una notificación especial llamada MainLoop.NOTIFICATION_WM_QUIT_REQUEST que se envía a todos los nodos cuando se solicita salir.

En Android, en cambio, se envía la notificación MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST. Presionar el botón de retroceso (Back) cerrará la aplicación si en la configuración del proyecto se ha seleccionado Application > Config > Quit On Go Back (que es la opción predeterminada).

Nota

MainLoop.NOTIFICATION_WM_GO_BACK_REQUEST no es compatible en iOS, ya que los dispositivos iOS no tienen un botón de retroceso físico.

El manejo de la notificación se realiza de la siguiente manera (en cualquier nodo):

func _notification(what):
    if what == MainLoop.NOTIFICATION_WM_QUIT_REQUEST:
        get_tree().quit() # default behavior

Cuando se desarrollan aplicaciones móviles, no se desea que se cierre a menos que el usuario se encuentre en la pantalla principal, por lo que se puede cambiar el comportamiento.

Es importante tener en cuenta que, de forma predeterminada, las aplicaciones de Godot tienen el comportamiento incorporado de cerrarse cuando se solicita salir. Sin embargo, este comportamiento se puede cambiar:

get_tree().set_auto_accept_quit(false)

Enviando su propia notificación de abandono

Si bien es posible forzar el cierre de la aplicación llamando a SceneTree.quit, al hacerlo, no se enviará la notificación de salida. Esto significa que la función descrita anteriormente no se llamará. Si se cierra la aplicación llamando a SceneTree.quit, no se permitirá que se completen acciones personalizadas (como guardar, confirmar el cierre o depurar), incluso si intentas retrasar la línea que fuerza el cierre.

En su lugar, deberías enviar una solicitud de cierre:

get_tree().notification(MainLoop.NOTIFICATION_WM_QUIT_REQUEST)