Liebe es, Indie Gamedev'a zu hassen

Die Geschichte handelt davon, wie ich beschlossen habe, das Spiel ohne Wissen und Erfahrung in diesem Bereich, ohne Engine und Investitionen zu entwickeln. Wozu brauche ich das? Warum sollte sonst noch jemand? Über Misserfolge und Erfolge, über den Beginn der Indie-Entwicklung.



Hallo allerseits! Mein Name ist Roma und seit einigen Jahren entwickle ich für Embedded On, vergib mir, C / C ++. Programmieren ist für mich etwas mehr als Arbeit. Daher der Wunsch, ein eigenes Projekt zu haben, das wachsen wird, und damit meine Professionalität. Ich glaube sowieso daran. Viele Sprachen und Technologien wurden ausprobiert, viele Ideen und ebenso viele Fehler. Ich glaube, jemand hat sich selbst erkannt. Dieser Beitrag befasst sich mit dem Beginn der Entwicklung eines Computerspiels in C ++ mit OpenGl. Als nächstes wird es um Folgendes gehen:


  1. Schwierigkeiten, die vor mir auftauchen und Lösungsansätze.
  2. Übersicht der verwendeten Technologien und Entwicklungswerkzeuge.
  3. Links zu verwendeten Ressourcen im Netzwerk.

Was wird nicht weiter passieren:


  1. Über die Feinheiten der C ++ - Entwicklung. Die Sprache wird mit diesem Abstraktionsgrad erwähnt, so dass sie leicht durch eine andere Sprache ersetzt werden kann, die OOP von Haus aus unterstützt.
  2. Über fertige Motoren und deren Einsatz. Ich habe nichts dagegen, ich bin sogar FÜR. Aber ein Beitrag über etwas anderes.
  3. Über das großartige Bild mit den Shadern der neuesten Generation. So weit so weit.

Also ein Beitrag über Abenteuerlust und Kunst. Der am Ende des Beitrags beschriebene Entwicklungsansatz erscheint mir zumindest nicht kanonisch. Ich denke jedoch, dass er ein Existenzrecht hat. Wenn Sie bis zu diesem Ort lesen und Sie aus Stöcken und gerne entwerfen geh improvisiert heißt, dann wirst du nicht enttäuscht sein.


Start und Misserfolg


Eine kurze Überprüfung der Tools für die Entwicklung eines 2D-Spiels ohne Engine ergab, dass Sie sofort ein Framework für die Verarbeitung von Maus und Tastatur sowie für die Unterstützung von Audio- und Grafikprimitiven auswählen müssen. Die SFML-Bibliothek wurde ausgewählt. Es dauerte ungefähr eine Woche, um sich kennenzulernen, etwas wurde skizziert: Panzer fuhren über ein rechteckiges Feld und töteten sich gegenseitig, es war möglich, ihre Fabriken und dergleichen im Geiste der RTS der frühen 2000er Jahre zu bauen. Es schien langweilig und wollte 3D. Ich wusste weniger über 3D als über Javascript über Typensicherheit. Google hat als erstes Unternehmen OpenGl veröffentlicht, das aus der Mode gekommen ist. Und auch über Empfehlungen zur Nutzung des sogenannten Core-Profils dieses OpenGl. Wen soll ich mit veralteten Methoden schreiben? Bei Versuchen, Core Profile mit SFML zu kreuzen, stellte sich heraus, dass SFML dieses Profil mit seinem Grafikmodul nicht gleichzeitig unterstützt. Es war ein schwerer moralischer Schlag, da Ressourcen für das Erlernen von SFML aufgewendet wurden. Darüber hinaus wurde nicht die gesamte Codebasis aus der Grafikbibliothek abstrahiert.


GLFW und die neue Hoffnung


Wie der Name des Abschnitts andeutet, verstehen sich Core Profile OpenGl und GLFW gut. Die Hauptressource , die ich bei OpenGl benutze. Ja, ohne VPN wird es dank der Runet-Verteidiger höchstwahrscheinlich nicht geöffnet. Helfer . In ein oder zwei Wochen schweben einfache geometrische Elemente mit Texturen auf dem Bildschirm. Wenn Sie mit SFML zu GLFW wechseln, lernen Sie, das Prinzip der Abhängigkeitsinversion (D in SOLID) zu bewerten. Als Ergebnis wurde es geboren



Ich hatte keine Illusionen in Bezug auf die ästhetische Seite des Problems, aber der Prototyp war am Leben. Ja, er war hässlich, aber jeder kennt ein berühmtes Märchen. Die Stimmung wurde besser. Damals war die schwierigste Aufgabe für mich heute gelöst: ein Modell mit Animation zu erstellen. Die Aufgabe wurde in Unteraufgaben unterteilt:


  1. Erstellen von Animationen in einem Editor, z. B. in Blender.
  2. Export in ein animationsunterstützendes Format wie Collada.
  3. Zum Beispiel in C ++ mit der Assimp-Bibliothek importieren.
  4. Entwerfen von Klassen und deren Implementierung mit OpenGl.

So erhielten die Panzer einen Drehturm.


Wenn stolz auf Arbeit, aber schäme mich, es zu zeigen


Ja, heute kann nicht jeder die schön gestalteten Abstraktionen schätzen, besonders wenn sie nicht sind . Etwas war nötig, um das Auge zu erfreuen. Dies war so etwas wie eine Verfahrenslandschaft. Der Generator ist seit langem allen bekannt, aber nicht für mich Lärm von Perlin . Es stellte sich heraus, dass es Parameter gibt, die eine empirische Auswahl erfordern. Die Neukompilierung ist ein schwerer Schlag für die Psyche, daher war eine grafische Benutzeroberfläche für das Prototyping erforderlich. Die Suche ergab eine brillante ImGui- Bibliothek. Mit ihm ist die numerische Parameter, Farben, Anzeigemodi, Anpassung ein Vergnügen. Das Ergebnis des resultierenden Generators


img


Ein bisschen Nebel


Der Nebel wird in einer bestimmten Höhe mit einer bestimmten Sättigung in einem Fragment-Shader unter Verwendung einer empirisch ausgewählten Funktion angezeigt. Bei Bedarf können Sie mehrere Nebelschichten mit Ihren eigenen Parametern, einschließlich der Farbe, hinzufügen. Ein Beispiel für eine Landschaft vor und nach einer Nebelsimulation:



Der Moment, in dem Algorithmen benötigt wurden


Ja, das hat es getan. Das zweite Mal in 5 Jahren. Es geht darum, einen Weg zwischen zwei Punkten in Gegenwart von Hindernissen zu finden, da sich Bodeneinheiten nicht um die Berge bewegen können! Der A * -Algorithmus hilft dabei. Pseudocode hat von hier genommen . Die Implementierung erfordert Profilerstellung und Optimierung sowie viele andere Stellen. In der aktuellen Version umgehen Einheiten jedoch Hindernisse, sofern der Pfad überhaupt vorhanden ist. Irgendwann in diesem Moment nahm die Idee des Spiels Gestalt an.


Der Raum, den wir sind ...


Die Idee, die sich entwickeln wird, ist die Erforschung des Planeten durch Pioniere. Schaffung einer Bio-, Atmosphären- und letztendlich Ökosphäre. Ich werde ein Beispiel geben. Das Leben wird zunächst nur in einer künstlich geschaffenen Kuppel möglich sein, in der Lebewesen wachsen können: Pflanzen, Tiere. Sie werden wiederum die Landschaft beeinflussen. Das Folgende ist ein Beispiel einer Kuppel und der Landschaft darunter durch N- und M-Iterationen, N <M.



Über Mercator, Erde und Politik


Eine flache Landschaft ist schon etwas, aber nur eine der Ansichten auf dem Planeten. Aus meiner Sicht ist es viel attraktiver, einen realeren kosmischen Körper zu betrachten. Kartografie-Zeit!


Wenn es unmöglich war, ein Rechteck ohne Verzerrung über eine Kugel zu ziehen, vermutete ich, dann wurde die Anzahl der Anzeigemethoden zu einer Offenbarung. Die häufigste Mercator-Projektion hat Probleme mit der Anzeige an den Polen und verzerrt die Proportionen stark, wenn sie sich vom Äquator entfernt. So sehr, dass die Russische Föderation größer zu sein scheint als Afrika, und die Vereinigten Staaten - Australien.


Wie sich herausstellte, kann ein Maß für die Verzerrung auch analytisch berechnet werden. Grob gesagt wird ein Kreis auf einer Ebene zu einer Ellipse auf einer Kugel und umgekehrt. Die Aufgabe lautete wie folgt: Hinzufügen einer Ansicht eines kugelförmigen Körpers zu einer flachen Ansicht. Daher das Problem: Welchen Typ soll ich als Haupttyp wählen und welchen mit Verzerrung anzeigen? Es wurde beschlossen, eine flache Ansicht ohne Verzerrung als Ansicht anzuzeigen, die mehr Operationen ermöglicht, einschließlich Auswählen und Verschieben von Einheiten. Die Sicht auf den kugelförmigen Körper blieb für Operationen mit Flugzeugen, beispielsweise künstlichen Satelliten, erhalten. Als Anzeige wird die stereografische Projektion von Gall als einer der Kompromisse verwendet. Verzerrungen wurden mit Hilfe von Verzerrungsellipsen berechnet, sie sind auch die Tisso-Indikatrix. Als Ergebnis sehen Sie Folgendes: Der Screenshot zeigt eine Ansicht des Planeten als kugelförmigen Körper mit zwei Kuppeln, von denen eine zwei Energiequellen speist, die andere - eine Quelle.


img


Softwaremodule und Entwicklungszyklus


Die Mindestaufgabe in der Phase „Soll ich überhaupt anfangen?“ War die folgende: Das ganze Jahr über von einfach zu komplex und schön zu werden. Es ist extrem einfach, in ein paar Wochen von der Liebe des Projekts angewidert zu werden. Ich habe fünf Gründe dafür:


  1. Der erste Grund ist der Code. Ohne Unterstützung für vernünftige Architektur und Refactoring wird die meiste Zeit ein Bugfix sein, aber was ist die Freude daran?
  2. Unzureichende Konzentration auf einen. Wenn ich mich mit einem Stundenalgorithmus beschäftige, einer Stunde - ein Modell in Blender -, kann ich das Ziel nicht erreichen.
  3. Übermäßige Konzentration. Wenn man sich lange Zeit mit der Engine und den Algorithmen beschäftigt, ändert sich das Bild nicht und es scheint, als gäbe es keinen Fortschritt.
  4. Schwierigkeiten bei der Beherrschung des Werkzeugs. Die Fülle der Blender-Oberfläche oder der OpenGl-API spornt zum Respekt, wenn nicht gar zur Angst an. Von Anfang an kann es einige Tage dauern, bis der erste Proof of Concept vorliegt. Dies ist ein moralischer Schlag.
  5. Hohe Erwartungen und unvorbereitetes Scheitern. Manchmal ist es schwierig, den Ansatz „Entwerfen, Implementieren und nicht Zurückgeben“ zugunsten des Ansatzes „Prototyp / Implementierung / Verfeinerung von Schnittstellen“ aufzugeben.

Als Verfechter von TDD sehe ich keine Möglichkeit, es mit einem solchen Prozentsatz von F & E anzuwenden. Ich würde mich freuen, wenn Sie, lieber Leser, mir Anlass zu Zweifeln geben würden.


Im Moment haben sich folgende Entwicklungsbereiche herausgestellt:


  1. Entwerfen von Modellen in Blender.
  2. Implementierung von Algorithmen und Mathematik, zum Beispiel A * oder Perlin Noise.
  3. Entwicklung des "Motor" -Teils. Es versteht sich beispielsweise als Geländegenerator oder als Import eines Modells aus Blender.
  4. Entwicklung eines Moduls für das Rendering.
  5. Entwicklung der Spiellogik. Es erfordert, dass sie die Engine und das Rendering-Modul verwendet.
  6. Refactoring

Die Pläne sehen die Trennung der Module 2-5 auf Bibliotheksebene mit jeweils einer Fassade vor. Einer der möglichen Gründe: Das Hinzufügen von Kamerasteuerungsfunktionen erfordert die kaskadierende Neukompilierung einer großen Menge an Quellcode.


Die Praxis zeigt, dass es sich als produktiv herausstellt, wenn Sie sich 5-10 Stunden lang auf einen Bereich konzentrieren. Weniger - der Fokus geht verloren, mehr - das Auge ist unscharf.


Um das Ziel zu erreichen, halte ich es für möglich, in regelmäßigen Abständen gegen einige Regeln der normalen Entwicklung zu verstoßen, vorausgesetzt, der Ort des Verstoßes ist markiert und es wird Zeit für die Umgestaltung eingeräumt. Letzteres geschieht alle 7-10 Tage. Beispiel: Temporäres Erstellen globaler Variablen. Ich werde sie beseitigen, indem ich sie beim Refactoring an Konstruktoren / Methoden weitergebe, um Klassen mit geringer Konnektivität und hoher Verzahnung zu unterscheiden. Was wird eine neue Runde von Refactoring mit sich bringen. Die Vorteile dieses Ansatzes:


  1. Bereitschaft zur Umsetzung neuer Ideen. Ablehnung des Alten.
  2. Die Fähigkeit, Schnittstellen zu entwickeln.

Nachteile:


  1. Refactoring kann sich verzögern.
  2. Ich sehe unrealistische Unterstützung für Unit- / Mock-Tests.
  3. Einige überwinden Schwierigkeiten in Vim. Warum Vim, wenn es Nachteile hinzufügt? Was sind dann die Pluspunkte für mich mehr.

Fortsetzung folgt


Vielen Dank für Ihre Aufmerksamkeit auf meinen bescheidenen Beitrag! Der gesamte Code ist hier . Zusätzlich zu den oben beschriebenen Aufgaben dauerte es viel Zeit, sich mit Blender vertraut zu machen, VIM-Anpassungen vorzunehmen und Änderungen daran vorzunehmen. Wenn es zumindest ein bisschen interessant war, schreibe bitte. In einem der folgenden Beiträge kann ich etwas genauer behandeln. Ein Video mit weiteren Implementierungsdetails finden Sie hier .

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


All Articles