Habrokast "Sunset Manually" # 1. Essayer de mettre en place un environnement pour développer un jouet pour Windows

Je viens juste de penser: vous devez trouver une sorte de passe-temps. Sinon, vous pouvez déplacer les bobines. Et comme je suis une personne très inutile, qui ne peut rien faire d'autre que pousser des boutons, le hobby sera le suivant: au moins une fois par semaine organiser un stream avec l'écriture d'un jouet. Après un stream le record est publié sur Habré. (Vous pouvez essayer de publier en direct sur Habr, mais c'est beaucoup plus difficile).


L'écriture est très motivée par la rétroaction - si quelqu'un a besoin d'une explication, alors je peux expliquer comment je peux. S'il y a des suggestions - je vais essayer de prendre en compte. Sur le habr tous les commentaires sont lus jusqu'au dernier, dans d'autres endroits - comment ça se passe.


La première crêpe est grumeleuse ici:



Sous la cinématique est une description de thèse pour ceux qui sont justement fauchés pour passer une heure et demie à regarder.


Idées directrices


Le premier aspect intéressant est que vous voulez tout écrire sans époux. Comment fait un javiste régulier? Il y a un problème - vous déterminez une morosité, en fonction de cela, et cela résout le problème pour vous. Le prix pour cela est qu'à cause de ces porcs, le projet se transforme en porcherie, et personne ne peut déterminer exactement ce qui se passe. J'aimerais essayer d'écrire sans cette ferme porcine, propre et bien rangé. Ce n'est peut-être pas possible - veuillez nous le faire savoir dans les commentaires.


Le deuxième aspect. J'ai codé Java et PHP toute ma vie. Il y avait de l'expérience dans le développement de jouets, mais seulement dans la partie serveur avec une réponse sur le réseau, et pas une seule fois - une véritable application de bureau en C ++. Par conséquent, en substance, ce sera un spectacle anormal - une personne qui ne comprend pas le problème essaiera de décrire en quelque sorte dans ses propres mots ce qui se passe.


Non, tout cela n'a aucune valeur pratique. Ceci afin de ne pas descendre des bobines et de motiver les oncles barbus adultes à saisir également le clavier et à entailler un jouet.


La routine frappe un nickel


Malheureusement, la programmation ne commence jamais par un divertissement facile et agréable. Initialement, il y a une période de fouilles pénibles dans l'environnement et les paramètres IDE.


La première chose que j'ai comprise à propos de Visual Studio est un excellent outil pour un professionnel, mais cela fait une impression très frustrante pour un débutant. Après Eclipse et IntelliJ IDEA, tout, vous le savez, est une sorte de petit futile peu naturel et lilas avec une réabonnement. Ce n'est pas du tout VS, c'est moi :-)


Et avec les plugins, il y a toujours des problèmes.




Par conséquent, par une décision volontaire, nous abandonnons Vizhualka et voyons quoi d'autre. Vim, Emacs et d'autres éditeurs qui ne comprennent pas la structure source sont envoyés par la forêt. La première tentative d'utilisation d'Eclipse a échoué, l'outil a donc été choisi CLion .


Le problème avec CLion est qu'il ne peut toujours pas fonctionner pleinement avec le compilateur Visual Studio. Si vous essayez d'y faire quelque chose, cela ressemblera à ceci:




Bien sûr, il y aurait un fil à courir dans les goshniks et à commencer à crier d'une voix aiguë qu'il y a suffisamment d'impressions de débogage pour tout le monde. Mais nous ne les écouterons pas, bien sûr.


Par conséquent, vous avez besoin de ce que CLion peut bien faire, et c'est MinGW.


Choisir MinGW


Il y a une grande table de version .




Et cela montre qu'il est logique de ne regarder que Cygwin et Msys2. Msys2 est un peu bizarre - il a peu de committers, les packages sont sur le github personnel de l' un des auteurs. D'un autre côté, c'est vraiment cool - il y a un nouveau compilateur et un tas de paquets. C'est crucial.


L'installation consiste à appeler next-next-ok, puis à exécuter de manière répétée la commande de mise à jour ( pacman -Syu , comme dans Archlinux) avec redémarrage du terminal Msys2 jusqu'à ce qu'il dise que tout s'est déroulé de la meilleure façon possible.


Si vous installez simplement Msys2 selon les instructions et essayez de l'ajouter à CLion, aucune chaîne d'outils ne sera trouvée. Vous devez l'installer vous-même, cela se fait par la commande pacman -S mingw-w64-x86_64-toolchain .


Après avoir installé ce package, CLion lance helloworld (qui est généré automatiquement lors de la création d'un nouveau projet) et le débogage y fonctionne.


Vérification des fonctionnalités n ° 1: une fenêtre simple


Tout d'abord, je veux comprendre si au moins une application de bureau va démarrer. Pourtant, ce n'est pas le PlatformSDK natif, mais MinGW.


Pour cela, un programme simple qui dessine une fenêtre en utilisant vinapi convient.


Et oui, avec MinGW ça commence. Mais avec la chaîne d'outils Visual Studio, cela déverse une sorte d'erreurs, mais je ne les ai pas traitées, car - mais pourquoi, si la plate-forme cible fonctionne déjà pour nous?


Vérification des fonctionnalités # 2: Triangle avec Shader


Il est clair que pour écrire quelque chose de viable, il ne suffit pas d'afficher des pixels sur la fenêtre. C'est du freinage, inconfortable, il n'y a pas de trucs fantaisistes. En bref, nous avons besoin de DirectX.


La question clé à propos de CLion + MinGW est la suivante. S'ils ne peuvent pas utiliser DirectX, ils sont envoyés à la corbeille.


Pour les tests, un très court tutoriel a été googlé, composé de seulement deux fichiers: dans l'un, tout le code C ++, dans l'autre, un shader. Le défi est de le faire fonctionner.


En plus de la nature d'un seul fichier, ce tutoriel est très bon car il raconte du doigt comment cela fonctionne. Peut-être que cet article devrait être transféré à Habr (écrire dans les commentaires).


Le résultat final est ici GitHub . Je décrirai ici les problèmes rencontrés.


Petites choses et poubelles


De nombreuses lignes en L sont devenues de simples chaînes. Vous pouvez supprimer les lettres L. Dans de nombreux endroits, vous devez remplacer NULL par 0 afin qu'il ne tombe pas.


Malgré le fait que set(CMAKE_CXX_STANDARD 17) , rien d'intéressant ne s'est produit à cet égard, rien ne s'est effondré.


En-têtes et bibliothèques


Le fait est, bien sûr, que cet exemple est très ancien, écrit bien avant Windows 10. DirectX n'est plus dans un SDK DirectX distinct comme à l'époque de notre jeunesse controversée, mais il est directement inséré dans le SDK Windows.


Par conséquent, la première chose à faire est d'exécuter le programme d'installation de Visual Studio et de vérifier que la dernière version du SDK Windows est installée.


La deuxième question fait la une des journaux.


 #include <d3d11.h> #include <d3dx11.h> #include <d3dx10.h> 

Ils ne sont plus, vous avez besoin de quelque chose comme:


 #include <d3d9.h> #include <d3d10.h> #include <d3d11.h> #include <dxgi.h> 

Et puis dans CMakeLists ajoutez une recherche à la fin du fichier:


 set(LIBS d3d9 d3d11 d3dcompiler_43) target_link_libraries(src ${LIBS}) 

API manquantes


Auparavant, il y avait une telle structure :


 typedef struct D3DXCOLOR { FLOAT r; FLOAT g; FLOAT b; FLOAT a; } D3DXCOLOR, *LPD3DXCOLOR; 

Et elle n'est plus. Cependant, dans tous les endroits où cela était vraiment nécessaire, il s'est avéré remplacer D3DXCOLOR(0.0f, 0.2f, 0.4f, 1.0f) par {0.0f, 0.2f, 0.4f, 1.0f} .


Le problème s'est avéré plus intéressant avec le D3DX11CompileFromFile . Elle n'est plus!


Dans l'article Vivre sans D3DX, il a été proposé de le remplacer par D3DCompileFromFile .




Mais voici le problème, D3DCompileFromFile est également indisponible pour une raison quelconque!


Une petite enquête a montré que la documentation Microsoft suggère d'utiliser une toute nouvelle version de l'API:




Et MinGW nous renvoie au passé depuis plusieurs années:




Cependant, dans la version 32 bits, il existe un en-tête plus récent, mais je n'ai pas compris comment l'ajouter à 64 bits. 32 bits sur, probablement, dans les figures n'ont pas abandonné.


D'une part, c'est très triste, car cela laisse présager une hémorragie dans une relation avec MinGW à l'avenir. Je me demande qui sont les manières de toutes ces questions.


D'un autre côté, si nous prenons le D3DCompile manquant et le D3DCompileFromFile actuel:


 HRESULT WINAPI D3DCompileFromFile( in LPCWSTR pFileName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs ); 

 HRESULT WINAPI D3DCompile( in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName, in_opt const D3D_SHADER_MACRO pDefines, in_opt ID3DInclude pInclude, in_opt LPCSTR pEntrypoint, in LPCSTR pTarget, in UINT Flags1, in UINT Flags2, out ID3DBlob ppCode, out_opt ID3DBlob ppErrorMsgs ); 

il s'avère qu'il n'y a que la différence dans ce qui suit:


  in LPCWSTR pFileName, 

contre


  in LPCVOID pSrcData, in SIZE_T SrcDataSize, in_opt LPCSTR pSourceName, 

Malheureusement, je ne connais pas le C ++, donc je vous ai dit comment je pouvais: je viens d'ajouter la soustraction de fichiers et de rediriger ces données vers D3DCompile .


 void WINAPI D3DCompileFromFile(const char *filename, const D3D_SHADER_MACRO *defines, ID3DInclude *include, const char *entrypoint, const char *target, UINT sflags, UINT eflags, ID3DBlob **shader, ID3DBlob **error_messages) { SIZE_T data_size; char* buffer; ifstream infile; infile.open(filename, ios::binary); infile.seekg(0, ios::end); data_size = infile.tellg(); infile.seekg(0, ios::beg); buffer = new char[data_size]; infile.read(buffer, data_size); infile.close(); D3DCompile(buffer, data_size,filename, defines, include,entrypoint, target, sflags, eflags, shader, error_messages); } 

La seule différence importante entre le D3DX11CompileFromFile et notre propre D3DCompileFromFile est l'absence d'un ID3DX11ThreadPump comme paramètre dans la nouvelle API. Est-ce quelque chose pour l'asynchronie, peut-être une sorte de pool de threads? Cependant, il n'a pas été utilisé dans le tutoriel, il y en a 0 à sa place.


Résumé


Un tas de DirectX + MinGW + Msys2 + CLion est suffisamment viable pour couper un jeu simple. Il est possible non seulement d'utiliser le vinapi de base, mais aussi de dessiner, et même avec des shaders.


En général, c'est tout. Je vous rappelle que le résultat simple repose sur GitHub .


N'oubliez pas que ce n'est pas mon code, mais un texte modifié du tutoriel - cependant, j'espère que son utilisation est honnête et ciblée. Mais néanmoins, c'est pourquoi il n'y a pas de licence normale là-bas .




Rétroaction


Veuillez écrire vos commentaires et suggestions dans les commentaires. Pour cela, tout est fait, écoutez ce que vous dites. Surtout si vous êtes un programmeur de jeux chevronné, juste un bison, un bison, et vous ne tenez pas dans un fil par taille. Assurez-vous d'entrer et d'écrire quelque chose.


Je vous rappelle que, comme tout autre blogueur, je mange des likes et des designs. Plus vous jouez violemment la flèche vers le haut sous ce post, plus le prochain post et le prochain flux seront susceptibles de sortir.


                  

© Alexander Raevsky

Source: https://habr.com/ru/post/fr424971/


All Articles