Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2024-02-13T15:01:13+01:00Les derniers messages parus sur le forum de Zeste de Savoir.Premier jeu en C++ (avec SFML), message #2539772024-02-13T15:01:13+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253977<p>Salut,</p>
<p>Quelques remarques</p>
<h4 id="screens">Screens<a aria-hidden="true" tabindex="-1" href="#screens"><span class="icon icon-link"></span></a></h4>
<p>Découper par écran n’est pas une mauvaise idée, c’est ce qui s’apparente à des "Scenes" dans les moteurs de jeux. Cependant tes classes Screen sont de fausses classes, ce ne sont que des fonctions déguisées, tu pourrais faire la même chose en donnant l’index dans les arguments plutôt qu’utiliser les méthodes virtuelles. Et dans cette fonction, elles gèrent chacune l’initialisation puis la boucle. Je te propose plutôt de concevoir les Screen un peu comme tu as conçu les boutons. Ce sont des classes qui devrait pouvoir se dessiner, et réagir à un évènement. Ta boucle d’évènement se situerait au niveau du main et se propage dans l’écran courant, ça t’éviterai de dupliquer du code comme les évènements de la fenêtre (fermeture), la limite de rafraichissement etc…<br>
Si tu as cette approche, il faut aussi que tu aie conscience que tu vas charger tes éléments vraisemblablement dans le constructeur, et donc le fait d’instancier tout tes écrans au début va tout mettre en RAM. Là que tu navigues entre 5 écrans c’est trois fois rien mais sur un jeu qui multiplie les tableaux genre un plateformer 2D, t’as pas envie de tout charger alors que tu te sers d’un seul tableau.</p>
<h4 id="mvc">MVC<a aria-hidden="true" tabindex="-1" href="#mvc"><span class="icon icon-link"></span></a></h4>
<p>Effectivement, c’est pas du tout un MVC, désolé ^^'<br>
Ce qui s’approche le plus d’un model dans ton archi est Game, qui contient la grille et est appelée par la vue ScreenGame pour être mis en forme. Dans cet échange, le modèle n’a pas à se préoccuper de la mise en forme, or ici il le mets sous forme de wstring pour faire plaisir à la vue. ça va rejoindre un point un peu plus bas, mais dans cette grille, chaque case n’a que trois états, vide/joueur1/joueur2, pourquoi représenter ces trois états par un wstring ou un char qui peuvent prendre bien plus de valeurs, qu’il faudra gérer ensuite comme des cas d’erreur, un enum me semble tout indiqué ici.<br>
Game a aussi tout un tas de logique du jeu, je suppose que c’est pour ça qu’il a fini dans controller. Mais il ne fait pas le rôle de controller qui test la validité de l’action de la vue, la vue se charge elle même de savoir qu’est-ce qui est déjà joué, à quel joueur c’est etc…<br>
Enfin hésites pas à plus découper ta vue en composants comme le bouton (et en fait c’est assez valable sur tout le code qui regroupe généralement trop de responsabilité aux mêmes endroits).</p>
<h4 id="inclusion">Inclusion<a aria-hidden="true" tabindex="-1" href="#inclusion"><span class="icon icon-link"></span></a></h4>
<p>Inclut les headers qui ne viennent pas de ton code, tel que la lib sfml, avec les chevrons <code><></code>. Ainsi on peut modifier les chemins de recherche pour pouvoir utiliser par exemple un gestionnaire de paquet.<br>
Evite de naviguer dans l’arborescence de fichier "../model/machin.h", c’est à ta configuration d’indiquer à partir d’où chercher des headers et ainsi tu peux inclure "model/machin.h".</p>
<h4 id="déclaration-de-variable">Déclaration de variable<a aria-hidden="true" tabindex="-1" href="#déclaration-de-variable"><span class="icon icon-link"></span></a></h4>
<p>Effectue la déclaration d’une variable au plus proche de son utilisation, avec une initialisation. ça te permettra d’avoir une initialisation qui a du sens, et une portée ainsi qu’une durée de vie minimale.</p>
<h4 id="linéarisation-de-matrice">Linéarisation de matrice<a aria-hidden="true" tabindex="-1" href="#linéarisation-de-matrice"><span class="icon icon-link"></span></a></h4>
<p>Tu peux représenter un tableau de tableau [NB_ROW][NB_COLUMN] par un seul tableau [NB_ROW*NB_COLUMN] et accéder à [i][j] par [i*NB_COLUMN+j] quand ton nombre de colonne est fixe. Préférer les classes C++ pour les collections <code>std::array</code>, <code>std::vector</code> …</p>
<h4 id="ajouter-de-la-sémantique-enums-et-constantes-à-la-place-de-magic-numbers">Ajouter de la sémantique (enums et constantes à la place de magic numbers)<a aria-hidden="true" tabindex="-1" href="#ajouter-de-la-sémantique-enums-et-constantes-à-la-place-de-magic-numbers"><span class="icon icon-link"></span></a></h4>
<p>Tu dois toujours de poser la question de quelle est la meilleure représentation de ton information, celle qui a le plus de sens. Tu as déjà eu le réflexe de mettre un tas de constante, mais tu as encore plein d’endroit où des nombres se baladent. Et il y a plusieurs données qui pourraient facilement devenir des enum pour des statuts ou l’index des écrans par exemples…<br>
Pour les constante ça a déjà été dit mais préfère static constexpr qui type ta donnée.</p>
<hr>
<p>Et cadeau, je te laisse le fichier que je me suis rajouté pour compiler ton projet. Il faudrait mieux gérer les ressources, je l’ai écrit juste pour pouvoir faire un xmake run, mais au moins tu vois que ce n’est pas très compliqué.</p>
<details class="custom-block custom-block-spoiler"><summary class="custom-block-heading">xmake.lua</summary><div class="custom-block-body"><div class="hljs-code-div hljs-code-lua"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span><span data-count="6"></span><span data-count="7"></span><span data-count="8"></span><span data-count="9"></span><span data-count="10"></span><span data-count="11"></span><span data-count="12"></span><span data-count="13"></span><span data-count="14"></span><span data-count="15"></span><span data-count="16"></span><span data-count="17"></span><span data-count="18"></span><span data-count="19"></span><span data-count="20"></span><span data-count="21"></span><span data-count="22"></span><span data-count="23"></span><span data-count="24"></span><span data-count="25"></span><span data-count="26"></span><span data-count="27"></span><span data-count="28"></span></div><pre><code class="hljs language-lua">add_rules(<span class="hljs-string">"mode.debug"</span>, <span class="hljs-string">"mode.release"</span>)
set_languages(<span class="hljs-string">"cxxlatest"</span>)
set_warnings(<span class="hljs-string">"allextra"</span>)
add_requires(<span class="hljs-string">"sfml"</span>)
target(<span class="hljs-string">"OXO"</span>)
set_kind(<span class="hljs-string">"binary"</span>)
add_packages(<span class="hljs-string">"sfml"</span>)
add_includedirs(<span class="hljs-string">"."</span>)
add_files(
<span class="hljs-string">"main.cpp"</span>,
<span class="hljs-string">"model/*.cpp"</span>,
<span class="hljs-string">"view/*.cpp"</span>,
<span class="hljs-string">"controller/*.cpp"</span>
)
add_extrafiles(<span class="hljs-string">"src/**/*"</span>)
after_build(<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(target)</span></span>
<span class="hljs-keyword">local</span> resdir = <span class="hljs-built_in">path</span>.join(target:targetdir(), <span class="hljs-string">"src"</span>)
<span class="hljs-keyword">if</span> <span class="hljs-keyword">not</span> <span class="hljs-built_in">os</span>.exists(resdir) <span class="hljs-keyword">then</span>
<span class="hljs-built_in">os</span>.cp(<span class="hljs-string">"src"</span>, resdir)
<span class="hljs-keyword">end</span>
<span class="hljs-keyword">end</span>)
on_clean(<span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">(target)</span></span>
<span class="hljs-keyword">local</span> resdir = <span class="hljs-built_in">path</span>.join(target:targetdir(), <span class="hljs-string">"src"</span>)
<span class="hljs-built_in">os</span>.rm(resdir)
<span class="hljs-keyword">end</span>)
</code></pre></div></div></details>Premier jeu en C++ (avec SFML), message #2539402024-02-09T09:30:35+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253940<figure><blockquote>
<p>[Je] tâcherai de les mettre en pratique lors de mon prochain projet</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253933">Bizohx</a></figcaption></figure>
<p>Tu ne vas pas corriger celui ci ? <img src="/static/smileys/svg/unsure.svg" alt=":euh:" class="smiley"> </p>Premier jeu en C++ (avec SFML), message #2539362024-02-08T14:51:32+01:00yanuel/@yanuelhttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253936<p>vos avis sont hyper bien construits et je pense pas pouvoir apporter plus Bizohx j’espère que avec tous c’est avis cela ta beaucoup aider dans la réalisation de ton projet ! </p>Premier jeu en C++ (avec SFML), message #2539352024-02-08T10:55:27+01:00Glordim/@Glordimhttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253935<p>Hello,<br>
Je rejoins les avis de romantik et gbdivers. Et j’ajouterai aussi qu’en bonus, pour ce qui est de la qualité du code, tu peux déjà commencer par augmenter le niveau de warning de ton compilateur (si tu ne l’as pas déjà fait). Il sera tout à fait capable de te remonter des comportements dangereux (variable non initialisée par exemple) ou bien des choses plus trivial comme des variables non utilisées.</p>
<p>En complément tu peux pousser l’analyse encore plus loin avec des analyseurs static tel que cppcheck ou clang-tidy qui pourront aller encore plus loin (étant donné qu’ils n’ont pas la contrainte du temps de compilation).</p>Premier jeu en C++ (avec SFML), message #2539332024-02-08T09:45:08+01:00Bizohx/@Bizohxhttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253933<p>Merci beaucoup pour ces retours et conseils ! J’en prends note et tâcherai de les mettre en pratique lors de mon prochain projet</p>Premier jeu en C++ (avec SFML), message #2539322024-02-08T00:54:00+01:00gbdivers/@gbdivershttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253932<p>Oui, tu as raison, j’ai confondu avec un autre forward de std. (EDIT : cela dit, j’ai pas fait attention au reste du code, c’est une remarque générale, qui s’applique peut etre quand meme)</p>Premier jeu en C++ (avec SFML), message #2539312024-02-08T00:27:48+01:00chiiroh1022/@chiiroh1022https://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253931<p>Alors désolé par avance <a href="/@Bizohx" rel="nofollow" class="ping ping-link">@<span class="ping-username">Bizohx</span></a>, je n’ai pas regardé ton code, je voulais poser une question à <a href="/@gbdivers" rel="nofollow" class="ping ping-link">@<span class="ping-username">gbdivers</span></a> sur sa précédente intervention.</p>
<blockquote>
<p><a href="https://github.com/BizohxDev/OXO/blob/main/model/MLogs.hpp#L4">https://github.com/BizohxDev/OXO/blob/main/model/MLogs.hpp#L4</a> Utilise des forward declarations.</p>
</blockquote>
<p>Je vois un <code>#include <string></code> à cette ligne, comment fait-on une déclaration anticipée de std::string ?<br>
Je pose la question puisque je n’ai jamais vu quelqu’un le faire, et j’ai cru comprendre <a href="https://stackoverflow.com/questions/23476181/forward-declaration-of-stdstring-and-stdwstring">ici</a> que ce n’était pas vraiment possible / conseillé.</p>Premier jeu en C++ (avec SFML), message #2539302024-02-07T21:54:10+01:00gbdivers/@gbdivershttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253930<p>Memes remarques que romantik pour le systeme de build et l’organisation. </p>
<p>Pour le MVC, je pense que le C(ontroller) n’a pas trop d’usage dans un jeu. D’ailleurs, ce que tu as mit dans le dossier controller n’est pas des controllers. Et si on garde que M et V, on est plus sur une architecture 2 couches assez classiques. Si cela t’intéresse, voici un exemple d’architecture multi-couches pour les jeux (du livre "Game Engine Architecture") :</p>
<figure><img src="https://hightalestudios.com/wordpress/wp-content/uploads/2017/03/jaKUP.png" alt="Image utilisateur"><figcaption>Image utilisateur</figcaption></figure>
<p>Mais ce sont des choses qui s’apprennent avec l’expérience. C’est normal que tu n’as pas encore une idée claire de comment architecturer un projet, si tu n’as jamais bossé sur des projets réels.</p>
<p>Quelques details.</p>
<p><a href="https://github.com/BizohxDev/OXO/blob/main/main.cpp#L55">https://github.com/BizohxDev/OXO/blob/main/main.cpp#L55</a> C’est vraiment du détail, mais ne pas être consistant dans le code (espace entre la parenthèse et le crochet), c’est le genre de choses qui montre en général un dev débutant. Un autre exemple : <a href="https://github.com/BizohxDev/OXO/blob/main/model/GlobalConstants.hpp#L7">https://github.com/BizohxDev/OXO/blob/main/model/GlobalConstants.hpp#L7</a>. Pourquoi définir certaines constante avec #define et d’autres avec const ?</p>
<p>Pour les constantes, utilise static constexpr.</p>
<p><a href="https://github.com/BizohxDev/OXO/blob/main/model/MFile.cpp#L8">https://github.com/BizohxDev/OXO/blob/main/model/MFile.cpp#L8</a> Les blocs de commentaires comme ça, c’est lourd a la lecture. Et ca sert pas a grand chose en pratique.</p>
<p><a href="https://github.com/BizohxDev/OXO/blob/main/model/MLogs.hpp#L4">https://github.com/BizohxDev/OXO/blob/main/model/MLogs.hpp#L4</a> Utilise des forward declarations.</p>
<p><a href="https://github.com/BizohxDev/OXO/blob/main/main.cpp#L28">https://github.com/BizohxDev/OXO/blob/main/main.cpp#L28</a> C’est le genre de chose que tu peux déclarer en une ligne </p>
<div class="hljs-code-div hljs-code-cpp"><pre><code class="hljs language-cpp"><span class="hljs-keyword">const</span> std::vector<Screen*> screens = { &homepage, &credit, ... };
</code></pre></div>
<p><a href="https://github.com/BizohxDev/OXO/blob/main/controller/Game.cpp#L11">https://github.com/BizohxDev/OXO/blob/main/controller/Game.cpp#L11</a> Tu peux simplifier ton code en utilisant les algos de la lib standard (par exemple std::fill) ou des range-for loop.</p>
<p><a href="https://github.com/BizohxDev/OXO/blob/main/controller/Game.cpp#L67">https://github.com/BizohxDev/OXO/blob/main/controller/Game.cpp#L67</a> Un autre classique des devs débutants : la qualité du code. Tu n’as pas de tests, pas de vérification des contrats, etc. Regarde la programmation par contrat, les préconditions, les postconditions, assert. Imagine que quand tu écris une classe, c’est quelqu’un d’autre qui va l’utiliser et tu veux lui signaler quand il fait une erreur. Par exemple, si les valeurs de row, column et symbol sont valides. Par exemple :</p>
<div class="hljs-code-div hljs-code-cpp"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span></div><pre><code class="hljs language-cpp"><span class="hljs-function"><span class="hljs-keyword">void</span> <span class="hljs-title">Game::playCell</span><span class="hljs-params">(<span class="hljs-keyword">int</span> row, <span class="hljs-keyword">int</span> column, <span class="hljs-keyword">char</span> symbol)</span> </span>{
<span class="hljs-built_in">assert</span>(row >=<span class="hljs-number">0</span> && row < <span class="hljs-number">3</span> && column >= <span class="hljs-number">0</span> && column <<span class="hljs-number">3</span>
&& (symbol == <span class="hljs-string">' '</span> || symbol == <span class="hljs-string">'O'</span> || symbol == <span class="hljs-string">'X'</span>));
m_grid[row][column] = symbol;
...
</code></pre></div>
<p>Je sais pas quelles valeurs sont valides dans ce cas, mais c’est l’idée.</p>
<p>D’ailleurs, probablement utiliser un enum plutôt que char pour les symbols. Ca permet de donner une sémantique (char est un caractère, pas un symbole).</p>
<p>Tes classes Screen ont une seule fonction, de plusieurs centaines de lignes. Il faudrait mieux découper.</p>
<p>Si tu as lu les cours de base, je te conseille Tour of C++ puis Professional C++ ensuite.</p>Premier jeu en C++ (avec SFML), message #2539282024-02-07T14:37:20+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253928<figure><blockquote>
<p>En fait, au début j’utilisais Code::Blocks comme IDE, et je ne sais pas s’il en utilise un ou pas, mais c’était complètement transparent.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253927">Bizohx</a></figcaption></figure>
<p>Il utilise sont propre système, paramétré par les différent menu de l’IDE et décrit dans le fichier projet <code>.cbp</code>. je ne sais pas s’il est possible de mettre ce fichier projet dans le dépôt ou s’il contient des chemins absolus. Même si c’est possible, c’est un peu dommage car il n’y a que code::blocks qui utilise ce format, ça peut être une contrainte projet défendable mais avec les alternatives qui existent c’est un peu dommage. à l’inverse, avec un CMake, tu peux tout à fait générer un projet code::blocks pour travailler avec s’il s’agit de ton éditeur favori.</p>
<figure><blockquote>
<p>J’ai essayé d’utiliser le pattern MVC mais je suis même pas sûr de l’avoir bien implémenté.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253927">Bizohx</a></figcaption></figure>
<p>le pattern MVC est plutôt adapté à des IHM. Puisque le morpion peut s’assimiler à une IHM c’est peut-être pertinent, même si c’est pas le cas de tout les jeux vidéos.<br>
D’ailleurs j’en profite pour dire, puisque je ne l’ai pas encore fait, si le but est de faire des jeux vidéos, alors il vaut mieux utiliser un moteur de jeu, si le but est d’apprendre C++ au travers des projets jouets, pas de soucis.</p>Premier jeu en C++ (avec SFML), message #2539272024-02-07T12:50:12+01:00Bizohx/@Bizohxhttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253927<p>Merci pour ta réponse !</p>
<ol>
<li>Pour le système de build :</li>
</ol>
<p>En fait, au début j’utilisais Code::Blocks comme IDE, et je ne sais pas s’il en utilise un ou pas, mais c’était complètement transparent.
Je suis passé ensuite sur CLion, qui lui utilise CMake. Cependant je n’y comprends pas grand chose, il faudrait que je me penche dessus un peu plus sérieusement…</p>
<ol start="2">
<li>Organisation des dossiers/fichiers</li>
</ol>
<p>Merci pour ces infos, déjà rien que ça, ça m’aide.
J’ai essayé d’utiliser le pattern MVC mais je suis même pas sûr de l’avoir bien implémenté.</p>Premier jeu en C++ (avec SFML), message #2539232024-02-07T10:56:37+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253923<p>Salut,</p>
<p>Bravo d’avoir réalisé ce petit jeu.<br>
ça m’interesse et je ferais certainement une relecture, en donnant si je peux quelques conseils de bonnes pratiques et des pistes de design pattern qui aurait pu t’être utile. Pour les optimisations, si c’est lié à une bonne pratique je l’indiquerai mais sinon optimiser n’a de sens qu’avec des mesures et des objectifs (il y a souvent des choix à faire entre la RAM consommé et le temps de calcul par exemple). Et sur un petit projet comme ça, d’autant plus à vocation d’apprentissage, ça n’a pas vraiment de sens.</p>
<p>Je vais voir quand j’aurais le temps de rentrer dans les détails mais pour moi ce ne sera probablement pas cette semaine désolé. Par contre en jetant juste un oeil au dépôt, je pense qu’il y a un petit travail d’organisation des sources. </p>
<p>Afin que tout le monde puisse compiler tes sources, je te conseille d’ajouter un système de build. Le standard de facto, celui qui s’est largement imposé dans la communauté C++, c’est <a href="https://cmake.org/">CMake</a>. Tu peux jeter un oeil aussi à <a href="https://xmake.io/">XMake</a>, <a href="https://scons.org/">SCons</a>, ou <a href="https://mesonbuild.com/">Meson</a> qui ont le bon goût d’utiliser un vrai langage de script pour piloter le build (De plus XMake sert aussi de gestionnaire de package de lib, ce qui est plutôt agréable). Sinon il y a les traditionnels <a href="https://fr.wikipedia.org/wiki/Make">Makefile</a>, ou un peu au dessus <a href="https://www.gnu.org/software/automake/">Automake</a>, pas mal de projets tournent encore avec mais je ne le recommanderait pas.<br>
Fait un choix parmi ces systèmes puis intègre le fichier au dépôt. Comment l’as tu compilé jusqu’à présent d’ailleurs ?<br>
Puis tu peux mettre les instructions de compilation dans le README ou dans un COMPILING.md, indiquant quelles sont les dépendances à installer et quels sont les commandes à exécuter pour réussir à compiler correctement ton projet.</p>
<p>Ensuite, le dossier src contient conventionnellement plutôt le <strong>code</strong> source, que tu as mis à la racine. Ainsi à la racine, tu vas pouvoir mettre quelques doc comme le readme et la licence, ou encore des fichiers de configuration d’intégration continue, sans les mélanger au code source. Et ce que tu as mis dans ton dossier src, on le désigne généralement plutôt comme "ressources" ou "assets".</p>
<p>Je reviendrai pour parler de ce qui t’intéresse vraiment, la qualité de code, une autre fois.</p>Premier jeu en C++ (avec SFML), message #2539222024-02-07T10:20:18+01:00Bizohx/@Bizohxhttps://zestedesavoir.com/forums/sujet/17325/premier-jeu-en-c-avec-sfml/?page=1#p253922<p>Bonjour,</p>
<p>J’ai commencé à apprendre le C++ il y a un mois (j’avais déjà des bases en C et dans d’autres langages).
J’ai développé mon premier jeu, "OXO", qui est un simple Morpion. Le but était simplement d’apprendre le C++ et à utiliser la librairie SFML.</p>
<p>Ayant tout appris sur internet (OpenClassrooms, forums…), je n’ai aucune idée de la qualité de mon code.</p>
<p>C’est pourquoi je m’en remets à vous. Y a-t-il des erreurs de débutant que j’ai commises ? Des optimisations sont-elles possibles ?</p>
<p>Merci pour votre temps passé et vos éventuels conseils !</p>
<p>Code source ici : <a href="https://github.com/BizohxDev/OXO">github.com/BizohxDev/OXO</a>
Télécharger le jeu compilé (Windows) : <a href="https://www.swisstransfer.com/d/3e3d39ae-c135-49f7-9bdd-8fd8d05dc1c7">ICI</a> </p>Qt et les manettes, message #2529352023-11-21T10:22:43+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252935<figure><blockquote>
<p>Pourquoi diable QtGroup s’embête avec DirectX qui appartient à Microsoft quand la SDL utilise une licence GNU LGPL ? :S<br>
</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252926">tsuruba</a></figcaption></figure>
<p>Parce que la SDL est un middleware qui permet aussi de faire du multiplateforme, pas un driver qui pilote la manette, et comme Qt est aussi ce genre de middleware, il va chercher à gérer en natif. M’enfin, comme je t’ai montré dans mon lien précédent, ils utilisent SDL sur les plateformes qu’ils ne supportent pas mais que peut-être SDL supporte.<br>
Aussi, QtGroup ne s’embête pas vraiment avec QtGamepad tout court, comme le montre la mailing list dans le lien de Gabbro.</p>
<figure><blockquote>
<p>It’s not exactly a business critical project so for us it’s a passion project</p>
</blockquote><figcaption><a href="https://lists.qt-project.org/pipermail/development/2023-October/044591.html">Andy Nichols, mainteneur du module QtGamepad</a></figcaption></figure>
<figure><blockquote>
<p>je fait un truc en lien avec le jeu vidéo, et jouer sur Linux bon voilà quoi…</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252926">tsuruba</a></figcaption></figure>
<p>Si tu fais un jeu, je te conseille d’utiliser un moteur de jeu plutôt. Si tu fais un outil pour le jeu vidéo, selon ce que c’est Qt n’est peut-être pas le plus adapté non plus (et vu que ça se contrôle à la manette, j’ai des doutes).</p>
<figure><blockquote>
<ol start="3">
<li>Alors là je vois pas comment faire… Tu penses à… mettre mon répertoire d’installation de Qt sur un dépôt git, commit & pull, puis désinstaller Qt, réinstaller en 5.15, et au cas où revenir à un état du dépôt précédent ? ça me semble archi-lourd comme procédure non ?</li>
</ol>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252926">tsuruba</a></figcaption></figure>
<p>Ok, je croyais que ce qui t’avais pris du temps c’était de modifier ton projet pour corriger les incompatibilités Qt5/Qt6, et ça ça se gère avec git. Si c’est juste l’install qui t’as embêté, normalement tu as dû pouvoir les installer côte à côte, et si tu utilises QtCreator, passer de l’un à l’autre c’est simplement changer de "kit de compilation".</p>
<figure><blockquote>
<p>normalement il n’y a pas besoin de compiler Qt à la main sur la vaste majorité des systèmes linux (du moins pour une version récente comme 5.15 ou 6.6). Il y a des paquets pour ça.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252927">adri1</a></figcaption></figure>
<p>Et même sur Windows, y’a un tas de version prebuilt, et on peut les gérer facilement avec le Qt maintenance tool.<br>
Je suis d’accord avec adr1 qu’il y a probablement quelque chose d’étrange dans ta configuration du système de build.</p>Qt et les manettes, message #2529302023-11-20T23:43:34+01:00adri1/@adri1https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252930<p>Si tu parles de compiler ton propre projet, alors une bibliothèque introuvable pour le linker alors qu’elle est installée est <em>par définition</em> une erreur de configuration du système de build. C’est à corriger avec le système de build utilisé, pas en bricolant des symlinks.</p>Qt et les manettes, message #2529282023-11-20T22:28:31+01:00tsuruba/@tsurubahttps://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252928<p><a href="/@adri1" rel="nofollow" class="ping ping-link">@<span class="ping-username">adri1</span></a> je ne parle pas de compiler Qt à la main. Je parle à la première compilation d’un projet (projet exemple de l’IDE, par exemple.) J’ai mal formulé ma phrase. <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"><br>
Et oui du coup c’est une erreur de configuration (mais pas du système de build) qui, d’après le topic que j’ai lu, est courante quand un dev se fait un environnement Qt sur Linux. Mais cette erreur est résolue en faisant ce que j’ai écrit plus haut.</p>Qt et les manettes, message #2529272023-11-20T22:19:21+01:00adri1/@adri1https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252927<blockquote>
<p>Bon bref : faut installer Qt (attention 5.15 !) sur Linux. Pour ceux qui passeront après moi, vous allez avoir un problème en faisant ça. A la première compilation, le compilateur va se plaindre de pas trouver 'lgl' ou un truc du genre.</p>
</blockquote>
<p>Outre le fait que ça ressemble à une erreur de configuration du système de build plutôt qu’un vrai problème, normalement il n’y a pas besoin de compiler Qt à la main sur la vaste majorité des systèmes linux (du moins pour une version récente comme 5.15 ou 6.6). Il y a des paquets pour ça.</p>Qt et les manettes, message #2529262023-11-20T22:02:21+01:00tsuruba/@tsurubahttps://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252926<p><strong>Pas d’édit car j’ai trouvé la réponse</strong> </p>
<p>BON !<br>
Windows, Windows, Windows… Cesseras-tu un jour d’être éclaté au sol ?<br>
Je me suis dit, peut-être, que ça ne marche pas car je travaillais sur un PC Surface : Windows 11 donc. Initiative : Installons Qt sur Windows 10 ( > 2 heures ) et sur linux ( < 20 minutes ) et voyons ce qu’il se passe. Sur W10, ça ne fonctionne toujours pas. Sur Linux (disto Kubuntu) Ô Miracle ça marche ! Ave Linus ! Ave Stallman ! Vade Retro Microsoft ! <img src="/static/smileys/svg/pleure.svg" alt=":'(" class="smiley"></p>
<p>En essayant d’assembler les briques de différents forums, il semble que Qt ait du mal à gérer les manettes avec DirectX comme interface… Pourquoi diable QtGroup s’embête avec DirectX qui appartient à Microsoft quand la SDL utilise une licence GNU LGPL ? :S<br>
Je veux dire… moi j’ai commencé mon machin pour Windows, mais c’est parce que je fait un truc en lien avec le jeu vidéo, et jouer sur Linux bon voilà quoi… mais là je comprends pas ce choix. :’D</p>
<p>Bon bref : faut installer Qt (attention 5.15 !) sur Linux. Pour ceux qui passeront après moi, vous allez avoir un problème en faisant ça. A la première compilation, le compilateur va se plaindre de pas trouver 'lgl' ou un truc du genre. D’après un topic de Stack Overflow (j’ai pas gardé le lien) c’est parce que le compilateur n’arrive pas à trouve le chemin vers la librairie OpenGL, indispensable à Qt 5. Que faire ?</p>
<ol>
<li>Vérifier que OpenGL est installé (normalement par défaut sur les debian mais sait-on jamais) : <code>glxinfo | grep 'version' </code>.</li>
<li>Localise la première ligne : <code>locate libGL</code>. Ca donnera une dizaine de chemins. Copier le premier.</li>
<li>Créer un lien vers la librairie : <code>sudo ln -s <chemin copié> /usr/lib/libGL.so</code>.</li>
<li>Recompiler : Qt content ! Développeur content ! <img src="/static/smileys/svg/1f60d.svg" alt="<3" class="smiley"></li>
</ol>
<p>Pour te répondre <a href="/@romantik" rel="nofollow" class="ping ping-link">@<span class="ping-username">romantik</span></a> :</p>
<ol>
<li>Oui je confirme que le réseau de mon école est une vaste blague.</li>
<li>Manette Xbox One bluetooth officielle, reconnue dans des Assassin’s Creed, Genshin Impact… Avec ou sans fil.</li>
<li>Alors là je vois pas comment faire… Tu penses à… mettre mon répertoire d’installation de Qt sur un dépôt git, commit & pull, puis désinstaller Qt, réinstaller en 5.15, et au cas où revenir à un état du dépôt précédent ? ça me semble archi-lourd comme procédure non ?</li>
<li>Du coup pas la peine, ça va se faire à grand renfort de Linux… Tant pis pour le plan de base. <img src="/static/smileys/svg/triste.svg" alt=":(" class="smiley"></li>
</ol>
<p>Merci pour l’aide ! <img src="/static/smileys/svg/heureux.svg" alt=":D" class="smiley"> <img src="/static/smileys/svg/1f60d.svg" alt="<3" class="smiley"></p>Qt et les manettes, message #2529252023-11-20T21:47:36+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252925<figure><blockquote>
<p>J’ai "choisi" Qt 6.3, car c’est la version qu’on m’a faite installer en cours, tout simplement.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252924">tsuruba</a></figcaption></figure>
<p>D’accord, donc c’est pas une vraie contrainte, c’est juste soit que ça date de l’époque où le cours a été écrit, soit qu’on a évité que vous surchargiez la connexion du bahut en téléchargeant tous plusieurs Go en même temps.</p>
<figure><blockquote>
<p>ma manette n’est pas détectée… Pourtant elle est bien connectée, elle fonctionne en jeu…</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252924">tsuruba</a></figcaption></figure>
<p>C’est quoi comme manette ? Dans quel jeu c’est reconnu ? Voir quel moteur de jeu la reconnais. </p>
<figure><blockquote>
<p>Vu le temps que ça m’a pris, il est hors de question de repasser encore à la 6.3 maintenant.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252924">tsuruba</a></figcaption></figure>
<p>C’est pour ça qu’il faut toujours travailler avec un gestionnaire de version tel que git <img src="/static/smileys/svg/clin.svg" alt=";)" class="smiley"> surtout avec ce genre d’expérience. une ligne de commande et tu retrouvais ton état précédent.</p>
<figure><blockquote>
<p>je vais regarder ce qui a été fait avec la SDL</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252924">tsuruba</a></figcaption></figure>
<p>Exécute le code d’exemple SDL avant déjà, comme t’as fait pour Qt, sinon tu vas te taper une intégration pour rien.</p>Qt et les manettes, message #2529242023-11-20T19:29:21+01:00tsuruba/@tsurubahttps://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252924<p>Hey there ! je viens aux nouvelles. <img src="/static/smileys/svg/smile.svg" alt=":)" class="smiley"></p>
<p>J’ai "choisi" Qt 6.3, car c’est la version qu’on m’a faite installer en cours, tout simplement. <img src="/static/smileys/svg/hihi.svg" alt="^^" class="smiley"> Mais justement, hier j’ai downgrade vers la 5.15… Et maintenant je constate que cette API de malheur ne fonctionne pas ! :S ma manette n’est pas détectée… Pourtant elle est bien connectée, elle fonctionne en jeu… mais le code suivant s’active :</p>
<div class="hljs-code-div hljs-code-C++"><div class="hljs-line-numbers"><span data-count="1"></span><span data-count="2"></span><span data-count="3"></span><span data-count="4"></span><span data-count="5"></span></div><pre><code class="hljs language-C++"><span class="hljs-keyword">auto</span> gamepads = QGamepadManager::<span class="hljs-built_in">instance</span>()-><span class="hljs-built_in">connectedGamepads</span>();
<span class="hljs-keyword">if</span>(gamepads.<span class="hljs-built_in">isEmpty</span>()){
<span class="hljs-built_in">qDebug</span>() << <span class="hljs-string">"Did not find any connected gamepads"</span>;
<span class="hljs-keyword">return</span>;
}
</code></pre></div>
<p>Ce code est pourtant tiré des exemples inclus dans Qt Creator et référencé dans la doc en ligne. C’est à m’en arracher les cheveux. <img src="/static/smileys/svg/triste.svg" alt=":(" class="smiley"> Il semble que ne sois <a href="https://stackoverflow.com/questions/62668629/qgamepadmanager-connecteddevices-empty-but-windows-detects-gamepad">pas le seul à avoir eu ce problème</a>, mais la solution proposée sur ce topic ne fonctionne pas.</p>
<p>Vu le temps que ça m’a pris, il est hors de question de repasser encore à la 6.3 maintenant. Je vais encore fouiller pour trouver des exemples qui fonctionnent de cette API (sans QML que je ne connais pas), sinon je vais regarder ce qui a été fait avec la SDL , le lien partagé par romantik.</p>Qt et les manettes, message #2529212023-11-20T14:05:48+01:00Gabbro/@Gabbrohttps://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252921<p>Pour qtgamepad, quelqu’un <a href="https://www.arnorehn.de/blog/2023/10/31/qtgamepad-ported-to-qt-6/">a déjà fait le travail de base pour Qt6</a>. À toi de voir si tu préfères partir sur autre chose, sur Qt5, ou essayer ça.</p>Qt et les manettes, message #2529182023-11-20T11:32:55+01:00romantik/@romantikhttps://zestedesavoir.com/forums/sujet/17220/qt-et-les-manettes/?page=1#p252918<p>Salut,</p>
<p>En effet, il semblerait que Qt6 ne supporte pas QtGamepad. Mais peut-être pourrais-tu faire le portage toi-même ? C’est peut-être pas très compliqué (je ne vois pas trop pourquoi ce le serait, les drivers n’ont pas changé et les signaux/slots existent toujours), juste pas une priorité, ou ils prévoient une refonte …</p>
<p>En tout cas, tu pourrais t'<a href="https://github.com/qt/qtgamepad/blob/dev/src/plugins/gamepads/sdl2/qsdlgamepadbackend.cpp">inspirer de ce qu’ils ont fait</a> pour juste intégrer SDL.</p>
<p>Comme l’a dit QuentinC, la difficulté à faire cohabiter deux lib GUI c’est qu’ils ont chacun besoin d’une boucle d’évènement.<br>
Ici, on voit que c’est réglé simplement en scrutant les évènement SDL sur un QTimer. (Il faut aussi voir que dans ce module l’implémentation SDL est appelée lorsque les implémentations natives xinput, evdev etc … n’ont pas fonctionnées)</p>
<p>EDIT : Autre solution : Downgrade Qt vers Qt 5.15 pour profiter du module. En tout cas ce serait bien de fixer ta version sur une LTS (la plus récente étant 6.5). Pourquoi avoir choisi Qt 6.3 ?</p>