Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy. #include <stdio.h> #include <allegro5/allegro5.h> #include <allegro5/allegro_primitives.h> #include <allegro5/allegro_image.h> #include <iostream> using namespace std; int main() al_init(); al_init_image_addon(); al_init_primitives_addon(); al_install_keyboard(); ALLEGRO_DISPLAY * display = NULL; const int szer=1024,wys=768; display = al_create_display(szer, wys); if (!display ) cout << "Nie udalo sie utworzyc okna!" << endl; ALLEGRO_BITMAP *o1 = al_load_bitmap("a.bmp"); if (!o1 ) cout << "Nie udalo sie wczytac obrazka 'a.bmp'." << endl; ALLEGRO_BITMAP *o2 = al_load_bitmap("b.bmp"); if (!o2 ) cout << "Nie udalo sie wczytac obrazka 'b.bmp'." << endl; al_convert_mask_to_alpha( o1, al_map_rgb(255,0,255) ); al_set_window_title(display,"obrazki."); ALLEGRO_KEYBOARD_STATE key_state; al_get_keyboard_state(&key_state); while(!al_key_down(&key_state, ALLEGRO_KEY_ESCAPE)) al_get_keyboard_state(&key_state); al_clear_to_color( al_map_rgb(0,0,80) ); if ( al_key_down(&key_state, ALLEGRO_KEY_SPACE) ) al_set_blender(allegro_add, ALLEGRO_ONE, ALLEGRO_ONE); else al_set_blender(allegro_add, ALLEGRO_ONE, ALLEGRO_ZERO); al_draw_bitmap( o2, 150, 60, 0 ); al_draw_bitmap( o1, 10, 50, 0 ); al_flip_display(); al_destroy_bitmap( o1 ); al_destroy_bitmap( o2 );
N początek teoria ;-) Kolor kluczowy. Czym jest ten tajemniczy kolor kluczowy? Otóż sprawa jest banalna a sama technika bardzo przydatna. Kolor kluczowy to inaczej kolor który będzie tłem obrazka, wyobraź sobie, że masz narysowanego bohatera a tłem obrazka jest różowy kolor - jak narysujesz tą bitmapę to narysujesz bohatera razem z tym tłem co zazwyczaj nie jest pożądanym efektem. Najlepiej zobrazuje to przykład: Jak widać razem z bohaterem wyświetla się tło. Tutaj zaś użyto koloru kluczowego, innymi słowy ustawiono różowy kolor na kolor w pełni przeźroczysty. Opisując to konkretniej można powiedzieć, że każdy różowy piksel ma ustawiony kanał alpha na zero. Widzisz już zapewne różnice. Tak więc jest to bardzo przydatne Np. kiedy za graczem są jakieś krajobrazy, tło gry, niebo, czy cokolwiek innego. Blending. Blending jest równie ważna techniką pozwala bowiem na wpół przeźroczyste rysowanie obrazków ( Np. szkło lub woda pod która widać piasek na plaży. ) technika ta pozwala na uzyskanie takich efektów poprzez mieszanie kolorów podstawy czyli tła i źródła czyli obrazka. Mieszanie odbywa się na postawie koloru pikseli i ich kanału alpha. Kanał alpha informuje jak bardzo przeźroczysty jest każdy z pikseli. Minimalna wartość czyli zero oznacza, że piksel jest całkowicie niewidoczny a maksymalna wartość czyli 255 oznacza, że piksel jest w pełni do zobaczenia. Tak więc półprzeźroczysty piksel jak już się pewnie domyślasz będzie miał wartość alpha ustawioną na 128 czyli połowa ale nic nie stoi na przeszkodzie aby ustawić jeszcze inną wartość - przez co uzyskać możemy różne stopnie przeźroczystości. Obroty i skalowanie. Rysowanie obróconej bitmapy to po prostu rysowanie obróconej bitmapy nie ma tu głębszej filozofii :) wstawiamy obrazek obrócony o jakiś kąt. Zaś skalowanie dla co po niektórych może być nowym słowem tak więc wyjaśniam. Rysowanie obrazka w innej skali to rysowanie go powiększonego lub zmniejszonego czyli skalowanie. Możemy skalować na osi X i na osi Y czyli rozciągnąć go w poziomie i w pionie - lub skurczyć. Analiza kodu. #include <allegro5/allegro_image.h> Jak już widać na początku musimy dodać kolejny nagłówek. Tym razem dotyczy on wczytywania bitmap czyli obrazków. al_init_image_addon(); Kolejną nowością jest ta oto funkcja - instaluje ona system wczytywania bitmap. ALLEGRO_BITMAP *o1; W tej linijce zaś widzimy wskaźnik na bitmapę. To on będzie przechowywał ( wskazywał ) nasz obrazek. Takich wskaźników możemy mieć rzecz jasna kilka zależy ile obrazków chcemy używać. al_load_bitmap("a.bmp"); Ta oto funkcja wczytuje podaną przez nas bitmapę i zwraca do niej wskaźnik. Jej parametr to const char *filename przechowujący ścieżkę do pliku i samą nazwę pliku wraz z rozszerzeniem.
if (!logo ) std::cout << "Nie udalo sie wczytac obrazka 'a.bmp'." << std::endl; getchar(); return; Ta część bloku sprawdza czy bitmapa została poprawnie wczytana jeśli cos poszło nie tak to informuje o tym w konsoli, czeka na klawisz po czym wychodzi z głownej funkcji czyli kończy działanie programu. int logoszer = al_get_bitmap_width(o1); int logowys = al_get_bitmap_height(o1); W tym miejscu widzimy kolejno dwie przydatne funkcje. Pierwsza z nich al_get_bitmap_width() zwraca szerokość bitmapy w pikselach druga zaś al_get_bitmap_height() zwraca wysokość bitmapy w pikselach. Obie przyjmują jako parameter wskaźnik na bitmapę czyli ALLEGRO_BITMAP * al_convert_mask_to_alpha( o2, al_map_rgb(255,0,255) ); Ta funkcja ustawia kolor kluczowy danej bitmapy. Konkretnie ustawia każdy piksel o podanym kolorze na niewidoczny czyli o wartości alpha równej zero. Parametry funkcji są następujące: ALLEGRO_COLOR mask_color Wskaźnik na bitmapę dla której ma być ustawiony kolor kluczowy. Kolor kluczowy czyli kolor który ma być niewidoczny. al_set_blender(allegro_add, ALLEGRO_ONE, ALLEGRO_ONE); Ta funkcja ustawia blending - czyli sposób mieszania kolorów - oraz koloryzowanie przy rysowaniu w tym i kanał alpha czyli stopień przeźroczystości. Szczegóły na http://alleg.strangesoft.net/docs/graphics.html#al_set_blender al_draw_bitmap( o2, 10, 50, 0 ); Ta funkcja rysuje bitmapę w podanym miejscu. Jej parametry są następujące: Położenie rysowania bitmapy na osi X Położenie rysowania bitmapy na osi Y Dostępne flagi dla rysowania bitmapy: ALLEGRO_FLIP_HORIZONTAL ALLEGRO_FLIP_VERTICAL Odwraca bitmapę w poziomie Odwraca bitmapę w pionie al_draw_bitmap_region( logo, 0, 0, 100, 90, 150, 160, 0 ); Ta funkcji pozwala na rysowanie tylko fragmentu bitmapy jej skrawka. Oto jej parametry: float sx float sy float sw float sh Miejsce wycięcia fragmentu - na osi X Miejsce wycięcia fragmentu - na osi Y Szerokość wycinanego fragmentu. Wysokość wycinanego fragmentu. Położenie rysowania fragmentu bitmapy na osi X Położenie rysowania fragmentu bitmapy na osi Y są takie same jak w przypadku funkcji al_draw_bitmap(); al_draw_scaled_bitmap( logo, 0, 0, logoszer, logowys, 260, 160, 80, 80, 0 );
Zaś ta funkcja pozwala na narysowanie zeskalowanej bitmapy dodatkowo pozwala wybrać fragment bitmapy który ma być zeskalowany i narysowany. Parametry tejże funkcji to: float sx float sy float sw float sh float dw float dh Miejsce wycięcia fragmentu - na osi X Miejsce wycięcia fragmentu - na osi Y Szerokość wycinanego fragmentu. Wysokość wycinanego fragmentu. Położenie rysowania fragmentu bitmapy na osi X Położenie rysowania fragmentu bitmapy na osi Y Szerokość do której ma być zeskalowany fragment Wysokość do której ma być zeskalowany fragment są takie same jak w przypadku funkcji al_draw_bitmap(); al_draw_rotated_bitmap( logo, logoszer/2, logowys/2, 540, 160, PI*90/180, 0 ); Ta oto funkcja rysuje obróconą bitmapę o jakiś kąt wokół punktu którego położenie jest względne od położenia rysowania. Oto jej parametry: float cx float cy float angle Położenie punktu na osi X względem położenia Położenie punktu na osi Y względem położenia Położenie bitmapy na osi X Położenie bitmapy na osi Y Kąt obrotu w radianach. Zmienna float angle przyjmuje kąt obrotu w radianach a nie w stopniach! Należy o tym pamiętać. Jeśli chcemy podać w stopniach musimy użyć wzoru czyli pomnożyć stopnie przez liczbę PI a następnie podzielić to przez 180. są takie same jak w przypadku funkcji al_draw_bitmap(); al_draw_scaled_rotated_bitmap( logo, logoszer/2, logowys/2,470,160,0.5,0.5, PI*45/180, NULL ); Ta funkcja rysuje zarazem obróconą i zeskalowaną bitmapę. Jej parametry to: float cx float cy float xscale float yscale float angle Położenie punktu na osi X względem położenia Położenie punktu na osi Y względem położenia Położenie bitmapy na osi X Położenie bitmapy na osi Y Wartość przez którą pomnożona będzie szerokość bitmapy przy rysowaniu. Wartość przez którą pomnożona będzie wysokość bitmapy przy rysowaniu. Kąt obrotu w radianach. są takie same jak w przypadku funkcji al_draw_bitmap(); al_destroy_bitmap( o1 ); Usuwa wczytaną uprzednio bitmapę. Innymi słowy jeżeli już nie potrzebujemy obrazka a nie chcemy aby zajmował on wciąż miejsce w pamięci komputera, to używamy tejże funkcji. Jako parametr podajemy wskaźnik na bitmapę.
To koniec analizy. Program wyświetla kilka bitmap i gdy naciśniemy spację wszystkie obrazki stają się przeźroczyste. Zadanko: Dostosuj rozmiar okna do rozmiaru wczytanego obrazka z tłem, zeskakuj pacmana, usuń mu śmieci, pomyśl (i zrób żeby się pacman jeździł jak się naciska strzałki na klawiaturze