Jagen Sie den Wumpus oder erleben Sie das Schreiben eines klassischen Android-Spiels

Bild

Hast du jemals von Vampus gehört? Unabhängig von der Antwort - willkommen zu seiner Amtszeit!

In diesem Artikel möchte ich Ihnen meine Geschichte über das Erstellen eines Spiels für Android erzählen. Je nach Kompetenz des Lesers sind die von mir übermittelten Erfahrungen, Gedanken und Entscheidungen mehr oder weniger nützlich. Ich hoffe jedoch, dass meine Geschichte zumindest interessant sein wird.

Inhalt


1. Einleitung
2. Wahl der Mittel
3. Die Idee des Projekts
4. Ich rieche einen WUMPUS
5. Die Basis der Grundlagen - die Struktur des Projekts
6. Das Labyrinth des Vampus erzeugen und damit arbeiten
7. Speicherung von Spielnachrichten und deren Ausgabe an den Spieler
8. Das erste Ergebnis
9. Auch kleine Spiele sind der Geschichte wert.
10. Die Vampus-Transformation und das Endergebnis
11. Schlussfolgerung

1. Einleitung


Inhalt

Zuerst ein paar Worte über dich. Das Programmieren ist leider nicht meine Haupttätigkeit, aber ich widme gerne meine Freizeit dafür.

Aus irgendeinem Grund habe ich mich für die Erstellung von Handyspielen entschieden. Meine früheren Projekte für mobile Geräte wurden in der Qt-Umgebung in Verbindung mit den Sprachen QML und C ++ erstellt. Ich habe mich sehr über dieses Trio gefreut, aber als ich meine Ideen analysierte, wurde mir klar, dass es in Zukunft zu viel Zeit und Mühe kosten würde, einige Probleme mit den mir bekannten Mitteln zu lösen. Als ich über das nächste Projekt nachdachte, beschloss ich, neue, besser geeignete Entwicklungswerkzeuge zu finden und Erfahrungen damit zu sammeln.

2. Wahl der Mittel


Inhalt

Früher habe ich nur auf Android geachtet, und in dem neuen Projekt habe ich beschlossen, mich auf dieses Betriebssystem zu konzentrieren, Android Studio kennenzulernen, das ihm eigen ist, neues Java für mich selbst auszuprobieren (und in Zukunft, wenn es Ihnen gefällt, auch Kotlin zu versprechen).

Ich habe noch nie AS oder Java verwendet, und ich sah mich einer riesigen Arbeitsfront mit vielen neuen Aufgaben gegenüber, und ich war bereit, in die Schlacht zu eilen. Es blieb nur noch ein Projekt zu entwickeln.

3. Die Idee des Projekts


Inhalt

Es ist bekannt, dass das Training vor allem an realen Aufgaben stattfindet, insbesondere an solchen, die von Interesse sind. Für mich sollte ein solches Trainingsprojekt ein Spiel sein, für das ich eine Reihe von Anforderungen formulierte:

  1. Wiederholungswert.
  2. Die Einfachheit der Spielmechanik.
  3. Minimaler Einsatz von Grafiken.
  4. Das Gameplay sollte den Spieler zum Nachdenken zwingen.
  5. Die Spielparty sollte nicht lang sein.
  6. Schnelle Umsetzung des Projekts (2 Monate).
  7. Einfachheit und Einfachheit der Benutzeroberfläche.

Nachdem ich viele Optionen durchgesehen und meine Stärken objektiv bewertet hatte und mich daran erinnert hatte, dass es, egal wie viel Zeit und Ressourcen zu Beginn aufgewendet wurden, tatsächlich viel mehr dauern würde, kam ich zu dem Schluss, dass es am besten ist, die getesteten Klassiker als Grundlage zu nehmen, anstatt sie zu erfinden etwas für sich. Ich wollte absolut keine bedingte Schlange erschaffen und begann alte Spiele zu studieren. Also entdeckte ich die neugierige Jagd auf den Wumpus.

4. Ich rieche einen WUMPUS


Inhalt
Bild

Vampus Hunting ist ein klassisches Textspiel, das 1972 von Gregory Yob erfunden wurde. Im selben Jahr erhielt er in einem Zeitschriftenartikel eine Beschreibung des Spiels und des Quellcodes.

Die Essenz des Spiels besteht darin, dass der Spieler das Dodekaeder-Labyrinth untersucht, in dem sich der böse Vampus befindet, und versucht, anhand der im Spielprotokoll angezeigten Indikatormeldungen zu erraten, welche sich in den oberen Räumen befinden. Zusätzlich zu Vampus selbst (macht einen unangenehmen Geruch) gibt es Fledermäuse (Geräusche sind zu hören), die den Spieler in einen zufälligen Raum transportieren, und Gruben (dringt ein), in die getroffen wird, was zum Ende des Spiels führt. Das Ziel des Spiels ist es, den Vampus zu töten, für den der Spieler 5 Pfeile hat, die gleichzeitig von 1 bis 5 Räumen fliegen können (der Spieler selbst entscheidet, welche Art von "Stärke" er für den Schuss verwendet). Somit hat der Spieler zwei Aktionen: vom Bogen schießen, in den Raum gehen. Was das Ergebnis sein wird, hängt vom Anteil des Glücks und dem Grad des Bewusstseins ab.

Im Allgemeinen hat mir die Mechanik gefallen: Sie ist einfach, aber gleichzeitig mit Risikoelementen. Es gab keine interessanten Spiele auf Vampus bei Google Play (außer einem neuen Spiel zu dieser Zeit in der Lovecraft-Welt, in dem es, wie ich später herausfand, auf derselben Vampus-Mechanik basierte. In diesem Artikel geht es jedoch darum, ein Spiel auf Habré zu erstellen), daher wurde es akzeptiert die Entscheidung, Vampus als Grundlage zu nehmen. Ich habe mir zum Ziel gesetzt, das klassische Spiel beizubehalten, es aber leicht zu aktualisieren und neue Funktionen hinzuzufügen.

5. Die Basis der Grundlagen - die Struktur des Projekts


Inhalt

Zunächst lernte ich die Regeln des klassischen Spiels und lernte verschiedene Vampus-Implementierungen kennen. Dann habe ich ein Diagramm mit der Logik des Spiels erstellt (anklickbar):


Das Schema war zunächst nützlich, weil Erlaubt, die Mechanik des Spiels zu analysieren, Fehler zu beseitigen und etwas Eigenes zu machen. Außerdem war dieses Schema nützlich, als ich später mit dem Künstler zusammenarbeitete, um die Essenz des Spiels zu erklären.

Ich habe das Projekt in 4 Teile unterteilt, in denen jeweils unterschiedliche Aufgaben gelöst wurden. Ich werde nur einige von ihnen geben.

1. Spielmechanik

  • In welcher Form werden die Informationen über den Dungeon gespeichert?
  • Welchen Typ und wie viele Variablen benötigen Sie?
  • Schreibalgorithmen: Bilden eines Dungeons, Boom-Flug, Überprüfen des Schießergebnisses, Boom-Flug mit einer falsch ausgewählten Abfolge von Räumen, Bewegen eines Spielers, Überprüfen eines Raums beim Bewegen, Bewegen eines Spielers mit Fledermäusen usw.
  • Wie werden Informationen im Spielprotokoll angezeigt und in welcher Reihenfolge?
  • In welcher Reihenfolge soll der Raum überprüft werden?

2. Benutzeroberfläche

  • Welche Aktivitäten sollten in der Anwendung enthalten sein? Wie sollten sie aussehen und welche Elemente sollten auf ihnen sein?
  • Welche Parameter können in den Einstellungen geändert werden?
  • Benötige ich Bilder im Spiel?
  • Was sollte im Allgemeinen der Stil der Anwendung sein (Farben, Stimmung, Nachrichtenstil)?
  • Welche Schriftarten sollen verwendet werden?

3. Andere

  • Stellen Sie eine Verbindung zu Google Play-Diensten her
  • Arbeiten Sie mit XML-Dateien
  • Welche Schriftarten sollen verwendet werden?

4. Schreiben Sie Text für das Spiel

  • Spielnachrichten
  • Die Regeln
  • Spielbeschreibung für Google Play

Es ist eher unnötig als unmöglich, alles zu beschreiben, daher werde ich mich nur auf einige Punkte konzentrieren, wonach ich das erste erzielte Ergebnis zeigen werde.

6. Das Labyrinth des Vampus erzeugen und damit arbeiten


Inhalt

Das Vampuslabyrinth ist ein Dodekaeder, das als Matrix G der Dimension 20x20 dargestellt werden kann. Wir nummerieren die Eckpunkte von 0 bis 19. Wenn das Matrixelement 1 ist, gibt es einen Durchgang zwischen den Eckpunkten (Räumen), andernfalls nein.

Wir führen auch die N- Matrix der Dimension 20x3 ein, in der die Indizes der Nachbarn für jeden Raum gespeichert sind. Diese Matrix beschleunigt die Arbeit mit G.


Die Matrizen G und N sind in den Spielcode eingenäht und ändern sich nicht (natürlich ist das Speichern von G nicht erforderlich, da Sie nur mit N arbeiten können , aber lassen wir es vorerst so). Dies sind die „wahren“ Scheitelpunktindizes eines bestimmten Dodekaeders ein für alle Mal. Für den Spieler werden "Spiel" -Indizes, die eine Art Maske der "wahren" sind, wie folgt zu einem Vektor V der Dimension 20 gebildet:

//  ""    for (byte i = 0; i < 20; i++) { V[i] = i; } //    ""  for (int i = 0; i < 20; i++) { int tmpRand = random.nextInt(20); byte tmpVar = V[i]; V[i] = V[tmpRand]; V[tmpRand] = tmpVar; } 

So erhält man folgendes Bild:


Vektor V wird bei jedem neuen Spiel gebildet, wodurch der Spieler einen "neuen" Dungeon erhält.

Um die Entsprechung zwischen dem Raumindex "true" und "game" herzustellen , wird die indByNmb- Konvertierungsmethode verwendet:

 public byte indByNmb(int room) { byte ind = -1; for (byte i = 0; i < V.length; i++) { if (V[i] == room) { ind = i; break; } } return ind; } 

Bei der Eingabe erhält die indByNmb- Methode den "Spiel" -Index des Raumraums und bei der Ausgabe den "wahren" Index.

Nachdem wir die Struktur des Dungeons erstellt haben, platzieren wir: 2 Fledermausherden, 2 Löcher, einen Vampus und einen Spieler:

 byte[] randomRooms = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; for (int i = 0; i < 20; i++) { int tmpRand = random.nextInt(20); byte tmpVar = randomRooms[i]; randomRooms[i] = randomRooms[tmpRand]; randomRooms[tmpRand] = tmpVar; } P = randomRooms[0]; W = randomRooms[1]; Pits[0] = randomRooms[2]; Pits[1] = randomRooms[3]; Bats[0] = randomRooms[4]; Bats[1] = randomRooms[5]; 

Eine solche Platzierung stellt sicher, dass sich nicht zwei Bewohner in einem Raum befinden und der Spieler nicht von Anfang an in den Raum des Vampus geworfen wird.

Die vollständige Dungeon-Generierung ist wie folgt:

Code
 byte[] V = new byte[20]; // ""  int P; //  , byte W; //   byte[] Bats = new byte[2]; //    , byte[] Pits = new byte[2]; //    public void generateDungeons() { resetVars(); //      for (int i = 0; i < 20; i++) { int tmpRand = random.nextInt(20); byte tmpVar = V[i]; V[i] = V[tmpRand]; V[tmpRand] = tmpVar; } byte[] randomRooms = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19}; for (int i = 0; i < 20; i++) { int tmpRand = random.nextInt(20); byte tmpVar = randomRooms[i]; randomRooms[i] = randomRooms[tmpRand]; randomRooms[tmpRand] = tmpVar; } P = randomRooms[0]; W = randomRooms[1]; Pits[0] = randomRooms[2]; Pits[1] = randomRooms[3]; Bats[0] = randomRooms[4]; Bats[1] = randomRooms[5]; } 


Jetzt können Sie alle Algorithmen der Spielmechanik implementieren. So erfolgt beispielsweise die Ausgabe benachbarter Räume, wenn ein Spieler den Raum mit dem currentRoom- Index betritt :

 public void printNearRooms(byte currentRoom) { byte ind = indByNmb(currentRoom); appendText(V[N[ind][0]], V[N[ind][1]], V[N[ind][2]]); } 

Bei der Eingabe ruft die printNearRooms- Methode den aktuellen "Spiel" -Index des currentRoom- Raums ab.

Betrachten Sie die Mechanik eines Beispiels. Lassen Sie den Spieler in einen neuen Raum ziehen und eine Meldung erscheint: "Jetzt bin ich in Raum 8". Die Nummer 8 ist ein Spielindex. Der "wahre" Raumindex ist 6 (siehe Screenshots oben). Der Code arbeitet speziell mit dem "wahren" Index, d.h. 6. Für 6 werden die Indizes der „wahren“ Nachbarn bestimmt: 2, 5, 7. Die „Spiel“ -Innen sind jeweils: 10, 0, 7. Wir zeigen dem Spieler im Protokoll: „Ich kann in die Räume 10, 0, 7 gehen“.

Wenn Sie also für jedes neue Spiel den Vektor V bilden und mit den Indizes "true" und "game" des Labyrinthgraphen arbeiten, wird der Anschein erweckt, dass jedes Spiel einzigartig ist.

Dank der Funktion appendText werden Nachrichten in einem bestimmten Intervall angezeigt. Wir werden sie später treffen.

Hier ist ein Beispiel für die Überprüfung des Raums auf die Nähe von Mäusen:

 public boolean isBatsNear() { boolean answer = false; byte indP = indByNmb(P); for (int i = 0; i < 3; i++) { if ((V[N[indP][i]] == Bats[0]) || (V[N[indP][i]] == Bats[1])) { answer = true; break; } } return answer; } 


7. Speicherung von Spielnachrichten und deren Ausgabe an den Spieler


Inhalt

Das klassische Spiel war ein Prozess der Interaktion zwischen dem Spieler und der Konsole, d.h. Das Spiel war rein textuell. Ich wollte diese Funktion speichern, für die ich alle Spielnachrichten in Blöcke unterteilt habe, zum Beispiel:

  • Die erste Nachricht des neuen Spiels.
  • Eine Nachricht, wenn sich ein Spieler bewegt.
  • Nachricht in der Nähe der Gruben.
  • Nachricht beim Bewegen von Vampus.
  • Nachricht beim Fallen in ein Loch.

Der Text wird in einer XML-Datei gespeichert. Jeder Block verfügt über mehrere Nachrichtenoptionen für eine Vielzahl von Spielabläufen.

Ein Beispiel für einen Nachrichtenblock, der angezeigt wird, wenn sich in einem der benachbarten Räume ein Loch befindet:

 <string name="g_pitsNear_1">—  \n</string> <string name="g_pitsNear_2">—    \n</string> <string name="g_pitsNear_3">—     \n</string> <string name="g_pitsNear_4">—  , \n</string> <string name="g_pitsNear_5">—   \n</string> <string-array name="g_pitsNear"> <item>@string/g_pitsNear_1</item> <item>@string/g_pitsNear_2</item> <item>@string/g_pitsNear_3</item> <item>@string/g_pitsNear_4</item> <item>@string/g_pitsNear_5</item> </string-array> 

Mit dieser Struktur können Sie problemlos vorhandene bearbeiten oder neue Nachrichten hinzufügen, ohne den Java-Code zu beeinflussen.

Wenn zum Beispiel beim Überprüfen des Raums die zuvor gezeigte isBatsNear- Methode true zurückgegeben hat , erhalten wir den gewünschten Nachrichtenblock aus XML und nehmen dann zufällig einen als Argument für appendText :

 if (isBatsNear()) { String[] g_batsNear = getResources().getStringArray(R.array.g_batsNear); appendText(g_batsNear[random.nextInt(g_batsNear.length)]); } 

Spielnachrichten werden an die Konsole ausgegeben, bei der es sich um ein TextView- Objekt handelt. Schauen wir uns die appendText- Methode an.

 public void appendText(final String str) { msgBuffer.add(str); if (!isTimerGameMsgWork) { mTimerGameMsg.run(); isTimerGameMsgWork = true; } } 

Wenn eine Spielnachricht angezeigt werden muss, wird die appendText- Methode aufgerufen , die sie als Argument verwendet. In der Methode selbst wird zuerst eine Zeile zum msgBuffer- Puffer hinzugefügt. Anschließend wird die boolesche Variable isTimerGameMsgWork überprüft . Es akzeptiert true in Fällen, in denen der mTimerGameMsg- Timer gestartet wird . Wenn dieser Timer funktioniert, werden aus dem msgBuffer- Puffer gemäß dem FIFO-Prinzip (First In First Out) Nachrichten in einem festgelegten Intervall mIntervalGameMsg empfangen und dem Spielprotokoll - txtViewGameLog hinzugefügt .

Der vollständige Nachrichtenausgabecode:

Code
 ArrayList<String> msgBuffer = new ArrayList<>(); Handler mHandlerGameMsg; private int mIntervalGameMsg = 1000; boolean isTimerGameMsgWork = false; public void appendText(final String str) { msgBuffer.add(str); if (!isTimerGameMsgWork) { mTimerGameMsg.run(); isTimerGameMsgWork = true; } } final Runnable mTimerGameMsg = new Runnable() { @Override public void run() { if (msgBuffer.size() == 0) { mHandlerGameMsg.removeCallbacks(mTimerGameMsg); isTimerGameMsgWork = false; } else { txtViewGameLog.append(msgBuffer.get(0)); msgBuffer.remove(0); mHandlerGameMsg.postDelayed(mTimerGameMsg, mIntervalGameMsg); } } }; 



8. Das erste Ergebnis


Inhalt

Nach einem Monat Entwicklungszeit wurde die erste spielbare Version des Spiels mit vollständig implementierter Funktionalität erhalten. Ich füge Screenshots bei:

Screenshots der ersten Version des Spiels





Auf den dargestellten Screenshots sehen Sie: das Hauptmenü, das Regelfenster, das Einstellungsfenster, das Spielfenster.

Natürlich habe ich verstanden, dass das Ergebnis völlig uninteressant war. Die Hauptsache ist, dass ich praktische Erfahrungen in AS und Java gesammelt habe, was die erste Aufgabe war.

Der Spieler musste wie im klassischen Spiel über die Konsole interagieren: Geben Sie die Raumnummer für die Bewegung oder die Route für den Pfeil ein. In den Einstellungen habe ich es möglich gemacht, die Schriftgröße und Transparenz des Hintergrunds zu ändern. Ich nahm an, dass es für jedes Spielfenster einen eigenen Bildhintergrund gibt (um das Gameplay leicht zu diversifizieren, ha!).

Als nächstes plante ich, die vorhandenen Bilder (die ich skrupellos aus dem Internet genommen hatte) durch diejenigen zu ersetzen, die der Künstler zeichnen würde. Dann würde ich das Spiel auf dem Play-Markt veröffentlichen und es sicher vergessen und die gesammelten Erfahrungen auf neue Projekte anwenden. Und dann konnte ich mir nicht vorstellen, wie sehr sich Vampus verändern könnte ...

9. Auch kleine Spiele sind der Geschichte wert.


Inhalt

Wenn eine Person mit der Seele arbeitet, profitiert das Projekt nur davon. Ich hatte Glück, dass sich die Künstlerin Anastasia Frolikova als eine solche Person herausstellte. Das heißt, Anstatt nur zu zeichnen, was ich brauchte, interessierte sie sich für die Welt des Spiels und wollte verstehen, wie es funktioniert. Und plötzlich stellte sich heraus, dass es im Großen und Ganzen keinen Frieden gab! Wer ist dieser Vampus? Und warum sollte ein Spieler ihn töten? Wie sehen Vampusräume aus? Und so weiter, so weiter, woran ich nicht gedacht habe und was ich dem Spieler nicht sagen wollte. Infolgedessen waren wir uns einig, dass selbst ein so scheinbar kleines Spiel eine eigene Geschichte haben sollte. Und sie erschien.

Nach unserer Legende ist der Vampus zwar uralt, aber kein böses Fabelwesen, das es liebt, sich über Menschen lustig zu machen. Ja, er lebt in einem Labyrinth, aber dieses Labyrinth hat nicht die Form eines klassischen dunklen Verlieses, sondern die Form eines unvorstellbaren Hauses, das aus einem Haufen von Räumen besteht, deren Inhalt Vampus charakterisiert. So gibt es zum Beispiel in einem der Räume ein Kino, an dessen Wänden Plakate seiner Lieblingsfilme hängen, und in dem anderen seinen Schrank, in dem er seine "Streiche" vorbereitet.


Der Spieler eines namenlosen Jägers wurde zum Stammspieler im kryptozoologischen Forum, der die Existenz von Vampus beweisen will. Wir haben den klassischen Pfeil und Bogen durch eine Kamera und einen Film ersetzt, und das Ziel des Spiels war nicht, Vampus zu töten, sondern sein Foto zu bekommen. Das Hauptmenü wurde übrigens für ein Forum überarbeitet, in dem Leute über Vampus diskutieren, und aus der Diskussion kann der Spieler mehr darüber erfahren.

Die erste Version des Hauptmenüs in Form eines Forums

Die anderen Aspekte blieben nahezu unverändert: Die Mäuse verhalten sich genauso, und das Betreten der Grube führte zu einem Absturz, einem Zusammenbruch der Kamera und dem Ende des Spiels (und nicht zum Tod des Spielers).


Ein weiterer Moment über die Kamera. Im klassischen Spiel konnte der Spieler einen Pfeil in einer Entfernung von 1 bis 5 Räumen abschießen und es sah logisch aus. Wir haben eine Kamera anstelle eines Bogens (machen Fotos von 1 bis 3 Räumen gleichzeitig, arbeiten aber wie ein klassischer Pfeil, der Vampus trifft). Und das ... sieht komisch aus, nicht wahr? Es gab die Idee, die Reichweite der Kamera auf 1 Raum zu reduzieren, damit Sie nur den benachbarten fotografieren können. Dies erschwert jedoch zum einen das Spiel, und zum anderen können Situationen auftreten, in denen das Spiel nicht gewonnen werden kann, was falsch ist. Im Allgemeinen ist dies der Moment, der mich persönlich immer noch verfolgt, aber ich habe noch keine Lösung gefunden.

In Bezug auf den Stil und die Stimmung des Spiels. Fast alle Spiele über Vampus sind in langweiligen Grautönen gehalten, und Aktionen finden an dunklen Orten in Dungeons statt. Deshalb haben wir beschlossen, dass unser Spiel anders sein sollte und mit Humor und in leuchtenden Farben gemacht werden sollte.




10. Die Vampus-Transformation und das Endergebnis


Inhalt

Dann warteten noch 2 Monate Arbeit am Spiel auf uns. Da Vampus 20 Zimmer hat, hat jedes sein eigenes Interieur. Darüber hinaus wurden Symbole für Erfolge, Symbole im Spiel, Entscheidungen über das Design im Allgemeinen und die Benutzeroberfläche getroffen. Der gesamte Spieltext wurde ebenfalls hinzugefügt, der Code wurde ergänzt und optimiert, neue Funktionen wurden hinzugefügt (zum Beispiel erschien ein Notizblock zum Aufzeichnen von Informationen während des Spiels). Im Allgemeinen hat der Vampus große Veränderungen erfahren.

Räume wurden zum Beispiel wie folgt geschaffen:

Bild
Es gibt 20 Räume, alle sind einzigartig und der Spieler erhält bei jedem Spiel ein „neues“ Labyrinth. Wie mache ich jedes neue Spielbild mit neuen Räumen? Am einfachsten ist es, den gleichen Ansatz für "wahre" und "Spiel" -Indizes zu verwenden:

 public void changeImgOfRoom() { ImageView img = findViewById(R.id.imgRoom); int ind = indByNmb(P); String imgName = "room_" + ind; int id = getResources().getIdentifier(imgName, "drawable", this.getPackageName()); Glide.with(this) .load(id) .transition(DrawableTransitionOptions.withCrossFade()) .into(img); } 

Bilder im quadratischen Format (um Verzerrungen beim Anzeigen auf verschiedenen Bildschirmen zu verringern) werden in Ressourcen mit den Namen [room_0; room_1; ..., room_19]. Tatsächlich sind sie mit den „wahren“ Dodekaederindizes verbunden, aber für den Spieler hat jedes neue Spiel für denselben Raum unterschiedliche Bilder. Warum wird das benötigt? Damit in einer bestimmten Spielparty Textinformationen mit dem Bild eines bestimmten Raums korreliert werden können ("Ja, ich erinnere mich, dass in Raum X, der das Wohnzimmer war, ein Entwurf vorhanden war") und dass es nicht geklappt hat, "warum ist es immer in meinem Raum?" X ist das gleiche Bild? " Alles für Abwechslung und Hilfe für den Spieler (wie die Erfahrung gezeigt hat, gibt es keine Hilfe beim visuellen Auswendiglernen, es ist effizienter, mit Text zu arbeiten).

Letztendlich haben wir eine neue Version des Spiels bekommen. Und weißt du was? Der Vampus ist verdammt attraktiv geworden, und vor allem ist er immer noch der gleiche klassische Vampus, aber in einem neuen gemütlichen Haus!

Screenshots der zweiten Version des Spiels





Auf den Screenshots: das Hauptmenü, das Regelfenster, das Einstellungsfenster, das Spielfenster.

In Bezug auf die Mechanik wird es nur geringfügig modifiziert und umbenannt (gibt es tatsächlich einen Unterschied: eine Kamera oder einen Bogen, wenn Sie dasselbe tun müssen?). Die auffälligste Änderung in der Mechanik besteht darin, den Prozess der Interaktion zwischen dem Spieler und dem Spiel zu vereinfachen - die klassische Eingabe von Raumnummern über die Tastatur wurde entfernt. Um zwischen den Räumen zu wechseln, müssen Sie im Popup-Fenster 1 von 3 Zahlen auswählen. Um die „Route“ für das Fotografieren zu bilden, scrollen Sie einfach mit den Rädern auf der Trommel:


Im Video unten sehen Sie das Endergebnis:



11. Schlussfolgerung


Inhalt

Die erste Version des Spiels wurde von mir in einem Monat der Entwicklung erhalten und 1-2 Stunden nach der Arbeit zugewiesen. Gleichzeitig waren mir bisher weder AS noch Java bekannt. Die zweite Version des Spiels dauerte weitere 2 Monate. Somit arbeiten nur 3 Monate gemächlich.

Natürlich ist das Spiel in dieser Form nicht für eine breite Palette, weil Für einen modernen Spieler mag es kompliziert und nicht aufregend erscheinen, aber was noch wichtiger ist, wahrscheinlich den Geist klassischer Spiele zu bewahren, finden Sie nicht?

Bin ich mit dem Ergebnis zufrieden? Auf jeden Fall ja. Ich habe viel Erfahrung sowohl in der Programmierung als auch in der Teamarbeit gesammelt. Ich mag sowohl die resultierende Mechanik des Spiels als auch seine visuelle Komponente. Gibt es etwas, das ich ändern möchte? Natürlich sind der Perfektion keine Grenzen gesetzt und Sie können immer etwas hinzufügen / verbessern, aber Sie können dies nicht für immer tun!

Ist dieses Spiel interessant? Nun, es liegt nicht an mir zu entscheiden. Aber lassen Sie Vampus sich in dem Haus, das wir für ihn gebaut haben, mit großer Liebe und Aufmerksamkeit wohlfühlen.

Ich wünsche Ihnen viel Erfolg!

Danke und pass auf Vampus auf!

PS Ständig entstehende Aufgaben und die Freude, sie zu lösen, sind genau das, wofür ich gerne programmiere. Ich hoffe, dass Sie nicht weniger Freude haben.

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


All Articles