vx7.pl - hacking / coding / vx | Poland |

 Gra komputerowa Roguelike w języku C# (MonoGame)

Napisane  29 listopada 2018 godz. 18:25 przez  Dawid_vx7

1. Słowem wstępu

Gatunek gier komputerowych określanych jako Roguelike zapoczątkowała gra o nazwie Rogue. Jest to produkcja z lat '80, która ma cechy gatunku RPG i polega m.in. na przemierzaniu lochów, zabijaniu potworów i rozwijaniu swojej postaci. Gra wyróżnia się głównie tym, że zamiast typowej grafiki, do przedstawienia świata korzysta z trybu tekstowego w którym wyświetla znaki ASCII. Mechanizmy gry luźno bazują na systemie D&D, a cały świat w grze cechuje duża losowość - większość rzeczy jest generowana na bieżąco.

2. Interfejs prezentowanego projektu Roguelike


Rysunek 2.1. Ekran powitalny gry Roguelike w C# (MonoGame)


Rysunek 2.2. Ekran rozgrywki w grze Roguelike w C# (MonoGame)

3. Potrzebne narzędzia

W dalszej części tekstu przedstawiono tworzenie prototypu gry z gatunku Roguelike w języku C# za pomocą MonoGame. Prezentowany projekt został stworzony w środowisku programistycznym Visual Studio.
Do zbudowania projektu potrzebne są:

  • Podstawowa znajomość języka C# (CSharp)
  • Środowisko Visual Studio (najlepiej 2017 lub nowsze)
  • Biblioteka MonoGame

4. Tworzenie nowego projektu

Po zainstalowaniu środowiska Visual Studio należy pobrać najnowszą wersję MonoGame, które można znaleźć na stronie:
http://www.monogame.net/downloads/
Nowy projekt w Visual Studio tworzy się wybierając z górnego menu odpowiednio:
File » New » Project.... W oknie New Project rozwijając kontrolkę widoku drzewa, w gałęzi Visual C# powinna być pozycja MonoGame.
Po zaznaczeniu jej na środku okna pojawi się lista rodzajów projektów do wyboru. Szablon projektu o nazwie MonoGame Windows Project to aplikacja dla pulpitu Windows. Do wyboru jest też m.in. Aplikacja Uniwersalna Windows 10 czy projekt na system Android. Gra prezentowana w tym artykule to projekt dla pulpitu Windows (rysunek 4.1).


Rysunek 4.1. Tworzenie nowego projektu gry dla pulpitu Windows (C#/MonoGame)

5. Główna klasa gry (Microsoft.Xna.Framework.Game)

W oknie widoku rozwiązań o nazwie Solution Explorer (w Visual Studio) można zobaczyć utworzoną strukturę projektu. Na samym początku warto zapoznać się z główną klasą gry, która w moim przypadku znajduje się w pliku Game1.cs (rysunek 5.1).


Rysunek 5.1. Struktura projektu gry Roguelike (C#/MonoGame)

Klasa Game1 dziedziczy po klasie bazowej o nazwie Game, która pochodzi z przestrzeni nazw Microsoft.Xna.Framework. Jest tak, gdyż MonoGame w założeniach ma implementować framework o nazwie XNA stworzony przez firmę Microsoft.

Przyglądając się poszczególnym metodom w klasie gry można zauważyć, że posiadają one dość opisowe komentarze do czego służą. Postaram się jednak krótko to opisać.

W przypadku gry Roguelike czcionki możemy załadować w metodzie LoadContent(). Metoda Update(GameTime gameTime) służy do wykonywania (aktualizacji) logiki gry, a Draw(GameTime gameTime) ma za zadanie rysowanie wszystkiego na ekranie. Zatem w prostych słowach np. w Update zmieniamy pozycję gracza, a w Draw rysujemy go na ekranie.

5.1. Importowanie potrzebnych czcionek

Przedstawienia wymaga na pewno wczytywanie czcionek, które chcemy używać w tworzonej grze. Należy w oknie widoku rozwiązań (Solution Explorer) rozwinąć folder Content i kliknąć prawym przyciskiem myszy na plik Content.mgcb, i wybrać Open With... (otwórz za pomocą). W oknie, które się pojawi należy wybrać z listy MonoGame Pipeline Tool i kliknąć OK.

Dalej, aby załadować czcionkę, którą chcemy używać w grze, należy postępować jak na rysunkach 5.2 oraz 5.3. Po wybraniu Open With... jak na rysunku 5.3 pojawi się okno wyboru programu w jakim ma zostać otwarty plik *.spritefont. Najlepiej jest wybrać zwykły edytor tekstowy np. systemowy Notatnik lub Notepad++.


Rysunek 5.2. Tworzenie nowego pliku SpriteFont (C#/MonoGame)


Rysunek 5.3. Otwieranie pliku SpriteFont za pomocą określonego edytora (C#/MonoGame)

Po otworzeniu w edytorze pliku *.spritefont można łatwo zauważyć, że jest to dokument w formacie XML i zawiera informacje o załączanej czcionce. Zatem, jeśli się zmieni <FontName>Arial</FontName> na przykład na <FontName>Consolas</FontName> i zapisze zmiany w pliku, to załączona zostanie czcionka Consolas. Bardziej nadaje się ona do gry Roguelike, gdyż ma stałą szerokość znaków.

Po edycji parametrów czcionki SpriteFont należy pamiętać o zapisaniu zmian w pliku *.spritefont oraz w oknie MonoGame Pipeline Tool wybierając z górnego menu File » Save....

5.2. Wyświetlanie tekstu w oknie

Mając utworzony odpowiedni plik *.spritefont, można teraz dopisać nowe pole typu SpriteFont na górze klasy Game1 oraz załadować czcionkę w metodzie LoadContent().
Przedstawiono to na rysunku 5.4.


Rysunek 5.4. Kod ładujący czcionkę z pliku do użycia w grze (C#/MonoGame)

Wyświetlanie tekstu nie jest skomplikowane. Ogranicza się głównie do wywołania metody DrawString na obiekcie spriteBatch.

Poniżej przedstawiono metodę Draw() zawierającą kod rysujący napis w oknie gry:

protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(); spriteBatch.DrawString(font, "Hello ASCII World!", new Vector2(100, 100), Color.Lime); spriteBatch.End(); base.Draw(gameTime); }

Powyższy kod zawiera po kolei:

  • Wyczyszczenie ekranu używając czarnego koloru (GraphicsDevice.Clear(Color.Black);)
  • Rozpoczęcie rysowania (spriteBatch.Begin();)
  • Narysowanie w oknie napisu na pozycji (100, 100) kolorem limonkowym (spriteBatch.DrawString(...))
  • Zakończenie rysowania (spriteBatch.End();)
  • Wywołanie metody bazowej (base.Draw(gameTime);)

Teraz po uruchomieniu gry w środowisku Visual Studio (górne menu: Debug » Start Debugging), jeśli wszystko zostało poprawnie wykonane, to na ekranie powinien wyświetlić się napis Hello ASCII World! podobnie jak na rysunku 5.5.


Rysunek 5.5. Wyświetlenie napisu za pomocą metody DrawString (C#/MonoGame)

6. Postać gracza

Po zapoznaniu się z metodą rysowania dowolnych znaków ASCII na ekranie. Można spróbować wyświetlić postać gracza — w grach roguelike jest to przeważnie znak @. Wystarczy odpowiednio zmodyfikować kod podany w poprzednim podrozdziale.

Jeśli chcemy obsłużyć poruszanie się bohatera gry po ekranie (a poźniej po mapie) , to należy wykryć wciśnięcie odpowiednich klawiszy (tutaj klawiszy strzałek). Powinno to zostać wykonane w metodzie Update(GameTime gameTime) klasy Game1.

Wykrycie wciśnięcia określonego klawisza na klawiaturze można wykonać za pomocą metody IsKeyDown(...) klasy KeyboardState. W tym projekcie będzie jednak lepiej, jeśli wykryje się wciśnięcie oraz zwolnienie klawisza.

KeyboardState oldState; // Zmienna globalna //(...) var state = Keyboard.GetState();// Zmienna lokalna w metodzie Update if (oldState.IsKeyDown(Keys.Left) && state.IsKeyUp(Keys.Left)) { // Tutaj kod wykonywany po wciśnięciu i zwolnieniu klawisza strzałki w lewo // Aby zmienić pozycję gracza, należy tutaj zmienić współrzędną X }


7. Gra Roguelike w C# (MonoGame) — kod źródłowy

Pełny kod źródłowy projektu Roguelike możesz pobrać na:
https://github.com/vx7pl/RoguelikePrototype

Tagi: 


Wszystkie treści, kody źródłowe i programy umieszczone na portalu vx7.pl są chronione prawem autorskim. Surowo zabronione jest kopiowanie i rozpowszechnianie zawartości tej witryny bez zgody autora. Wszelkie materiały opublikowane na portalu vx7.pl służą jedynie celom edukacyjnym. Autorzy portalu vx7.pl i materiałów umieszczanych na nim nie biorą odpowiedzialności za niewłaściwe wykorzystanie udostępnionych zasobów. Nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania zasobów zawartych w witrynie. Osoby zarządzające portalem vx7.pl zastrzegają sobie prawo do usunięcia wpisów opublikowanych przez użytkowników bez podania przyczyny. Wszelkie znaki towarowe i nazwy zastrzeżone zostały użyte jedynie w celach informacyjnych i należą wyłącznie do ich prawnych właścicieli. Korzystając z zasobów portalu vx7.pl oświadczasz, że akceptujesz powyższe warunki.