Je n'ai pas utilisé le C++ depuis longtemps, j'ai donc décidé de reprendre un petit projet pour me familiariser à nouveau avec lui. J'essaye de faire un jeu de dames chinois, mais je n'ai aucune expérience avec la conception de GUI en C++. Existe-t-il un moyen très simple de créer une grille (c'est-à-dire des hexagones bitmap ou quelque chose) qui, lorsqu'on clique dessus, me donne le numéro d'index de celui sur lequel j'ai cliqué? Si quelqu'un a des exemples de la façon de le faire, même avec seulement une grille de carrés en 2D, cela serait utile. Toute aide est appréciée, merci!Quel est le moyen le plus simple de créer une grille cliquable pour un jeu en C++?
Répondre
Dépend de ce que vous prenez pour de manière simple.
Qt pourrait être un moyen simple, mais il faudrait du temps pour s'y habituer (si ce n'est pas le cas).
Si j'étais vous, je voudrais utiliser créer une application winapi simple, écrire des gestionnaires pour WM_CLICK
messages et ajouter un simple rendu de grille.
La première chose à faire est de décider quelle API vous allez utiliser pour votre application. Qt? SDL? Win32? OpenGL? Ma recommandation est d'utiliser Qt et sa classe QGraphicsView (vous pouvez commencer avec l'un des exemples d'applications Qt qui utilise QGraphicsView et le modifier selon vos goûts).
Cela dépend de votre boîte à outils graphique. Cependant, je crois que les deux plus probables moyens seraient probablement être soit une variation sur
stocker les coordonnées pour chacun des carrés, des trous, ou quoi que ce soit que vous essayez de cliquer sur le jeu et ont le gestionnaire d'événements click utilise les coordonnées qu'il obtient pour déterminer quel carré a été cliqué.
Faites de chaque carré son propre widget. De cette façon, quand on clique dessus, c'est le carré lui-même qui reçoit l'événement click et il peut être manipulé de manière agréable, orientée objet. Cependant, cela signifierait beaucoup de widgets pour un jeu Chinese Checkers.
Je pense en fait que la deuxième option pourrait être plus facile, puisque j'ai décidé d'utiliser un système d'indexation étrange pour représenter les hexagones. Je pourrais toujours utiliser un tableau 2D avec chaque ligne légèrement décalée, mais les valeurs d'index réelles n'auraient aucune signification réelle les unes par rapport aux autres, j'ai donc décidé d'utiliser une sorte de tableau 3D de directions [upleft/downright, haut/bas, debout, downleft] Cela peut finir par être une idée terrible, mais pourrait être un défi intéressant. Je pense que ce serait très pénible d'essayer de convertir une coordonnée de souris x-y à ce système. – user324667
Personnellement, je l'ai toujours fait de la deuxième façon, et c'est ce que je préférerais faire, mais je suis sûr qu'il y a des projets où il y aurait des problèmes - soit en raison du nombre de widgets ou de forme des widgets. Mais il arrive à être assez simple de cette façon. Il peut également rendre le dessin de chaque carré assez facile puisque chaque widget se dessine habituellement. –
En général, le GUI Tookit vous permettra de passer outre (par exemple par des fonctions virtuelles), le gestionnaire d'événements du widget représentant le conseil d'administration, de sorte que vous auriez alors gérer un événement de clic de souris en appelant une fonction de votre propre comme MouseClicked (int x, int y), où le gestionnaire vous donnera également les coordonnées de la souris x et y.
S'il s'agit d'une grille rectangulaire, seul l'entier divise la coordonnée par la largeur de la cellule en pixels.
S'il s'agit d'une grille de cellules hexagonales, il sera alors plus difficile de le déterminer. J'imagine que vous pourriez d'abord définir une grille rectangulaire marquant les centres rectangulaires des hexagones, puis ajouter plus de détection pour les quatre zones triangulaires autour des bords. Le jeu peut être assez utilisable avec seulement les définitions de cellules rectangulaires, ignorant simplement les bords triangulaires.
Il est assez facile de convertir la souris vers les coordonnées du jeu grille à l'aide d'une seule ligne de mathématiques:
POINT grid_loc = POINT(click.x/grid.cell.width, click.y/grid.cell.height);
Bien sûr, c'est un jeu de grille à base zéro.
De manière simple, je suppose que je veux dire le moyen le plus simple juste pour faire fonctionner quelque chose. Je ne cherche pas quelque chose de fantaisie comme mettre en évidence des cellules qui sont sélectionnées, ou redimensionner/défilement/peu importe. Fondamentalement, je veux juste me concentrer sur le backend pour l'instant, mais j'ai besoin d'une interface pour tester avec. J'ai jeté un coup d'œil à Qt à l'origine, mais cela semblait un peu écrasant au début. Je pourrais revenir en arrière et essayer de nouveau, car cela pourrait être quelque chose d'utile à apprendre. Une application Winapi semble être dans le sens de ce que je cherche, je vais me débrouiller un peu et voir ce qui se passe. Merci pour la réponse! – user324667