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
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.
|
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
Lista 10 . Kod źródłowy programu o nazwie BouncingBall02.