Tworzenie gry w C# z użyciem silnika Ogre - cz.1
09.08.2010 - Mateusz Osowski
![]() ![]() Tworzymy kod!
Zacząć musimy od klasy
![]() Typem nowego elementu będzie klasa, a nazwa pliku to Engine.cs.
Silnik gry jako taki powinien istnieć tylko jeden na grę. Do ograniczania ilości instancji danej klasy służy wzorzec projektowy singleton. Zaimplementujmy go więc, zanim przejdziemy do pisania właściwych metod. Co powinien singleton?
Zacznijmy tworzyć zawartość pliku Engine.cs. Aby zapobiec możliwości dziedziczenia po klasie
Aby zapobiec ręcznemu tworzeniu więcej niż jednego obiektu, wystarczy konstruktor uczynić prywatnym - wtedy można go wywołać jedynie wewnątrz samej klasy.
Istnieć powinna jedna instancja, tworzona tylko raz w trakcie działania aplikacji. Pomocny jest statyczny konstruktor - wywołać się może on tylko raz w trakcie działania programu (w trakcie istnienia AppDomain z nim związanym). Wywoływany jest w momencie pierwszego wywołania statycznej metody klasy. W tym właśnie statycznym konstruktorze utworzymy sobie jedyną instancję singletonu.
Przejdźmy do inicjalizacji silników. Wróć na początek pliku. Najpierw w sekcji
Następnie przejdź do klasy Engine i dodaj do niej pola:
Jak widzisz, w C# nazwy instancji mogą być takie same jak nazwy klas. Kiedy nazwa jest naturalna - nie ma sensu na siłę wymyślać innej. Przejdźmy do metody inicjującej silniki. W C# przyjęło się tworzyć metody pod wszystkimi polami. Pamiętaj o tym dopisując nowe pola do klasy. Najpierw, stwórzmy główny obiekt Ogre - Root. Obiekt klasy ConfigFile wczyta zawartość pliku Resources.cfg. Drugim parametrem jest lista znaków speratorów, które mogą oddzielać nazwę typu zasobu od ścieżki do niego.
Na stępnie musimy przekazać informacje wczytane z pliku do silnika. Robimy to iterując po sekcjach pliku, a następnie po parach typ-ścieżka w tych sekcjach. Silnik informowany jest o katalogach poprzez
Teraz możemy przejść do wczytania konfiguracji wyświetlania silnika. Domyślnie wyświetlane będzie okienko konfiguracyjne, w którym użytkownik może wybrać renderer i jego ustawienia. Ogre zapamiętuje te ustawienia w pliku ogre.cfg, dzięki czemu przy następnym uruchomieniu użytkownik nie będzie o nie pytany.
Po skonfigurowaniu silnika tworzymy obiekt okna i inicjujemy zasoby. Parametr funkcji Initialise mówi, czy silnik ma automatycznie utworzyć okno, czy też chcemy zając się tym sami. Druga linijka nakazuje menadżerowi grup zasobów analizę zawartości podanych wcześniej ścieżek. Silnik zapamięta informacje o teksturach, modelach (lecz je same załaduje dopiero gdy będą potrzebne), sparsuje skrypty i skompiluje shadery, jeżeli na takowe natrafi w podanych katalogach.
Kolejno, potrzebujemy otworzyć menadżera sceny o przeznaczeniu ogólnym oraz kamerę. Przydzielamy kamerę do prostokąta pokrywającego domyślnie całe okno. Możesz utworzyć większą ilość Viewport - tak uzyskuje się efekt split screen. Dodatkowo określamy przedział, w którym znajdujące się modele kamera będzie widzieć.
Kolejne cztery linijki mają charakter czysto techniczny. Musimy bowiem przygotować listę parametrów potrzebnych do stworzenia menadżera urządzeń wejścia, która de facto składa się tylko z uchwytu do okna utworzonego przed chwilą.
Tworzymy wspomniany menadżer, po czym przystępujemy do zainicjowania obiektów klawiatury i myszki. Parametry false oznaczają, że wejście nie będzie buforowane. Nie będziemy bowiem używać wywołań zwrotnych dla zdarzeń wejścia.
Ostatnią rzeczą, która pozostała nam do stworzenia jest świat Newtonowski. Tworzy się go bardzo prosto. Tworzymy także NewtonDebugger.
Napiszmy metodę
Przejdźmy teraz do pliku Program.cs i utwórzmy prostą pętlę gry: W każdym przebiegu pętli aktualizujemy stan gry, a w przypadku naciśnięcia klawisza Esc wychodzimy z pętli.
Możesz uruchomić grę. Twoim oczom powinno ukazać się okienko konfiguracyjne Ogre. Ustaw synchronizację pionową (Vsync) na Yes, by ograniczyć ilość wyświetlanych klatek do częstotliwości odświeżania ekranu (zazwyczaj 60Hz). Warto też testować grę w trybie okienkowym (Fullscreen - No).
![]() Po zatwierdzeniu opcji silnik powinien renderować czarny ekran i zakończyć pracę po wciśnięciu Escape. Możesz pobrać projekt w aktualnym stanie: Bardzo ważne:
Jeżeli podczas próby uruchomienia aplikacji środowisko informuje o niezłapanym wyjątku FileLoadException lub występuje inny błąd upewnij się, że kompilujesz projekt dla architektury x86, ponadto katalog wskazany we właściwościach projektu jako "Working Directory" powinien zawierać:
W swoim systemie powinny być zainstalowane:
(8 ocen) |
Copyright © 2008-2010 Wrocławski Portal Informatyczny
design: rafalpolito.com