L'amour pour détester indie gamedev'a

L'histoire raconte comment j'ai décidé de commencer à développer le jeu sans connaissances ni expérience dans ce domaine, sans moteur ni investissements. Pourquoi ai-je besoin de ça? Pourquoi quelqu'un d'autre? Sur les échecs et les succès, sur le début du poste de développement indépendant.



Bonjour à tous! Je m'appelle Roma et depuis plusieurs années je développe pour embarqué sur, pardonnez-moi, C / C ++. Pour moi, programmer est un peu plus que du travail. D'où l'envie d'avoir tout propre projet qui va grandir, et avec lui mon professionnalisme. J'y crois quand même. De nombreux langages et technologies ont été essayés, beaucoup d'idées et autant d'échecs. Je pense que quelqu'un s'est reconnu. Cet article parlera du démarrage du développement d'un jeu informatique en C ++ à l'aide d'OpenGl. Le prochain sera sur les points suivants:


  1. Difficultés qui surgissent devant moi et approches de leur solution.
  2. Présentation des technologies et outils de développement utilisés.
  3. Liens vers les ressources utilisées sur le réseau.

Ce qui n'arrivera pas plus loin:


  1. À propos des subtilités du développement C ++. Le langage sera mentionné avec ce degré d'abstraction afin qu'il puisse facilement être remplacé par un autre POO prenant en charge nativement.
  2. À propos des moteurs prêts à l'emploi et de leur utilisation. Je n'ai rien contre, je suis même POUR. Mais un article sur autre chose.
  3. À propos de la magnifique photo utilisant les shaders de dernière génération. Jusqu'ici si loin.

Donc, un article sur l'aventurisme et l'art. L'approche de développement décrite à la fin de l'article me semble au moins non canonique. Cependant, je pense qu'il a le droit d'exister. Si vous lisez cet endroit et que vous aimez créer des bâtons et aller des moyens improvisés, alors vous ne serez pas déçu.


DĂ©marrage et Ă©chec


Une brève revue des outils pour développer un jeu 2D sans aucun moteur a montré que vous devez immédiatement choisir un framework pour le traitement de la souris, du clavier, ainsi que le support pour l'audio et l'affichage des primitives graphiques. La bibliothèque SFML a été sélectionnée. Il a fallu environ une semaine pour se connaître, quelque chose a été esquissé: des chars ont roulé le long d'un champ rectangulaire et se sont tués, il a été possible de construire leurs usines et autres dans l'esprit de la RTS du début des années 2000. Il semblait terne et voulait la 3D. Je connaissais moins la 3D que le javascript sur la sécurité des types. Google a été le premier à sortir OpenGl, qui est démodé. Et aussi des recommandations pour utiliser le soi-disant profil de base de cet OpenGl. Qui suis-je pour écrire par des méthodes obsolètes? Après avoir tenté de traverser Core Profile avec SFML, il s'est avéré que SFML ne prend pas en charge ce profil en même temps en utilisant son module graphique. Ce fut un coup dur pour la morale, car des ressources ont été dépensées pour apprendre la SFML. De plus, toute la base de code n'a pas été extraite de la bibliothèque graphique.


GLFW et le nouvel espoir


Comme le nom de la section le suggère, Core Profile OpenGl et GLFW s'entendent bien. La principale ressource que j'utilise sur OpenGl. Oui, oui, sans VPN, très probablement, il ne s'ouvrira pas, grâce aux défenseurs du Runet. Aide . Dans une semaine ou deux, des éléments géométriques simples avec des textures flotteront autour de l'écran. Le passage à GLFW avec SFML apprendra à quelqu'un à apprécier le principe d'inversion de dépendance (D dans SOLID). En conséquence, il est né



Je ne me faisais aucune illusion sur le côté esthétique du problème, mais le prototype était vivant. Oui, il était laid, mais tout le monde connaît un célèbre conte de fées. L'humeur s'est améliorée. A cette époque, la tâche la plus difficile pour moi aujourd'hui était résolue: créer un modèle avec animation. La tâche a été divisée en sous-tâches:


  1. Créer des animations dans un éditeur, par exemple, dans Blender.
  2. Exportez vers un format prenant en charge les animations, tel que Collada.
  3. Importez en C ++, par exemple, avec la bibliothèque Assimp.
  4. Concevoir des classes et leur implémentation à l'aide d'OpenGl.

Ainsi, les chars ont reçu une tour tournante.


Quand je suis fier du travail, mais honteux de le montrer


Oui, aujourd'hui tout le monde ne peut pas apprécier les abstractions magnifiquement conçues, surtout quand ils ne le sont pas . Il fallait quelque chose pour plaire aux yeux. Il s'agissait en quelque sorte d'un paysage procédural. Le générateur est connu de tous depuis longtemps, mais pas pour moi bruit de Perlin . Il s'est avéré que certains paramètres nécessitent une sélection empirique. La recompilation est un coup dur pour la psyché, il y avait donc un besoin d'une interface graphique pour le prototypage. La recherche a abouti à une brillante bibliothèque ImGui . Avec lui, les paramètres numériques, les couleurs, les modes d'affichage, la personnalisation est un plaisir. Le résultat du générateur résultant


img


Un peu de brouillard


Le brouillard est affiché à une hauteur donnée avec une saturation donnée dans un fragment shader en utilisant une fonction sélectionnée empiriquement. Si nécessaire, vous pouvez ajouter plusieurs couches de brouillard avec vos propres paramètres, y compris la couleur. Un exemple de paysage avant et après application d'une simulation de brouillard:



Le moment où les algorithmes étaient nécessaires


Oui. La deuxième fois en 5 ans. Il s'agit de trouver un chemin entre deux points en présence d'obstacles, car les unités terrestres ne peuvent pas se déplacer dans les montagnes! L'algorithme A * vient à la rescousse. Le pseudocode a pris d'ici . La mise en œuvre nécessite un profilage et une optimisation, ainsi que de nombreux autres endroits, cependant, dans la version actuelle, les unités contournent les obstacles, si le chemin existe. Quelque part à ce moment, l'idée du jeu a pris forme.


L'espace que nous sommes ...


L'idée de travail qui évoluera est l'exploration de la planète par des pionniers. Création d'une bio-, atmosphère- et, finalement, écosphère. Je vais vous donner un exemple. Dans un premier temps, la vie ne sera possible qu'à l'intérieur d'un dôme créé artificiellement, à l'intérieur duquel il sera possible de faire pousser des êtres vivants: plantes, animaux. Ils, à leur tour, affecteront le paysage. Ce qui suit est un exemple d'un dôme et du paysage en dessous à travers N et M itérations, N <M.



Ă€ propos de Mercator, de la Terre et de la politique


Un paysage plat est déjà quelque chose, mais ce n'est qu'une des vues de la planète. De mon point de vue, il est beaucoup plus attrayant de regarder un corps cosmique plus réel. Temps de cartographie!


S'il était impossible de tirer un rectangle sur une sphère sans distorsion, je le soupçonnais, alors le nombre de méthodes d'affichage est devenu une révélation. La projection Mercator la plus courante a des problèmes d'affichage aux pôles et déforme considérablement les proportions lors de l'éloignement de l'équateur. À tel point qu'il semble que la Fédération de Russie soit plus grande que l'Afrique et les États-Unis - Australie.


Il s'est avéré qu'une mesure de la distorsion peut également être calculée analytiquement. En gros, un cercle sur un plan devient une ellipse sur une sphère et vice versa. La tâche était la suivante: ajouter une vue d'un corps sphérique à une vue plate. D'où le problème - quel type choisir pour le principal et lequel afficher avec distorsion. Il a été décidé d'afficher une vue plate sans distorsion comme une vue qui permet plus d'opérations, y compris la sélection et le déplacement des unités. La vue du corps sphérique a été laissée pour des opérations avec des avions, par exemple des satellites artificiels. En tant qu'écran, la projection stéréographique de Gall est utilisée comme l'un des compromis. Les distorsions ont été calculées à l'aide d'ellipses de distorsion, elles sont également l'indicateur de Tisso. En conséquence, vous pouvez voir ce qui suit: la capture d'écran montre une vue de la planète comme un corps sphérique avec deux dômes, dont l'un alimente deux sources d'énergie, l'autre - une source.


img


Modules logiciels et cycle de développement


La tâche minimale à l'étape «Dois-je commencer?» Était la suivante: évoluer du simple au complexe et au beau tout au long de l'année. Il est extrêmement facile de dégoûter en quelques semaines de l'amour du projet. J'ai cinq raisons à cela:


  1. La première raison est le code. Sans support pour une architecture saine et une refactorisation, la plupart du temps sera un correctif, mais quelle est la joie?
  2. Concentration insuffisante sur un. Étant engagé dans un algorithme d'heure, une heure - un modèle dans Blender, je ne peux pas atteindre l'objectif.
  3. Concentration excessive. Ayant été engagé dans le moteur et les algorithmes depuis longtemps, l'image ne change pas et il semble qu'il n'y ait pas de progrès.
  4. Difficulté à maîtriser l'outil. La richesse de l'interface Blender ou de l'API OpenGl inspire le respect, sinon la peur. Cela peut prendre plusieurs jours du début à la première preuve de concept, ce qui est un coup très moral.
  5. Attentes élevées et manque de préparation à l'échec. Parfois, il est difficile d’abandonner l’approche «Concevoir, implémenter et ne pas retourner» au profit du «Prototype / Implémentation / Raffinement des Interfaces»

Étant champion du TDD, je dois dire que je ne vois pas la possibilité de l'appliquer avec un tel pourcentage de R&D. Je serai heureux si vous, cher lecteur, me donnez des raisons de douter.


À l'heure actuelle, les domaines de développement suivants se sont démarqués:


  1. Conception de modèles dans Blender.
  2. Implémentation d'algorithmes et de mathématiques, par exemple, A * ou Perlin Noise.
  3. Développement de la partie "moteur". Il est compris, par exemple, comme un générateur de terrain ou l'importation d'un modèle depuis Blender.
  4. DĂ©veloppement d'un module responsable du rendu.
  5. Développement de la logique de jeu. Cela nécessite qu'elle utilise le moteur et le module de rendu.
  6. Refactoring

Les plans incluent la séparation des modules 2-5 au niveau de la bibliothèque avec une façade dans chacun. L'une des raisons possibles: l'ajout de la fonctionnalité de contrôle de la caméra nécessite une recompilation en cascade d'une grande quantité de code source.


La pratique montre que cela se révèle productif si vous vous concentrez sur un domaine pendant 5 à 10 heures. Moins - la concentration est perdue, plus - l'œil est flou.


Périodiquement, pour atteindre l'objectif, je vois qu'il est possible de violer certaines règles de développement normal, à condition que le lieu de la violation soit marqué et du temps alloué à la refactorisation. Ce dernier se produit tous les 7 à 10 jours. Exemple: création temporaire de variables globales. Je vais m'en débarrasser en les transmettant aux constructeurs / méthodes lors de la refactorisation, ce qui aidera à distinguer les classes à faible connectivité et à haut engrenage. Ce qui impliquera un nouveau cycle de refactoring. Les avantages de cette approche:


  1. Volonté de mettre en œuvre de nouvelles idées. Rejet de l'ancien.
  2. La capacité à faire évoluer les interfaces.

Inconvénients:


  1. La refactorisation peut être retardée.
  2. Je vois un support irréaliste pour les tests unitaires / simulés.
  3. Certains surmontent les difficultés de Vim. Pourquoi Vim s'il ajoute des inconvénients? Alors quels sont les avantages pour moi de plus.

Ă€ suivre


Merci de votre attention sur mon humble article! Tout le code est ici . En plus des tâches décrites ci-dessus, il a fallu beaucoup de temps pour se familiariser avec Blender, la personnalisation de vim et sa refactorisation. Si c'était au moins un peu intéressant, veuillez écrire. Je peux couvrir quelque chose plus en détail dans l'un des articles suivants. Une vidéo avec un peu plus de détails sur l'implémentation est ici .

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


All Articles