/******************** Pętla Gry ******************/ public void Graj(Scena ScenaPoczatkowa, int maxFPS = 30) { //Inicjalizacja skłądników gry KameraGry = new Kamera(this.ClientSize.Width, this.ClientSize.Height); //Stworzenie obiektu kamery ZaladujScene(ScenaPoczatkowa); //Załadowanie początkowej sceny this.Show(); //pokazanie okna aplikacji //Obiekt klasy Graphics możemy utworzyć poprzez kilka jej statycznych metod //lub poprzez metodę CreateGraphics() dla kontrolek WinForms Graphics przedniBufor = Graphics.FromHwnd(this.Handle); //Obszar graficzny naszego okna. Nasze "płótno" przednie //Danie uchytu do naszej aplikacji okienkowej DateTime czasOstatnijeKlatki = DateTime.Now; //Dzięki znajomości czasu obliczam FPS double czasNaKlatke = 1000.0 / maxFPS; //Tyle milisekund mamy na stworzenie 1 klatki Image tlo = Bitmap.FromFile("Atlasy/background.png"); //Wstawianie tła do okna jako tło do czyszczenia bufora while (true) //petla gry { if (!this.Created) { break; //Wyjście z pętli gry } if (KolejnaScena != null) //Jak zmieniamy scene np. nowy poziom { KameraGry.WyczyscBufor(); ObecnaScena = KolejnaScena; KolejnaScena = null; ObecnaScena.Start(); } float dt = (float)(DateTime.Now - czasOstatnijeKlatki).TotalSeconds; //Czas jaki upłynął od ostatniej klatki na scenie czasOstatnijeKlatki = DateTime.Now; //Kolejne dt będzie liczone względem tej chwili ObecnaScena.Aktualizuj(dt * SkalarCzasu); //Obiekty na scenie aktualizują swój stan KameraGry.WyczyscBufor(tlo); //Czyszczenie obrazu z poprzednij klatki ObecnaScena.Renderuj(); //Rysowanie obiektów na ObecnaScena KameraGry.KopiujNaPrzedniBufor(przedniBufor); //Gotową klatkę wklejamy na ekran Application.DoEvents(); //Odpowiada za responsywnosć okna, np. wcisniecia klawiszy double przerwa = czasNaKlatke - (DateTime.Now - czasOstatnijeKlatki).TotalMilliseconds; if (przerwa > 0) { System.Threading.Thread.Sleep((int)przerwa); //Jeżeli scena wykonała się szybciej niż czas na 1 klatke, to zrób przerwe } } }
/******************** Metody statyczne ******************/ public static void ZaladujScene(Scena nowaScena) { KolejnaScena = nowaScena; //Ma zapamiętac przekazaną w argumencie scene }