Aller au contenu

Build & lancement

Cette page suppose que Raylib est déjà installé sur votre système. Sans cela, la compilation échouera au link.

Compiler

Le GUI se compile avec GNU Make depuis le dossier gui/ :

cd gui
make

La sortie est le binaire build/zappy_gui (gui/Makefile:12). Le Makefile expose les cibles habituelles :

Cible Effet
make (all) Compile build/zappy_gui
make clean Supprime les objets (build/obj)
make fclean clean + supprime le binaire
make re fclean puis all

Le compilateur est g++ en -Wall -Wextra -std=c++17 (gui/Makefile:1), avec les répertoires d'en-têtes src/core, src/network, src/renderer, src/world, src/player (gui/Makefile:4). Neuf unités de traduction sont compilées (gui/Makefile:15) ; gui/raylib/Window.cpp est volontairement exclu (code mort).

Wrapper à la racine

Le Makefile racine du dépôt construit les trois composants (gui, ai, server) et génère un petit script ./zappy_gui à la racine (Makefile:11) :

make            # à la racine : construit tout
./zappy_gui -h 127.0.0.1 -p 4242

Ce wrapper fait simplement cd gui/build/ puis exec ./zappy_gui "$@" (Makefile:13). Il existe pour que le binaire trouve ses assets — voir Résolution des assets plus bas.

Lancer

./build/zappy_gui -h <host> -p <port>

Options de ligne de commande

L'analyse des arguments est faite dans gui/src/core/main.cpp:22 :

Option Signification Détails
-h <host> Adresse du serveur Obligatoire : si vide, usage + sortie
-p <port> Port du serveur Défaut 4242 ; doit être > 0

Bien que -p ait une valeur par défaut (4242, gui/src/core/main.cpp:20), -h n'en a pas : un lancement sans -h affiche Usage: <argv0> -p port -h machine et se termine en échec (gui/src/core/main.cpp:46). Les deux options sont donc effectivement requises en pratique. Un argument inconnu, ou un port non numérique (Invalid port value), provoque aussi une sortie en échec (gui/src/core/main.cpp:34).

# Exemple typique : serveur local sur le port par défaut
./build/zappy_gui -h 127.0.0.1 -p 4242

Le handshake GRAPHIC

Dès la connexion établie, le GUI s'annonce comme client graphique en envoyant GRAPHIC\n (gui/src/core/main.cpp:55) :

NetworkClient net;
if (!net.connect(host, port))
    return EXIT_FAILURE;
net.send("GRAPHIC\n");

En réponse, le serveur déverse l'état du monde (taille de carte, tuiles, équipes, joueurs, œufs…) que le MessageParser décode. Le détail des échanges est documenté dans Protocole GUI ↔ Serveur.

Détail délibéré : la socket est ouverte AVANT InitWindow

L'ordre des opérations dans main n'est pas anodin (gui/src/core/main.cpp:52) :

NetworkClient net;
net.connect(host, port);   // (1) socket ouverte
net.send("GRAPHIC\n");     // (2) handshake
// ...
InitWindow(WINDOW_W, WINDOW_H, WINDOW_T);  // (3) fenêtre + textures
renderer.loadAssets("assets");             // (4) ~1000+ fichiers PNG

La connexion est faite avant InitWindow et le chargement des assets de manière délibérée. loadAssets ouvre et lit plus d'un millier de textures, ce qui consomme de nombreux descripteurs de fichiers. En connectant la socket d'abord, on garantit qu'elle obtient un descripteur stable, sans risque de collision avec un fopen interne de Raylib survenant tardivement dans une table de descripteurs déjà bien remplie.

Résolution des assets

Le binaire localise son dossier assets/ de façon souple, via resolveAssetsBase (gui/src/renderer/Renderer3D.cpp:25). Il sonde l'existence d'un fichier témoin (/animation/walk/1.png) à plusieurs niveaux :

static const char* kProbe = "/animation/walk/1.png";
if (FileExists((assetsDir + kProbe).c_str()))      return assetsDir;        // ./assets
if (FileExists(("../" + assetsDir + kProbe)...))   return "../" + assetsDir; // ../assets
if (FileExists(("../../" + assetsDir + kProbe)...))return "../../" + ...;    // ../../assets

C'est pourquoi on lance typiquement le GUI depuis gui/build/ : les assets se trouvent alors en ../assets. C'est exactement ce que fait le wrapper racine (cd gui/build/ puis exec), et c'est la raison d'être de ce cd.

# Lancement « manuel » équivalent au wrapper
cd gui/build
./zappy_gui -h 127.0.0.1 -p 4242   # trouve ../assets

Si les sprites n'apparaissent pas

Un GUI lancé depuis un répertoire d'où aucune des trois variantes de chemin ne pointe vers les assets se rabat sur assetsDir brut, et les animations ne se chargent pas. Lancez-le depuis gui/build/ (ou via ./zappy_gui à la racine).

Étape suivante

Une fois connecté et affichant la carte, place au rendu : voir Rendu graphique pour la boucle principale, la caméra et les contrôles.