Posts Tagged ‘xna’

Podstawowa pętla gry

poniedziałek, Sierpień 2nd, 2010

Operacje wykonywane w grach komputerowych przetwarzane są pętlach. W technologii XNA, specjalnie stworzonej do tworzenia gier, uporządkowano ten proces, porządkując logicznie wielość wykonywanych operacji w czasie tak, aby pewne metody uruchamiały się w tej samej kolejności tworząc jakby jeden obieg. Taki obieg w XNA 3.1 przedstawia się następująco (poniżej dodaję też przykłady kodu):

1. Główna aplikacja (Main) uruchamia konstruktor Gry
(klasy dziedziczącej po klasie Game).

        static void Main(string[] args)
        {
            using (GameXna game = new GameXna()) // 1. tutaj
            {
                game.Run(); // od 3. tutaj
            }
        }

2. Konstruktor gry tworzy komponenty gry i uruchamia ich konstruktory
(konkretnie to my jako programiści je dostarczamy implementując klasy dziedziczące po GameComponent i dodając je w konstruktorze do kolekcji Components naszej gry).

        public GameXna()
        {
            this.graphics = new GraphicsDeviceManager(this);
            this.Content = new ContentManager(Services);
            this.GameObjectManager = new GameObjectsManager();

            Content.RootDirectory = "Content";
#if DEBUG
            fps = new FPS(this); //2.tutaj
            Components.Add(fps);
#endif
            input = new InputHandler(this); //2.tutaj
            Components.Add(input);

            camera = new FirstPersonCamera(this); //2.tutaj
            Components.Add(camera);
            //itd.
        }

3. XNA uruchamia metodę Initialize z głównej klasy Gry.

        protected override void Initialize()
        {
            //3. tutaj (tworzymy podstawowe elementy, obiekty gry)
            base.Initialize(); //tutaj punkt 4.
        }

4. XNA uruchamia metodę Initialize z każdego zarejestrowanego komponentu gry.
(Musimy wywołać base.Initialize() powyżej)
5. XNA uruchamia metodę LoadGraphicsContent każdego zarejestrowanego „rysującego się” komponentu.
(Komponenty mogą dziedziczyć bezpośrednio po klasie DrawableGameComponent. Zwyczajowo w tej metodzie dodaje się tekstury, modele itp.)
6. Framework XNA uruchamia metodę LoadGraphicsContent.

        protected override void LoadGraphicsContent(bool loadAllContent) //6.tutaj
        {
            texture = Content.Load<Texture2D>("Textures\\obraz");
            if (loadAllContent)
            {
                this.GameObjectManager.GetObject("car").Model = Content.Load<Model>("Models\\ford");
            }
        }

7. Framework XNA uruchamia metodę LoadContent

        protected override void LoadContent() // 7.tutaj
        {
            // tworzymy SpriteBatch do rysowania tekstur
            spriteBatch = new SpriteBatch(GraphicsDevice);

        }

8. Framework XNA uruchamia metodę BeginRun()
9. Framework XNA uruchamia metodę Update.

        protected override void Update(GameTime gameTime) //9.tutaj
        {
            //umożliwia wyjście z gry;]
            if (GamePad.GetState(PlayerIndex.One).Buttons.Back == ButtonState.Pressed)
            {
                this.Exit();
            }
            //tutaj jest miejsce na logikę gry
            base.Update(gameTime); //10.tutaj
        }

10. Framework XNA uruchamia metodę Update każdego zarejestrowanego komponentu.
(Musimy uruchomić base.Update z powyższego punktu)
11. Framework XNA uruchamia metodę Draw.
(Właściwie to każda taka metoda poprzedzana jest uruchomieniem metod BeginDraw i EndDraw, które też możemy oprogramować!)
12. Framework XNA uruchamia metodę Draw każdego zarejestrowanego „rysującego się” komponentu.
13. Framework XNA przechodzi do punktu 9.
14. Jeśli utracimy połączenie z urządzeniem, wtedy Framework XNA uruchamia metodę UnloadGraphicsContent.
(Utrata połączenia z urządzeniem (dostępu do device) może być spowodowana np. próbą przesunięcia okna gry na inny monitor, zmianą rozdzielczości, zminimalizowaniem okienka itp.)
15. Jeśli urządzenie jest zresetowane, wtedy Framework XNA przechodzi do punktu 6.
16. Gracz wychodzi z gry i XNA Framework uruchamia wtedy metodę EndRun
(Przy okazji wychodzenia z gry przed metodą EndRun „leci” zdarzenie OnExiting, które też możemy nadpisać)
17. Framework XNA uruchamia metodę Dispose gry.
18. Metoda Dispose uruchamia Dispose klasy bazowej, co powoduje, że…
19. Framework XNA uruchamia metodę Dispose każdego zarejestrowanego komponentu.
20. Framework XNA uruchamia metodę UnloadGraphicsContent gry.
21. Metoda Dispose gry przywraca spowrotem swój focus i gra się kończy.

I w zasadzie tyle:) Oczywiście są jeszcze pewne zdarzenia, które możemy zwyczajowo nadpisać, takie jak: OnActivated, OnDeactivated czy OnExiting, lecz nie jest tego już dużo (wszystkie możliwości ładnie podpowie nam Visual Studio po wpisaniu ‘public override’ i wciśnięciu spacji). Przede wszystkim jednak właściwie wszystko można ładnie obsłużyć dodając pewne nowe funkcjonalności do gry w postaci komponentów gier, które po umieszczeniu w kolekcji Components w konstruktorze gry… same się aktualizują wewnątrz głównej pętli (jak widać powyżej). Póki co u mnie takimi komponentami są FPS do wyświetlania szybkości działania gry, InputHandler do obsługi stanów klawiatury oraz myszki (można też obsłużyć „Pada”) oraz FirstPersonCamera do obsługi kamery z poziomu użytkownika. A wszystko to ładnie dodane i oprogramowane w oddzielnej bibliotece, z której korzysta mój projekt gry. Taka koncepcja naprawdę dobrze rokuje, a na dodatek przyśpiesza proces tworzenia gry od początku – mamy wszystko to czego potrzeba do szkieletu gry dostarczone wprost z frameworka XNA i nie musimy sami praktycznie niczego już pisać:)

Start w konkursie i start projektu gry komputerowej

niedziela, Sierpień 1st, 2010

Wiele się słyszy o światku programistów gier komputerowych. Jeszcze (nie) tak dawno temu sam przesiadywałem przed komputerem w roli zapalonego gracza, zafascynowanego stworzonym przez grafików, projektantów i programistów światem wirtualnym. Godzinami, dniami, a nawet miesiącami grałem w takie tytuły jak Dungeon Keeper, Dungeon Keeper 2, Team Hospital, Mortal Kombat 1-4, Quake 1-3, Ureal Tournament, Motoracer 1-2… bo to były naprawdę niezłe gry! Do niedawna niewiele robiłem też w kierunku poznania tego świata bliżej, aż wreszcie postanowiłem napisać własną grę komputerową;) Ponieważ zgodnie z wcześniejszymi zapowiedziami…startuję też w konkursie pt. „Daj się poznać” http://www.maciejaniserowicz.com/page/Konkurs-daj-sie-poznac.aspx (ciągle trwa rejestracja!), to można liczyć na to, że moje zmagania i postępy opisywał będę na łamach tego bloga znacznie częściej niż robiłem to dotychczas (czyt. mininmum 2 razy w tygodniu). I niczym od zera… dotrzeć do gier kodera:).

Jak powszechnie wiadomo, do tworzenia gier komputerowych wykorzystuje się głównie obecnie język C++. Nie będzie to jednak język programowania, który wykorzystam do tworzenia, gdyż pomijając fakt, że nie piszę się w nim przyjemnie, to nie uważam też, żeby był to język stosowany do tych celów w przyszłości (10 lat temu królował w końcu język C, a obecnie coraz bardziej dąży się do prostoty, za czym C++ jak gdyby wg mnie nie nadąża). Pokrótce… mam malutkie doświadczenie w DirectX i OpenGL, ale zdecydowałem się tworzyć z wykorzystaniem technologii XNA firmy Microsfot, języka programowania C# i ewentualnie zewnętrznych bibliotek, np. takich jak PhysX (to produkt firmy NVidia do symulacji zjawisk fizycznych). Przy okazji, starał się będę wdrażać w swoich rozwiązaniach elementy ze środowiska >= .NET 3.5, bo tak się składa, że na codzień pracuję w .NET 2.0 i funkcjonalności takie jak: LINQ, wyrażenia lambda, metody rozszerzone, automatyczne właściwości itp. nie są mi raczej znane. Ten zestaw z pewnością można będzie jeszcze jakoś rozszerzyć, aczkolwiek biorąc pod uwagę fakt, że nie stworzyłem jak dotąd żadnego większego programu ani w XNA, ani w PhysX długa droga przede mną.

Co do samego projektu, to kod źródłowy jest od jakichś dwóch tygodni ogólnie dostępny pod adresem:
http://code.google.com/p/effectivexnagame/.

Starał się tam będę umieszczać również grywalne wersje..
Co do samej gry…to o dziwo ciągle nie mam na nią pomysłu (niech slajd powyższej nie nastawi Was zbytnio ;>) W zasadzie nie jest on mi jeszcze aż tak bardzo potrzebny, gdyż samo stworzenie silnika gry zajmie mi dostatecznie dużo czasu. Obecnie jedyne moje założenie jest takie, żeby gra była w 3D. Jeśli macie jakiś ciekawy pomysł…to z chęcią poczytam komentarze bądź maile z propozycjami. A nuż któryś z nich mnie zachęci czy przekona do wyboru. Będę wdzięczny za sugestie! Póki co udało mi się dorzucić kilka ścian, tekstury i jeden model samochodu..do tego trochę manipulowania kamerą przy pomocy myszki i klawiatury…o tym wszystkim i o pewnych podstawach napiszę już wkrótce.

Wreszcie trochę o materiałach, z których korzystam…otóż głównym źródłem mojej wiedzy jest póki co książka pt. „Sams Microsoft XNA Unleashed”, autora Chad Cartera z 2007roku. Na spokojnie obecnie ją sobie czytam przepisując czasami żywcem przykłady. Jak dotrę do jakichś wartych przejrzenia materiałów w sieci (są już takie), to obiecuję podzielić się nimi z Wami też tutaj (przy okazji będę aktualizował podstronę „Wartościowe linki” o te, dotyczące tworzenia gier komputerowych). Zapraszam!