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/ :
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) :
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¶
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).
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) :
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.