/// <summary> /// Main Game Loop /// Zeichnet alles was auf der Konsole angezeigt werden soll, /// solange man nicht abgebrochen oder verloren hat /// </summary> private void Draw() { // Game Loop while (!gameOver && !abbruch) { gr.ClearBuffer(); GetKeyInput(); powerups.SpawnPowerup(); stars.MoveStars(kryptonite.listPoints); kryptonite.MoveKryptonite(stars.listPoints); DrawBorder(); DrawUI(); DrawLegend(); stars.Draw(); kryptonite.Draw(); powerups.Draw(); superman.Draw(); CheckIntersection(); gr.DrawBufferToConsole(); Thread.Sleep((int)(1000 / FPS)); } // Nur Game Over Screen zeigen, wenn nicht abgebrochen wurde if (gameOver) { // Spiel vorbei (Egal ob verloren oder gewonnen, selber Screen) GameOverScreen(); } }
/// <summary> /// Zeichnet das Hauptmenü auf die Konsole /// </summary> public void Show() { // Main loop while (true) { ConsoleKeyInfo kInfo; do { gr.ClearBuffer(); // Positioniert das Logo mittig oben in der Konsole for (int i = 0; i < SUPERMAN_LOGO.Length; i++) { int length = SUPERMAN_LOGO[i].Length; for (int j = 0; j < length; j++) { // Offset 2 damit es nicht ganz oben am Rand ist sondern etwas drunter gr.SetCursorPosition(((gr.CONSOLE_WIDTH - length) / 2 + j), i + 2); if (SUPERMAN_LOGO[i][j] == 'ö') { // Hintergrund vom Superman Logo soll gelb sein gr.WriteToBuffer('#', ConsoleAttribute.FG_YELLOW); } else { // Der Rest rot gr.WriteToBuffer(SUPERMAN_LOGO[i][j], ConsoleAttribute.FG_RED); } } } // Menüpunkt anzeigen for (int i = 0; i < menuAuswahl.Length; i++) { gr.SetCursorPosition((gr.CONSOLE_WIDTH - menuAuswahl[i].Length) / 2, (gr.CONSOLE_HEIGHT / 2) + i); if (selectedIndex == i) { // Die Frabe des ausgewählten Menüpunkts ändern gr.WriteToBuffer(menuAuswahl[i], ConsoleAttribute.FG_GREEN); } else { // Standard Farbe gr.WriteToBuffer(menuAuswahl[i], ConsoleAttribute.FG_WHITE); } } gr.DrawBufferToConsole(); // Menüabfrage ob hoch oder runter bewegt wird kInfo = Console.ReadKey(true); if (kInfo.Key == ConsoleKey.UpArrow && selectedIndex > 0) { selectedIndex--; if (selectedIndex == 3) { selectedIndex = 2; } else if (selectedIndex == 7) { selectedIndex = 6; } } else if (kInfo.Key == ConsoleKey.DownArrow && selectedIndex < (menuAuswahl.Length - 1)) { selectedIndex++; if (selectedIndex == 3) { selectedIndex = 4; } else if (selectedIndex == 7) { selectedIndex = 8; } } } while (kInfo.Key != ConsoleKey.Enter); switch (selectedIndex) { case 0: // Normal Game game = new Game(gr); game.Start(Spielmodus.Normal); break; case 1: // Endlos Game game2 = new Game(gr); game2.Start(Spielmodus.Endlos); break; case 2: // Hardcore Game game3 = new Game(gr); game3.Start(Spielmodus.Hardcore); break; case 3: break; case 4: // Highscore Normal Highscore highscore = new Highscore(gr, Spielmodus.Normal); highscore.Draw(); break; case 5: // Highscore Endlos Highscore highscore2 = new Highscore(gr, Spielmodus.Endlos); highscore2.Draw(); break; case 6: // Highscore Hardcore Highscore highscore3 = new Highscore(gr, Spielmodus.Hardcore); highscore3.Draw(); break; case 7: break; case 8: // Store Store store = new Store(gr); store.Draw(); break; case 9: // Werkeinstellungen ResetSettings(); break; case 10: Environment.Exit(0); break; } } }
/// <summary> /// Zeigt den Loginscreen auf der Konsole an /// </summary> public void Show() { while (!loggedIn) { gr.ClearBuffer(); // Positioniert die Überschrift mittig in der Konsole for (int i = 0; i < STAR_OF_THE_UNIVERSE_SMALL.Length; i++) { gr.WriteToBuffer((gr.CONSOLE_WIDTH - STAR_OF_THE_UNIVERSE_SMALL[i].Length) / 2, i + 5, STAR_OF_THE_UNIVERSE_SMALL[i], ConsoleAttribute.FG_GREEN); } // Positioniert das wort "Passwort: " zentriert in Abhängigkeit von der Passwortlänge * 2 gr.WriteToBuffer((gr.CONSOLE_WIDTH - ("Passwort: " + PASSWORD + PASSWORD).Length) / 2, (gr.CONSOLE_HEIGHT / 2) - 1, "Passwort: "); for (int i = 0; i < PASSWORD.Length; i++) { if (input.Length > i) { // Für jedes eingegebene Zeichen soll ein "*" angezeigt werden gr.WriteToBuffer("* "); } else { // Für jedes leere Zeichen soll ein "_" angezeigt werden gr.WriteToBuffer("_ "); } } // Schreibt den gesamten Buffer in die Konsole gr.DrawBufferToConsole(); ConsoleKeyInfo kInfo = Console.ReadKey(true); if (kInfo.Key == ConsoleKey.Backspace) { if (input.Length > 0) { // Das letzte Zeichen löschen input = input.Remove(input.Length - 1, 1); } } else if (input.Length < PASSWORD.Length && kInfo.KeyChar >= 33 && kInfo.KeyChar <= 126) { // neues Zeichen hinzufügen input += kInfo.KeyChar; } else if (kInfo.Key == ConsoleKey.Enter) { if (input == PASSWORD) { loggedIn = true; // Passwort richtig, gehe raus aus der Schleife } else { input = ""; } } else if (kInfo.Key == ConsoleKey.Escape) { Environment.Exit(0); } } }
/// <summary> /// Zeichnet den Store auf die Konsole /// </summary> public void Draw() { this.currentSelectionIndex = Settings.Default.SupermanAuswahl; ConsoleKeyInfo kInfo = new ConsoleKeyInfo(); do { gr.ClearBuffer(); // Zeichnet das "Store" Logo mittig oben for (int i = 0; i < STORE_LOGO.Length; i++) { // Offset 5 damit es nicht ganz oben am Rand ist sondern etwas drunter gr.WriteToBuffer((gr.CONSOLE_WIDTH - STORE_LOGO[i].Length) / 2, i + 5, STORE_LOGO[i], ConsoleAttribute.FG_YELLOW); } int xCenter = gr.CONSOLE_WIDTH / 2; int yCenter = gr.CONSOLE_HEIGHT / 2; gr.WriteToBuffer(xCenter - (preise.Length * 7 / 2) - "Preis: ".Length - 5, yCenter + 5, "Preis: "); // Geht durch jede Auswahl durch und Zeichne for (int i = 0; i < preise.Length; i++) { // 3x3 -> mit rand = 5x5 // abstand von 2 px -> 7x5 int xOffsetToLeft = (preise.Length / 2) - i; int x = (xCenter - 2) - (xOffsetToLeft * 7); DrawSupermanAt(x, yCenter, colors[i]); // Jeweiligen Preis anzeigen if (!GetAuswahlByIndex(i)) { gr.WriteToBuffer(x, yCenter + 5, preise[i], ConsoleAttribute.FG_YELLOW); } } // Zeigt an welche Farbe zurzeit aktiv ist int xAuswahl = (gr.CONSOLE_WIDTH / 2) - (((preise.Length / 2) - Settings.Default.SupermanAuswahl) * 7) - 1; gr.WriteToBuffer(xAuswahl - ("Aktiv".Length / 2), yCenter - 3, "Aktiv", ConsoleAttribute.FG_RED); // Zeichnet das gerade ausgewählte Item mit einem Rechteck DrawRectangle(); // Zeichnet die aktuelle Anzahl an Sternen string stars = Settings.Default.Stars.ToString(); gr.WriteToBuffer((gr.CONSOLE_WIDTH - "Sterne: ".Length - stars.Length) / 2, yCenter + 15, "Sterne: "); gr.WriteToBuffer(stars, ConsoleAttribute.FG_YELLOW); // Zeichnet die Animation DrawAnimation(); gr.DrawBufferToConsole(); if (!Console.KeyAvailable) { continue; } kInfo = Console.ReadKey(true); if (kInfo.Key == ConsoleKey.Enter) { bool auswahlFreigeschaltet = false; switch (currentSelectionIndex) { case 0: auswahlFreigeschaltet = Settings.Default.Superman1; break; case 1: auswahlFreigeschaltet = Settings.Default.Superman2; break; case 2: auswahlFreigeschaltet = Settings.Default.Superman3; break; case 3: auswahlFreigeschaltet = Settings.Default.Superman4; break; default: auswahlFreigeschaltet = Settings.Default.Superman5; break; } // Wenn schon freigeschaltet, dann nur auswählen, ansonsten Kaufen if (auswahlFreigeschaltet) { Settings.Default.SupermanAuswahl = currentSelectionIndex; Settings.Default.Save(); } else { // Prüfen ob genug "Sterne" vorhanden sind if (Settings.Default.Stars >= preise[currentSelectionIndex]) { // Kaufen Settings.Default.Stars -= preise[currentSelectionIndex]; Settings.Default.SupermanAuswahl = currentSelectionIndex; switch (currentSelectionIndex) { case 0: Settings.Default.Superman1 = true; break; case 1: Settings.Default.Superman2 = true; break; case 2: Settings.Default.Superman3 = true; break; case 3: Settings.Default.Superman4 = true; break; default: Settings.Default.Superman5 = true; break; } Settings.Default.Save(); } } } else if (kInfo.Key == ConsoleKey.RightArrow) { // Auswahlrechteck nach rechts bewegen if (currentSelectionIndex < preise.Length - 1) { currentSelectionIndex++; } } else if (kInfo.Key == ConsoleKey.LeftArrow) { // Auswahlrechteck nach links bewegen if (currentSelectionIndex > 0) { currentSelectionIndex--; } } } while (kInfo.Key != ConsoleKey.Escape && kInfo.Key != ConsoleKey.Backspace); }