Systemy wirtualnej rzeczywistości Podstawy XNA
Transkrypt
Systemy wirtualnej rzeczywistości Podstawy XNA
Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych Systemy wirtualnej rzeczywistości Laboratorium Podstawy XNA Wstęp: Niniejsza instrukcja stanowi wstęp do programowania 3-wymiarowych środowisk czasu rzeczywistego. W trakcie kilku kolejnych laboratoriów zostanie napisana aplikacja 3D zawierająca wybrane podstawowe techniki tworzenia gier komputerowych i środowisk rzeczywistości wirtualnych (m.in. podstawy renderingu 3D w czasie rzeczywistym, sterowanie i wykrywanie kolizji). Aplikacja będzie prostym symulatorem czołgu widzianego z perspektywy trzeciej osoby. Użytkownik będzie miał możliwość kontrolowania zachowania czołgu (jazda w przód i w tył, obrót korpusu oraz obrót wieżyczki). Czołg będzie poruszał się po ograniczonym płaskim terenie. Dodatkowo w scenie rozmieszczone będą przeszkody w postaci skrzyń blokujących przejazd. Wszystkie modele i tekstury dołączone są do instrukcji. Niniejsza instrukcja jest jedynie wstępem do programowania aplikacji 3D czasu rzeczywistego i wiele aspektów przedstawia w bardzo uproszczony sposób. Niektóre powszechnie znane i dostępne w oddzielnych publikacjach zagadnienia zostały opisane fragmentarycznie lub pominięte. Będą one zaznaczone w tekście i zaleca się ich głębsze poznanie. W pierwszej części przedstawione zostanie środowisko Visual Studio C# 2008 Express Edition wraz z XNA Game Studio 3.0. Pokazane zostaną mechanizmy wczytywania zawartości (tekstury, modele, itp.) i generowania prostej grafiki 2D. 1. Nowy projekt i podstawy XNA Aby rozpocząć pracę nad aplikacją należy stworzyć nowy projekt (File->New Project). Jako szablon wybieramy Windows Game (3.0) i nadajemy mu odpowiednią nazwę (np. Tank). Stworzony w ten sposób projekt zawiera podstawowe mechanizmy, takie jak główna pętla, tworzenie okna, ustawianie urządzenia renderującego, itp.. Poniżej znajduje się krótkie omówienie najważniejszych metod klasy Game: 1 protected override void Initialize() { // TODO: Add your initialization logic here base.Initialize(); } Metoda Initialize wywoływana jest po konstruktorze klasy Game ale przed LoadContent. Służy do inicjowania niegraficznych elementów gry. Zwykle umieszcza się tu kod związany z inicjalizacją logiki gry. protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); // TODO: use this.Content to load your game content here } W tej metodzie umieszcza się ładowanie tekstur, modeli, itp.. protected override void Update(GameTime gameTime) { // Allows the game to exit if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed) this.Exit(); // TODO: Add your update logic here base.Update(gameTime); } Metoda Update służy do aktualizacji stanu gry – obsługa kontrolerów (myszy, klawiatury, pada...), sztuczna inteligencja, kolizje, itp.. protected override void Draw(GameTime gameTime) { graphics.GraphicsDevice.Clear(Color.CornflowerBlue); // TODO: Add your drawing code here base.Draw(gameTime); } Metoda Draw służy do rysowania na ekranie. Tutaj umieszcza się kod związany z renderingiem obiektów, wyświetlaniem obrazów, czcionek, itp.. Metody Update i Draw wywoływane są z różną częstotliwością w zależności od wartości parametru IsFixedTimeStep. 2 2. Wczytanie obrazu z pliku i wyświetlenie go na ekranie XNA dysponuje wygodnym mechanizmem ładowania treści (tj. obrazów, modeli, dźwięków, itd.). Domyślnie zawiera importery do większości najpopularniejszych typów plików, m.in. BMP, JPG, FBX, X, itd.. Naszym pierwszym celem będzie wczytanie obrazu z pliku i wyświetlenie go na ekranie. Ten obraz posłuży nam później jako tekstura terenu, po którym poruszał się będzie czołg. Pierwszym krokiem jest dodanie pliku do projektu. Do katalogu Content naszego projektu kopiujemy plik trawa.tga dołączony do niniejszej instrukcji. Następnie dodajemy go do projektu poprzez polecenie Add->Existing Item... (rys. 1). Rys. 1 - Dodawanie zawartości Żeby móc wczytać obraz lub inne dane musimy najpierw zadeklarować obiekt, w którym będziemy go przechowywać. Odpowiednim dla nas typem będzie Texture2D. A zatem w klasie głównej naszej gry deklarujemy obiekt o nazwie trawa: Texture2D trawa; Następnie umieszczamy w metodzie LoadContent polecenie ładowania: trawa = Content.Load<Texture2D>("trawa"); Kolejnym krokiem będzie wyświetlenie obrazu na ekranie. Z pomocą przychodzi obiekt SpriteBatch, który umożliwia rysowanie grupy sprite’ów przy tych samych parametrach rysowania. Przechodzimy do metody Draw naszej gry. Zaczynamy od wywołania metody Begin obiektu SpriteBatch, która rozpoczyna proces rysowania. Ustawia ona parametry urządzenia. Jako parametr wejściowy można podać własne ustawienia mieszania, sortowania, itd.. My pozostaniemy przy ustawieniach domyślnych i wywołamy metodę Begin bez żadnych parametrów. Następnie wyrysowujemy potrzebne elementy. W naszym przypadku jest to jeden obrazek. Na końcu deklarujemy koniec rysowania poprzez wywołanie metody End. Rozpoczynać i kończyć rysowanie można wiele razy w jednej klatce ale zaleca się grupowanie rysowania dla danych ustawień. spriteBatch.Begin(); spriteBatch.Draw(trawa, new Vector2(0.0f, 0.0f), Color.White); spriteBatch.End(); 3 Po skompilowaniu i uruchomieniu powinniśmy uzyskać obraz jak na rys. 2. Rys. 2 - Wyrysowanie obrazu 2D 4