Microsoft XNA, część 1
10.05.2010 - Marcin Oczeretko
Na koniec uporządkujmy trochę nasz kod. Nieelegankim i niepraktycznym rozwiązaniem byłoby stworzenie całej gry za pomocą jednej tylko klasy Game1. Dodajmy dwie klasy do naszego projektu - będą one reprezentowały odpowiednio gracza i piłkę. Dzięki temu kod zyska na przejrzystości i łatwiej będzie nam go rozwijać. W Solution Explorer klikamy na nasz projekt prawym przyciskiem myszy i następnie: Add New Item...
Wybieramy: Categories: XNA Game Studio 3.1 (różowy) Templates: Game Component (zielony) Name: Player.cs (niebieski) Zatwierdzamy te ustawienia i w efekcie do naszego projektu dołącza nowy plik Player.cs. Zawiera on klasę Player, która dziedziczy po GameComponent. W związku z tym, że nasz gracz będzie rysowany na ekranie, zmieńmy jego nadklasę na DrawableGameComponent. Obiekty dziedziczące po GameComponent (DrawableGameComponent też zwyczajnie ją rozszerza), można dodawać do kolekcji Components obiektu Game, dzięki czemu ich metody (takie jak LoadContent() lub Update()) wywoływane będą w odpowiednich ku temu momentach. Podczas wywołania LoadContent(), Update(), Draw() i UnloadContent() klasy Game przeglądana jest cała kolekcja obiektów Components i na każdym z nich wywoływane są odpowiednie metody. Możemy zatem napisać własne wersje tych metod, dzięki czemu nasze klasy będą zachowywać się w pożądany przez nas sposób. Wykorzystajmy tę wiedzę, aby przenieść cały kod dotyczący postaci gracza do klasy Player. Usuń wszystko, co dotyczy gracza z klasy Game1. Teraz dodajmy pole w klasie Game1:
A w konstruktorze klasy Game1 dopiszmy:
Abyśmy mogli skorzystać z obiektu spriteBatch również w innych klasach niż w Game1 umieścimy go w specjalnym "pojemniku" - GameServiceContainer. Dzięki temu będziemy mogli użyć go w każdym miejscu kodu, czyli w szczególności wtedy, gdy zapragniemy narysować na ekranie postać gracza. Przepisz poniższą linijkę do metody LoadContent() klasy Game1:
Dodajmy do tej metody jeszcze odwołanie do metody LoadContent() w nadklasie. Całość powinna wyglądać tak:
Ostatnią modyfikacją w klasie Game1 będzie usunięcie rysowania gracza i zamiana miejscami dwóch wierszy - wywołania spriteBatch.End() i base.Draw(). Dzięki temu rysowanie w obiektach z Components wykona się zanim wywołana zostanie metoda spriteBatch.End().
W klasie Player wpisujemy praktycznie to samo, co znajdowało się wcześniej w Game1. Powinniśmy otrzymać w efekcie coś takiego: Pokaż/ukryj kod klasy Player
Chyba jedynymi fragmentami wymagającymi komentarza są linijki , i oraz . Zatem: W linijce odwołujemy się do Content należącego do klasy Game1. Dlatego też pojawia się tam Game.Content.Load() zamiast po prostu Content.Load() (bo to było dopuszczalne tylko wewnątrz klasy Game1). Wiersze i to pobranie obiektu spriteBatch z "pojemnika", w którym go wcześniej umieściliśmy. Dla większej elegancji, w linijce pozbywamy się wprost zasobu (w tym wypadku obrazka), który uprzednio załadowaliśmy. Dodaj analogiczny kod dla obiektów Texture2D w klasie Game1. I to już wszystko, co należało uczynić, by przenieść całą logikę obsługi postaci gracza do osobnej klasy. Postępując analogicznie, stwórz klasę Ball i przenieś do niej wszystko, co odnosi się do piłki. Pobierz kod, z którym kończymy ten artykuł (w tym klasę Ball).
(4 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com