SOISK - SYSTEMY OPERACYJNE I SIECI KOMPUTEROWE
Tomasz Puchała

Odbijając piłkę z tłem obrazu

Programowanie grafiki za pomocą Allegro

Odbijając piłkę z tłem obrazu

 

Ogólny

Ta lekcja jest częścią serii (patrz Zasoby ), przeznaczony do nauczania, jak korzystać z Allegro zrobić programowania grafiki w C + +. Moim celem na piśmie serii jest dostarczenie materiału wykładu i laboratorium na kurs Rozwoju pt gry przy użyciu C + +, że uczę w Austin Community College w Austin w Teksasie. Jeśli jednak natknęliśmy się na tej serii i być przydatne, zapraszamy do jej studiowania.

Końcówka Przedstawiamy

I zaleca, aby otworzyć kolejną kopię tego dokumentu w osobnym oknie przeglądarki i korzystać z poniższych linków, aby łatwo znaleźć i przejrzeć dane i list podczas czytania o nich.

Figurki

  • Rysunek 1 . Dane wyświetlane na ekranie z programu BouncingBall02.

Właściciele

  • Listing 1 . Początek programu o nazwie BouncingBall02.
  • Listing 2 . Początek głównej funkcji.
  • Listing 3 . Przygotować bitmapę dla małego obrazka.
  • Listing 4 . Zapisz kwadratowy fragment obrazu tła.
  • Listing 5 . Pętla animacji.
  • Listing 6 . Początek funkcji moveBall.
  • Listing 7 . Usunąć bieżący obraz piłki.
  • Listing 8 . Zapisać nowy fragment obrazu tła.
  • Listing 9 . Zakończenie funkcji moveBall.
  • Lista 10 . Kod źródłowy programu o nazwie BouncingBall02.

Miejski materiał

Polecam też badać inne lekcje w mojej bogatej kolekcji samouczki online programowania. Znajdziesz skonsolidowany wskaźnik na www.DickBaldwin.com .

Podgląd

Jest to aktualizacja wcześniejszego wypadowa-Ball program animacyjny (patrz Lekcja 125 w zasobach ). Ta aktualizacja ilustruje dwa ważne aspekty animacji:

  • Rysunek animowany obiekt (czerwona kula) na off-screen bufor i wywołanie Blit funkcji kopiowania zawartości bufora na ekran raz podczas każdego cyklu animacji.
  • Przenoszenie animowany obiekt przed tle, który jest obrazem zamiast jednolitego koloru jak to miało miejsce w starszej wersji programu.

Program wyświetla czerwoną piłkę odbijając około wewnątrz pudełka przed wizerunkiem rozgwiazdy, jak pokazano na rysunku 1.

Rysunek 1 . Dane wyświetlane na ekranie z programu BouncingBall02.

Piłka nie wolno poruszać się tylko w czterech kierunkach:

  • północny wschód
  • południowy wschód
  • na południowy zachód
  • północny zachód

Kiedy piłka uderza w ścianę, nie zawsze odbija się w kierunku, który normalnie się spodziewać. Zamiast tego wybiera jeden z czterech kierunków możliwych losowo i próbuje odbić w tym kierunku. Piłka nadal odbijać, aż użytkownik naciśnie klawisz Esc, przy którym program się kończy.

Dyskusja i przykładowy kod

Jak zwykle, będę wyjaśniać kod programu we fragmentach. Pełna lista programu jest w Listing 10. pod koniec lekcji.

Początku programu

Kod programu zaczyna się w Listingu 1.

Listing 1 . Początek programu o nazwie BouncingBall02.

  # Include <allegro.h>   / / Deklaracja wskaźnika zmienną o nazwie bufor, który można  / / Używane do wskazywania na bitmapę.  To będzie główny  / / Bufor pamięci zawierający obraz.  BITMAP * bufor = NULL;    BITMAP * smallBuffer = NULL;    / / Należy pamiętać, że rozmiar obrazu był znany przed  / / Program został napisany, a rozmiar jest używany poniżej do  / / Ustaw rozmiar pola.  int width = 324 ;/ / szerokość okna  int height = 330 ;/ / wysokość okna  int = promień 9 ;/ / promień kuli   int x = 100 ;/ / pozycja początkowa kulki  int y = 200 ;/ / pozycja początkowa kulki   int ;/ tempX / używane, aby zapisać aktualną lokalizację piłki  int ;/ tempY / używane, aby zapisać aktualną lokalizację piłki   / / Kontroluj kierunku ruchu tutaj.  / / 0 = 1 = południowy zachód północny zachód, 2 = północny wschód,  / / 3 = południowy wschód  int dir; 

Zmienna wskaźnik nazwany smallBuffer

Większość kodu na listingu 1, powinny być znane do Ciebie teraz i nie wymaga żadnych wyjaśnień poza wbudowanych komentarzach. Jednak zmienny wskaźnik nazwany smallBuffer nie zasługują na wyjaśnienie, ponieważ jest to nowy do tego programu.

Musi skasować stary obraz piłki

We wcześniejszym wypadowa-ball programu, piłka została sporządzona w ruchu przed czarnym tle. W obu programach, gdy nadszedł czas na piłkę do przemieszczania się, istniejący obraz kuli muszą zostać usunięte przed wyciągnięciem piłki w nowej lokalizacji. W tle stały kolorów, wszystko co jest wymagane, aby usunąć kulę jest zwrócenie kolejną kulę na szczycie istniejącego piłki w kolorze tła. Jednak trochę więcej pracy jest zobowiązany do usunięcia piłkę, gdy tło jest obraz zamiast jednolitego koloru.

Zapisz niewielki fragment obrazu tła

Zmienna wskaźnik nazwany smallBuffer będą używane do wskazywania na bitmapę bufora w pamięci. Ten bufor pamięci będzie używane do zapisu mały fragment obrazu tła, koncentrującego się na nowym miejscu piłki zanim piłka została sporządzona w tym miejscu na obrazie. Mały obraz będzie następnie wykorzystywany w celu przywrócenia obszar obrazu zajmowanej przez piłkę, kiedy jest czas na bal o przeprowadzce do nowej lokalizacji. Innymi słowy, mały kwadrat obraz zostanie sporządzony w jego oryginalnej lokalizacji, skutecznie usuwanie bieżący obraz piłki i przywrócenia obrazu za piłką w tym samym czasie.

Początek głównej funkcji

Program ten zawiera dwie funkcje:

  • główny
  • moveBall

Zacznę moje wyjaśnienie z głównych funkcji, która zaczyna się na listingu 2.

Listing 2 . Początek głównej funkcji.

  int main () {

   allegro_init ();
   install_keyboard ();
   set_color_depth (32);
   set_gfx_mode (GFX_AUTODETECT_WINDOWED, szerokość, wysokość, 0,0);

   / / Załaduj plik obrazu z bieżącego katalogu.
   buffer = load_bitmap ("starfish324x330.pcx", NULL);

Wyjaśniłem kod podobny do kodu na listingu 2 przed (patrz Zasoby ), więc nie będę powtarzać te wyjaśnienia tutaj.

 
Bitmap nie jest tak naprawdę pusty
Jak dowiedział się we wcześniejszej lekcji, nowa bitmapa zawiera śmieci, ale to nie będzie dla nas problemem w tym programie. Będziemy go wypełnić nowymi danymi i zastąpić istniejący śmieci.

Przygotować bitmapę dla małego obrazka

Listing 3 nazywa create_bitmap funkcji, aby utworzyć pusty bitmapy i zapisać jej adres w zmiennej wskaźnika o nazwie smallBuffer.

Listing 3 . Przygotować bitmapę dla małego obrazka.

   smallBuffer = create_bitmap (promień * 2 + 2, promień * 2 + 2);

Szerokość i wysokość małej bitmapy są równe średnicy piłki plus dwa piksele.

Zapisz kwadratowy fragment obrazu tła

Listing 4 nazywa Blit funkcji kopiowania i zapisać kwadratowy obszar obrazu tła otaczającego miejsce, w którym piłka zostanie narysowana gdy po raz pierwszy pojawia się na ekranie. (Rozmawiałem korzystania z Blit funkcji w poprzednich lekcjach, tak wyjaśnienie nie powinny być potrzebne.)

Listing 4 . Zapisz kwadratowy fragment obrazu tła.

   Blit (bufor, smallBuffer,
        x-radius-1, y-radius-1,
        0,0,
        promień * 2 +2, promień * 2 +2);

Zauważ, że mogę z każdej strony placu są kopiowane na dwa pikseli większa niż średnica piłki w celu umożliwienia możliwość, że piłka nie jest idealnie znajdującego się w centrum placu.

Pętla animacja

Listing 5 nazywa srand funkcję i rand funkcję do stworzenia losowej początkowy kierunek piłki. Wyjaśniłem kod bardzo podobny do tego kodu we wcześniejszym wypadowa-ball programu (patrz Zasoby ).

Listing 5 . Pętla animacji.

   / / Seed generator liczb losowych i ustawić początkowy
   / / Kierunek w oparciu o liczbę losową.
   srand (time (NULL));
   dir = rand ()% 4;
  
   / / Pętla aż użytkownik naciśnie klawisz Esc.
   while (! klawisz [KEY_ESC]) {
     moveBall ();
   } / / Koniec pętli while

   return 0;
 } / / Koniec główny
 END_OF_MAIN (); 

Następnie kod na listingu 5 wejdzie do pętli animacji, gdzie wywołuje funkcję moveBall raz podczas każdej iteracji. Pętla będzie iteracji, a piłka pokazano na rysunku 1 będzie poruszać się przed obrazem rozgwiazdy, aż użytkownik naciśnie klawisza ESC, w czasie których program zakończy działanie.

Początek funkcji moveBall

Funkcja moveBall rozpoczyna się w listingu 6.

Listing 6 . Początek funkcji moveBall.

  moveBall void () {
   / / Zapisz bieżącą lokalizację piłkę.
   tempX = x;
   tempY = y;

   / / Kod w instrukcji switch jest identyczna
   / / Kod w starszej wersji programu.
   switch (dir) {
     case 0:
       / / Kierunek północny.
       if ((x <= promień) | | (y <= promień)) {
         / / Piłka zderzył się z jednej ściany lewej lub
         / / Górnej ścianie.
         / / Pobierz nowy kierunek.  Zauważ, że jeśli nowy
         / / Kierunek jest taki sam jak starego, kontroli
         / / Wróci do tutaj, aby uzyskać jeszcze jeden
         / / Kierunek następnym wywołaniu funkcji.
         dir = rand ()% 4;
       } Else {
         / / Nie kolizji ustaw nową lokalizację dla piłki
         - X;
         - Y;
       } / / End else
     break;
     Przypadek 1:
       / / Kierunek na południowy zachód.
       jeśli (((x <= promień) | | (y> = (wysokość - promień)))) {
         / / Pobiera nowy kierunek
         dir = rand ()% 4;
       } Else {
         / / Ustaw nową lokalizację dla piłki
         - X;
         + + Y;
       } / / End else
     break;
     Przypadek 2:
       / / Kierunek północny.
       jeśli (((x> = (szerokość - promień)) | | (y <= promień))) {
         / / Pobiera nowy kierunek
         dir = rand ()% 4;
       } Else {
         / / Ustaw nową lokalizację dla piłki
         + + X;
         - Y;
       } / / End else
     break;
     Przypadek 3:
       / / Kierunek południowy
       jeśli ((((x> = szerokość (- promień)) | |
                               (R> = (wysokość - promień))))) {
         / / Pobiera nowy kierunek
         dir = rand ()% 4;
       } Else {
         / / Ustaw nową lokalizację dla piłki
         + + X;
         + + Y;
       } / / End else

   } / / Koniec switch 

Kod z listingu 6:

  • Zapisuje aktualną pozycję współrzędne piłki.
  • Aktualizacje kierunek, w którym piłka będzie przenieść, jeśli nie zderzył się ze ścianą, lub
  • Oblicza pozycja współrzędne następnego położenia piłki jeśli nie zderzył się z murem.

Ten kod jest bardzo podobny do kodu, który wyjaśniłem we wcześniejszym wypadowa-ball programu (patrz Zasoby ), więc nie będę powtarzać, że wyjaśnienie tutaj.

Usunąć bieżący obraz piłki

To tam rzeczy naprawdę odbiegają od wcześniejszej wypadowa-ball programu. Listing 7. wymazuje bieżący obraz piłki przez wywołanie funkcji Blit zwrócić wcześniej zapisany fragment obrazu tła nad piłką. To przywraca obraz tła do stanu sprzed piłka została opracowana na górnej części obrazu podczas poprzedniej iteracji pętli animacji.

Listing 7 . Usunąć bieżący obraz piłki.

   Blit (smallBuffer, bufor,
        0,0,
        tempX-radius-1, tempY-radius-1,
        promień * 2 +2, promień * 2 +2); 

Należy pamiętać, że współrzędne pozycji, które zostały zapisane na początku listingu 6 służą do ustalenia miejsca, w którym uprzednio zapisany fragment obrazu tła jest rysowany.

Zapisać nowy fragment obrazu tła

Listing 8 oszczędza kwadratowy obszar obrazu tła w nowej lokalizacji piłki (obliczane na listingu 6) zanim piłka została sporządzona w nowej lokalizacji.

Listing 8 . Zapisać nowy fragment obrazu tła.

   Blit (bufor, smallBuffer,
        x-radius-1, y-radius-1,
        0,0,
        promień * 2 +2, promień * 2 +2); 

Jak to było kiedy mały fragment obrazu tła został zapisany na listingu 4, każda strona placu jest dwóch pikseli większa niż średnica piłki w celu umożliwienia możliwość, że piłka nie jest idealnie znajdującego się w centrum placu.

Zakończenie funkcji moveBall

Listing 9 uzupełnia funkcję moveBall przez:

  • Rysunek piłkę na tle w nowej lokalizacji.
  • Wywołanie funkcji Blit aby skopiować off-screen bufor obrazu na ekranie.
  • Wkładanie pięć milisekund opóźnienia.

Listing 9 . Zakończenie funkcji moveBall.

  / / Teraz wyciągnąć piłkę na tle na nowy
   / / Lokalizacja.
   circlefill (bufor, x, y, promień, makecol (255,0,0));

   / / Wywołanie funkcji Blit skopiować off-screen bufor
   / / Zawartość na ekranie.
   Blit (bufor, screen, 0,0,0,0, szerokość, wysokość);

   Reszta (5) ;/ / Delay dla pięciu milisekund
 } / / Koniec funkcji moveBall. 

Następnie Listing 9. kontrolę wraca do kodu w pętli animacji w Listingu 5, gdzie proces wciąż powtarzać aż użytkownik naciśnie klawisz Esc.

Streszczenie

W tej lekcji nauczyłeś się, jak zaimplementować dwa ważne aspekty animacji:

  • Rysunek animowanego obiektu na off-screen bufor obrazu i wywołanie Blit funkcję, aby skopiować zawartość bufora na ekran raz podczas każdego cyklu animacji.
  • Przenoszenie animowany obiekt przed tle, który jest obrazem zamiast jednolitego koloru.

Kompletna lista programu

Pełna lista programu jest pokazany na listingu 10.

Lista 10 . Kod źródłowy programu o nazwie BouncingBall02.



 
 
Ta strona internetowa została utworzona bezpłatnie pod adresem Stronygratis.pl. Czy chcesz też mieć własną stronę internetową?
Darmowa rejestracja