Escribir programas con Interfaces Gráficas de Usuario (GUI) puede ser un reto grande y complejo de realizar en C++. Se complica todavía más cuando estas deben ser multiplataforma.

Es bastante común usar bibliotecas de gráficos para escribir videojuegos. Algunas de las más populares son Gtk y Qt, la cuales son compatibles con los lenguajes C y C++, y también tienen bindings para otros lenguajes, lo que significa que hay una especie de envoltorio que permite usar las funcionalidades de una biblioteca escrita en C o C++ desde un programa escrito en Python, Java, C#, etc. A partir de Gtk aparece Gtkmm que es la interfaz de Gtk para C++.

En C++ no hay una biblioteca de gráficos dentro del estándar por lo cual es necesario recurrir a estas bibliotecas de terceros.

Dependencias

El manejo de dependencias suele ser uno de los mayores inconvenientes. Por medio de Conan se pueden encontrar recetas para SFML, ImGui, Gtk, Qt, y raylib, entre otras. Adicionalmente, en el artifactory Bincrafters de Conan se encuentran los paquetes para wxWidgets.

Conan y CMake

Con la ayuda de Conan se pueden instalar las dependencias requeridas para enlazar algunas de estas bibliotecas de manera simple usando CMake y find_package.

El archivo conanfile (para versión menor a 2.0) que las incluye puede verse así:

# conanfile.txt
[requires]
  qt/6.1.1
  gtk/4.1.2
  raylib/3.5.0
  imgui/1.90.5
  sfml/2.6.1
  wxwidgets/3.1.5@bincrafters/stable
  
[generators]
  cmake_find_package

[options]
  qt:shared=True
  gtk:shared=True

Y el CMakeLists del proyecto que las enlaza debe incluir las siguientes instrucciones:

## CMakeLists.txt
#...

set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_BINARY_DIR})

find_package(Qt6        REQUIRED)
find_package(gtk        REQUIRED)
find_package(sfml       REQUIRED)
find_package(raylib     REQUIRED)
find_package(wxwidgets  REQUIRED)
find_package(imgui      REQUIRED)


target_link_libraries(${PROJECT_NAME}
  PRIVATE
  Qt6::Qt6
  gtk::gtk
  sfml::sfml
  raylib::raylib
  wxwidgets::wxwidgets
  imgui::imgui
)
# ...

Lo anterior puede ser suficiente para escribir un “Hola Mundo” usando cada una de las bibliotecas incluidas, dejando que Conan se encargue de su instalación.

Comentarios

Las sintaxis de Qt y wxWidgets son muy particulares, y están poco orientadas al lenguaje C++, por lo cual es trabajoso acostumbrarse a usar sus funcionalidades. Raylib y Gtk son bastante simples y fáciles de usar, pero no aprovechan algunas ventajas de C++, no usan namespaces y abusan de los macros.

Considero que SFML y Dear ImGui son un poco más sencillas de entender, pueden ofrecer un algo más de flexibilidad, e interactúan bien entre ellas.

En mi concepto, la biblioteca más intuitiva de usar es Dear ImGui, la cual puede usar como backend a SFML; para este fin existe el paquete ImGui-SFML el cual las incluye a ambas, y agrega unas cuantas mejoras que permiten usarla con C++ moderno, y facilitan la integración con la STL.

En general, considero que la documentación existente para todas estas bibliotecas es escasa, el código suele ser complejo de leer, y es complicado encontrar ejemplos en español. Me he decantado por esta mezcla de ImGui+SFML porque lo veo como una sintaxis familiar para mí, y no suele tener tanto código boilerplate, que se refiere a las secciones que se copian y pegan casi sin modificaciones para comenzar a usar una funcionalidad o biblioteca.

Videojuegos en C++

Escribir videojuegos en cualquier lenguaje de programación suele ser bastante llamativo. Lidiar con la instalación de dependencias es frustrante y desestimula el uso del lenguaje, que ya de por sí es bastante complejo. Con los pasos anteriores se puede tomar fácilmente un juego ejemplo y compilarlo localmente.

Este corto video de Kofybrek ilustra cómo escribir un juego en C++ no tiene que ser algo terriblemente complejo: Super Mario (NES) en C++ con SFML. Y si se le añade el manejo de la dependencia SFML usando Conan es posible tomar el código fuente y compilarlo. Así, aprender C++ puede hacerse más entretenido.

Fuentes

Deja un comentario