Wprowadzenie do programowania gier na telefon w XNA  Udostępnij na: Facebook

Autor: Piotr Olejarz

Opublikowano: 2010-10-11

XNA to zestaw bezpłatnych narzędzi ułatwiających tworzenie gier przeznaczonych na różne platformy oferowane przez firmę Microsoft. Wraz z jego wydaniem osoby zainteresowane elektroniczną rozrywką zyskały możliwość łatwiejszego wdrażania swoich pomysłów w życie. Windows Phone 7 jest kolejną platformą wspieraną przez XNA. 

Po zapoznaniu się z informacjami zawartymi w tym artykule będziesz:

  • znał elementy i strukturę projektu XNA,
  • wiedział, jak wykorzystać mechanizmy zawarte w XNA.

Wprowadzenie

Tworzenie gier komputerowych nie jest łatwym zadaniem. Oprócz wiedzy programistycznej przydaje się także wiedza z wielu innych dziedzin, np. matematyki czy fizyki. Współczesne gry komputerowe to najczęściej duże projekty informatyczne składające się z setek różnych elementów, nad którymi trzeba jakoś zapanować. Umiejętne zarządzanie takim przedsięwzięciem jest więc również bardzo ważne.

XNA powstało w celu ułatwienia pracy nie tylko profesjonalnym twórcom gier, ale również hobbystom, którzy chcieliby przekuć swoje pomysły w gotową aplikację. Wraz z pojawieniem się Windows Phone 7 programiści uzyskali możliwość tworzenia gier w tym właśnie środowisku. Oznacza to, że jeśli już wcześniej miałeś kontakt z XNA, to pisanie gier na nową platformę nie powinno sprawić Ci żadnych problemów. Dzięki wsparciu dla XNA w Windows Phone 7 będziesz mógł także bardzo szybko przystosować swoje dotychczasowe projekty do nowego systemu.

Pierwsze kroki

Poznawanie XNA zaczniemy od przyjrzenia się strukturze podstawowego projektu. W tym celu uruchom Visual Studio 2010 i stwórz nowy projekt XNA. Następnie wybierz Windows Phone Game(4.0)  i nadaj swojemu projektowi jakąś nazwę. Visual Studio utworzy dla Ciebie całą niezbędną strukturę plików i folderów w następującej postaci:

Folder Properties zawiera informacje na temat Twojej aplikacji, zapisane w tzw. manifeście. Jego podstawowym zadaniem jest przechowywanie informacji na temat jej typu (XNA lub Silverlight) wykorzystywanych usługach systemowych, ścieżki do zasobów zewnętrznych, a także szeregu innych informacji potrzebnych podczas procesu weryfikacji w Marketplace. Kolejny ważnym folderem jest Content, w którym mieszczą się wszystkie zasoby Twojej gry, takie jak tekstury, modele, muzyka itp., a które następnie ładowane są wraz z jej uruchomieniem. XNA dostarcza bardzo pomocną funkcję pozwalającą na łatwiejsze zarządzanie tego typu zawartością, zwaną Content Pipeline. Podstawowym zadaniem tej funkcji jest odpowiednie przygotowanie zewnętrznych elementów gry, aby programista nie musiał martwić się o to, w jaki sposób załadować i odczytać ich zawartość. W praktyce oznacza to, że nie musisz pisać lub szukać odpowiednich bibliotek, które np. załadują i odczytają format .mp3.

Każdy nowo utworzony projekt XNA zawiera dwa pliki wypełnione podstawowym kodem C#. Pierwszy z nich to Program.cs, który zawiera metodę Main() wykonywaną zaraz po uruchomieniu gry. Jak już zapewne  zauważyłeś, cały kod znajduje się pomiędzy dyrektywą #if WINDOWS || XBOX … #endif, co oznacza, że zostanie on skompilowany tylko wtedy, gdy pisana przez nas gra będzie uruchamiana w systemie Windows lub na konsoli Xbox. Jak więc Windows Phone 7 znajduje punkt startowy w Twoim programie, skoro nie ma w nim metody Main()? Podczas uruchamiania aplikacji system szuka w niej klasy, która dziedziczy z Microsoft.Xna.Framework.Game. W projekcie, który właśnie stworzyłeś, podstawowa implementacja tej klasy znajduje się w pliku Game1.cs . Oczywiście, w każdej chwili możesz zmienić jej nazwę, ponieważ – tak jak wcześniej wspomniałem – liczy się tylko to, aby główna klasa dziedziczyła z klasy Game.

Budowa klasy Game

Klasa Game składa się z siedmiu podstawowych metod, wykonywanych w następującej kolejności:

  1. Game1()
  2. Initialize()
  3. LoadContent()
  • Update()
  • Draw()
  1. UnloadContent()

Dodatkowo klasa zawiera następujące atrybuty: graphics typu GraphicsDeviceManager i spriteBatch typu SpriteBatch.   

Podczas tworzenia obiektu wywoływany jest jego konstruktor – w naszym przypadku będzie to Game1(). Oprócz zainicjalizowania atrybutu graphics, konstruktor ustawia także główny katalog z zewnętrzną zawartością gry i czas kolejnych wywołań, tzw. pętli gry. Jeśli nigdy wcześniej nie tworzyłeś żadnej gry, należy Ci się kilka słów wyjaśnienia na temat tego, czym jest pętla gry. Zapewne nie raz zdarzyło Ci się pisać program, który po wprowadzeniu jakichś danych lub wciśnięciu przycisku wykonywał jakąś operacje. Taki program czekał na zewnętrzne zdarzenie wywołane przez użytkownika. Gry komputerowe są bardziej dynamiczne. Aby wyświetlić animacje i ruch obiektów, niezbędne jest ciągłe odświeżanie informacji na temat ich położenia. Operacje te są wykonywane cykliczne, a zdarzenia generowane przez gracza mogą  mieć na nie dodatkowy wpływ, np. gdy ruch obiektu sterowanego przez gracza wymaga, aby gra sprawdziła, czy nie zaszła kolizja z innym obiektem. Pętla gry jest więc zbiorem cyklicznie powtarzanych czynności, które odpowiadają za symulację świata gry.

Kolejny etap to inicjalizacja i załadowanie zewnętrznych zasobów gry za pomocą metod Initialize() i LoadContent(). W pierwszej z nich możesz przygotować wszystkie niegraficzne elementy gry, np. ścieżkę audio. Wszystkie elementy graficzne Twojej gry powinieneś ładować w metodzie LoadContent(). Dodatkowo metoda ta tworzy obiekt typu SpriteBatch, który odpowiada za rysowanie umieszczonych w nim sprite’ów.

Na tym etapie kończy się procedura uruchamiania i inicjalizacji. Od teraz metody Update() i Draw() będą wywoływane cyklicznie, aż do zakończenia gry. Jak w przypadku dwóch wcześniej omawianych metod, tak i tu występuje pewien podział ról. Metoda Update() zawiera logikę Twojej gry. To właśnie w niej powinieneś umieścić funkcje odpowiedzialne za zarządzanie stanem gry i przetwarzaniem zdarzeń generowanych przez gracza. Metoda Draw() odpowiada za rysowanie wszystkich obiektów wyświetlanych na ekranie telefonu. Obie metody stanowią omawianą wcześniej pętlę gry. Kiedy piszesz grę, staraj się, aby kod zawarty w metodzie Update() był odpowiednio wydajny. Unikaj wielokrotnego tworzenia obiektów i tablic, gdyż może to znacząco odbić się na czasie wykonania całej metody, a tym samym spowodować efekt zacinania się gry.  

Ostatnia z metod wywoływana jest w chwili zamykania gry i odpowiada za usunięcie z pamięci wszystkich zasobów, jakie zostały załadowane podczas startu gry.            

Podsumowanie

XNA to platforma, która daje Ci wiele możliwości. W połączeniu z Windows Phone Marketplace i Xbox Live możesz stworzyć gry, które będą łączyły w sobie elementy znane z konsoli, z możliwością wirtualnej zabawy w każdym miejscu. Dzięki uniwersalności XNA przeniesienie projektu np. na konsolę Xbox jest o wiele prostsze. Możesz sprawić, by gracz, zaczynający zabawę z Twoją grą podczas podróży autobusem, po powrocie do domu mógł ją kontynuować na swojej konsoli.

kolejnego artykułu na temat XNA dowiesz się, jak łatwo można stworzyć prostą grę przy użyciu tego środowiska.