animacja samolotu i wybuchu z użyciem bitmap, zapobieganie mruganiu
Specyfikacja:
samolot przelatuje od lewej krawędzi okna do prawej na losowej wysokości
zrzutu bomby dokonuje się klawiszem spacji (w miejscu środka obrazka przedstawiającego samolot)
tylko jednen wybuch może być animowany jednocześnie
obraz wybuchu nie może przesłaniać obrazu samolotu
wszystkie wykorzystywane obrazy należy dodać do zasobów programu
obrazy należy ładować z zasobów (a nie z zewnętrznych plików)
tło
obraz tłą zawiera plik land.bmp
rozmiar obrazu jest nieznany, należy go odczytać po załadowaniu obrazu
obraz tła zawsze wypełnia całe okno, należy przeskalowywać oryginalny obraz
animacja samolotu
obraz samolotu zawiera plik plane.bmp
tło samolotu ma kolor czarny - [RGB=(0,0,0)]
tło samolotu nie może być wyświetlane
rozmiar obrazu jest nieznany, należy go odczytać po załadowaniu obrazu
wyświetlanie samolotu bez tła musi zostać zrealizowane w możliwie wydajny sposób
animacja ruchu powinna być płynna - 25 klatek/sek.
animcja wybuchu
dostarczone pliki pozwalają na wykonanie animacji wybuchu
oba obrazy są 32 bitową bitmapą o rozmiarze 256x256 (można przyjąć w kodzie rozmiar bitmap za znany,
ale z użyciem zdefiniowanych stałych [#define cośtam 256], nie wolno używać stałych liczbowych)
oba obrazy zawierają w sobie 16 klatek animacji (rozmiar 4 i 16 podobnie jak 256 można przyjąć za znany, z uwagami jak poprzednio)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
drugi z obrazów zawiera kanał alpha (stopień przeźroczystości) dla pierwszego obrazu
w obrazie z kanałem alpha wszystkie składowe kolorów są równe
funkcja AlphaBlend() nie jest w stanie wykorzystać tych obrazów bezpośrednio
należy za pomocą funkcji CreateBitmap() stworzyć z obu obrazów nową 32 bitową bitmapę w formacie ARGB
format danych obrazu jakie należy przekazać do metody CreateBitmap():
B 0
G 0
R 0
A 0
B 1
G 1
R 1
A 1
...
B last
G last
R last
A last
gdzie R,G,B - składowe koloru jak w obrazie oryginalnym, a A - wartość kanału alpha z drugiego obrazu
pixele należy zapisać w tablicy kolejno liniami, od lewej do prawej strony
(tak, że pixel oznaczony jako 0 to lewy górny róg obrazu, a pixel oznaczony jako last - prawy dolny)
animacja wybuchu powinna trwać około 2 sek.
należy całkowicie wyeliminować efekty mrugania przy rysowaniu
rysowanie powinno odbywać się możliwie wydajnie
Wskazówki:
CreateBitmap(), GetPixel(), GetXValue()
CreateCompatibleBitmap(), CreateCompatibleDC()
LoadBitmap(), MAKEINTRESOURCE()
GetObject(), BITMAP
AlphaBlend(), BLENDFUNCTION
TransparentBlt(), RGB()
StretchBlt(), BitBlt()
do projektu należy dołączyć bibliotekę Msimg32.lib (Project Properties->Linker->Input->Aditional Dependencies)