. Podstawy Programowania 1. Podstawy Grafiki 2D - część pierwsza Biblioteka Allegro. Arkadiusz Chrobot. 28 stycznia 2016

Podobne dokumenty
Podstawy Programowania 1 Podstawy Grafiki 2D - część pierwsza Biblioteka Allegro. Plan. Wprowadzenie. Inicjacja i finalizacja. Notatki.

. Podstawy Programowania 1. Podstawy Grafiki 2D - część druga Biblioteka Allegro. Arkadiusz Chrobot. 23 stycznia 2017

Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty.

Rysowanie punktów na powierzchni graficznej

lekcja 8a Gry komputerowe MasterMind

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

P R OGRA M OW A N I E KOMPUTERÓW Ćwiczenia laboratoryjne. TEMAT 8: Moduły standardowe

Kod źródłowy programu: program Grafika1; uses crt, graph; (1) var sterownik, tryb:smallint; (2)

GRAFIKA RASTROWA. WYKŁAD 1 Wprowadzenie do grafiki rastrowej. Jacek Wiślicki Katedra Informatyki Stosowanej

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Podstawy Informatyki Wykład V

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Stałe, znaki, łańcuchy znaków, wejście i wyjście sformatowane

Laboratorium 3: Tablice, tablice znaków i funkcje operujące na ciągach znaków. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Podstawy Programowania 2 Dwukierunkowa lista liniowa. Plan. Wstęp. Implementacja. Notatki. Notatki. Notatki. Notatki.

Minimalna wspierana wersja systemu Android to zalecana 4.0. Ta dokumentacja została wykonana na telefonie HUAWEI ASCEND P7 z Android 4.

. Podstawy Programowania 2. Dwukierunkowa lista liniowa. Arkadiusz Chrobot. 7 kwietnia 2019

Wykład VII PASCAL - grafika;

Wprowadzenie do rysowania w 3D. Praca w środowisku 3D

Część 4 życie programu

Obsługa programu Paint. mgr Katarzyna Paliwoda

Pierwsza aplikacja Tworzenie okienka allegro, obsługa klawiatury, timery oraz wyświetlanie spritów wykorzystując podwójne buforowanie.

Pokaz slajdów na stronie internetowej

Wykład 5: Klasy cz. 3

Niezwykłe tablice Poznane typy danych pozwalają przechowywać pojedyncze liczby. Dzięki tablicom zgromadzimy wiele wartości w jednym miejscu.

Ćwiczenie 4 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

Zaawansowany kurs języka Python

Programowanie w języku Python. Grażyna Koba

Podstawy programowania skrót z wykładów:

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Janusz Ganczarski. OpenGL Pierwszy program

Wykład 8: klasy cz. 4

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

Grafika komputerowa. Dla DSI II

Szybkie tworzenie grafiki w GcIde

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

PROSTY PROGRAM DO MALOWANIA

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

Grafika rastrowa (bitmapa)-

Cykl lekcji informatyki w klasie IV szkoły podstawowej. Wstęp

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Instrukcja obsługi przełącznika KVM ATEN CS661. Opis urządzenia. Instalacja urządzenia

IX. Wskaźniki.(3 godz.)

WYKŁAD 3 WYPEŁNIANIE OBSZARÓW. Plan wykładu: 1. Wypełnianie wieloboku

Praktyka programowania projekt

Lab 9 Podstawy Programowania

Programowanie w języku C++ Grażyna Koba

Laboratorium 12: Podstawy grafiki 2D - biblioteka Allegro. mgr inż. Leszek Ciopiński dr inż. Arkadiusz Chrobot

Prezentacje multimedialne w Powerpoint

PyGame Gra w Ponga. Spis treści

2 Przygotował: mgr inż. Maciej Lasota

Podstawy Programowania 2 Rekurencja, metoda dziel i zwyciężaj. Plan. Rekurencja Wstęp. Rekurencja Wstęp. Notatki. Notatki. Notatki.

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Wstęp do Programowania, laboratorium 02

utworz tworzącą w pamięci dynamicznej tablicę dwuwymiarową liczb rzeczywistych, a następnie zerującą jej wszystkie elementy,

Główne elementy zestawu komputerowego

Program V-SIM tworzenie plików video z przebiegu symulacji

Programowanie w Turbo Pascal

Expo Composer Garncarska Szczecin tel.: info@doittechnology.pl. Dokumentacja użytkownika

// Potrzebne do memset oraz memcpy, czyli kopiowania bloków

System Informatyczny CELAB. Terminy, alarmy

Tworzenie prezentacji w MS PowerPoint

Formaty obrazów rastrowych biblioteki PBM

1 Podstawy c++ w pigułce.

INSTRUKCJE REPETYCYJNE PĘTLE

Podstawy programowania. Wykład: 9. Łańcuchy znaków. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Ćwiczenie 1 Automatyczna animacja ruchu

Podstawy Programowania 1 Wykład czternasty: Wstęp do grafiki 2D (moduł Allegro.pas)

1 Podstawy c++ w pigułce.

Spis treści. Programowanie w ImageJ. Zadanie 1. Zadanie 2

Jak zrobić klasyczny button na stronę www? (tutorial) w programie GIMP

Rys.1. Uaktywnianie pasków narzędzi. żądanych pasków narzędziowych. a) Modelowanie części: (standardowo widoczny po prawej stronie Przeglądarki MDT)

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Programowanie na poziomie sprzętu. Programowanie w Windows API

BSP_LCD_Clear(LCD_COLOR_WHITE); BSP_LCD_SetFont(&Font16); BSP_LCD_SetTextColor(LCD_COLOR_BLACK);

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Podstawy Programowania Obiektowego

Programowanie, część III

Kontrola topto. 1. Informacje ogólne. 2. Wymagania sprzętowe i programowe aplikacji. 3. Przykładowa instalacja topto. 4. Komunikacja.

Język C zajęcia nr 11. Funkcje

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

Allegro5 część 1 - Witaj Świecie! Projekt, inicjalizacja, tworzenie okna, czcionki. Autor: Kamil Krzyszczuk - C mons

TWORZENIE OBIEKTÓW GRAFICZNYCH

Wskaźniki w C. Anna Gogolińska

PIERWSZE URUCHOMIENIE PROGRAMU ITNC PROGRAMMING STATION

Program 6. Program wykorzystujący strukturę osoba o polach: imię, nazwisko, wiek. W programie wykorzystane są dwie funkcje:

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Część XVII C++ Funkcje. Funkcja bezargumentowa Najprostszym przypadkiem funkcji jest jej wersja bezargumentowa. Spójrzmy na przykład.

Instrukcja do programu BASIC PR-02

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Pascal - grafika. Uruchomienie trybu graficznego. Moduł graph. Domyślny tryb graficzny

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Programowanie w języku LOGO KOMENIUSZ

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

KATEGORIA OBSZAR WIEDZY

Transkrypt:

.. Podstawy Programowania 1 Podstawy Grafiki 2D - część pierwsza Biblioteka Allegro Arkadiusz Chrobot Zakład Informatyki 28 stycznia 2016 1 / 28

Plan.1 Wprowadzenie.2 Inicjacja i finalizacja.3 Rysowanie prymitywów.4 Obsługa klawiatury.5 Animacja.6 Wyświetlanie tekstu.7 Przykład.8 Zakończenie 2 / 28

Wprowadzenie Wprowadzenie Współczesne systemy komputerowe posiadają zaawansowane układy graficzne pozwalające generować zbliżone do rzeczywistości obrazy i animacje trójwymiarowe. Ten wykład będzie poświęcony prostszemu zagadnieniu jakim jest grafika dwuwymiarowa. W drugiej części wykładu zostaną przedstawione proste, lecz interesujące programy przykładowe generujące mniej lub bardziej skomplikowane obrazy i animacje. Pierwsza część wykładu będzie poświęcona bibliotece Allegro, która posłuży na do pisania takich programów. Ta biblioteka, przeznaczona dla języków programowania C i C++ początkowo była wzorowana na innej, zaprojektowanej dla komputerów Atari ST. Jej głównym zastosowaniem jest tworzenie gier komputerowych, zarówno 2D, jak i 3D, dlatego oprócz funkcji obsługujących obraz i klawiaturę oferuje również podprogramy obsługi dźwięku, myszy, a nawet pozwalające tworzyć graficzne interfejsy użytkownika (gui). W ramach wykładu zostaną jednak przedstawione jedynie podstawowe funkcje. Będziemy się posługiwać wersją 4.4 biblioteki Allegro. Więcej informacji na temat tej biblioteki można znaleźć na stronie: http://liballeg.org/. Stąd można też pobrać tę bibliotekę, gdyż jest to oprogramowanie dostępne na licencji typu open source. 3 / 28

Inicjacja i finalizacja Inicjacja i finalizacja Głównym plikiem nagłówkowym, który należy włączyć do kodu źródłowego programu, aby móc się posłużyć w nim zawartością biblioteki Allegro jest plik allegro.h. Jeśli zamierzamy korzystać z klawiatury to dodatkowo powinniśmy włączyć plik allegro/keyboard.h (zapis oznacza: plik keyboard.h znajdujący się w katalogu allegro). Głównym podprogramem inicjującym działanie biblioteki jest makro allegro_init. Nie przyjmuje ono żadnych argumentów, ale zwraca liczbę typu int. Jeśli jest ona różna od zera, to znaczy, że nie udało się zainicjować pracy biblioteki. Informację o błędzie można wypisać na ekran za pomocą funkcji allegro_message(), która jest wywoływana w taki sam sposób jak printf(). Ta funkcja w środowiskach wyposażonych w gui tworzy okienko z wiadomościach, a w systemach pracujących w trybie tekstowym drukuje informacje bezpośrednio na ekranie. Może ona być używana jednie przed wywołaniem funkcji set_gfx_mode(), która będzie opisana później. Kod błędu działania funkcji i makr z biblioteki Allegro zapisywany jest w zmiennej globalnej allegro_error typu char. 4 / 28

Inicjacja i finalizacja Inicjacja i finalizacja Funkcja set_color_depth() pozwala określić tzw. przestrzeń kolorów, czyli na ilu bitach będzie kodowana informacja o pojedynczym kolorze. Przyjmuje ona jako argument liczbę typu int, ale dozwolone wartości to 8, 15, 16, 24 i 32. Ostatnia wartość będzie używana w przykładowych programach. Oznacza ona, że informacja o kolorze będzie zajmowała cztery bajty. Pierwszy będzie składową czerwoną, drugi zieloną, trzeci niebieską wynikowego koloru, a czwarty to tzw. kanał alfa, którego wartość decyduje o przezroczystości. Taki format opisu koloru nazywa się rgba. Funkcja set_color_depth() nie zwraca żadnej wartości. 5 / 28

Inicjacja i finalizacja Inicjacja i finalizacja Funkcja set_gfx_mode() zajmuje się przełączeniem do określonego trybu graficznego. Przyjmuje ona pięć argumentów. Pierwszym jest jedna z pięciu stałych: gfx_autodetect - funkcja próbuje włączyć tryb graficzny o określonej przez programistę rozdzielczości w trybie pełnoekranowym lub okienkowym, gfx_autodetect_fullscreen - funkcja próbuje włączyć tryb graficzny o określonej przez programistę rozdzielczości w trybie pełnoekranowym, gfx_autodetect_windowed - funkcja próbuje włączyć tryb graficzny o określonej przez programistę rozdzielczości w trybie okienkowym, gfx_safe - funkcja próbuje włączyć jakikolwiek tryb graficzny, który zadziała, gfx_text - funkcja próbuje włączyć jakikolwiek tryb tekstowy, który zadziała. 6 / 28

Inicjacja i finalizacja Inicjacja i finalizacja Dwa kolejne argumenty powinny być typu int i określają one rozdzielczość obrazu w docelowym trybie graficznym. Pierwszy określa ile pikseli będzie liczył obraz w poziomie, a druga ile w pionie. Dwa ostatnie argumenty również powinny być typu int i określają rozdzielczość tzw. ekranu wirtualnego, który jest używany jeśli program korzysta z mechanizmów animacji z biblioteki Allegro. Rozdzielczość takiego ekranu jest wielokrotnością ekranu rzeczywistego. Jeśli program nie korzysta z mechanizmów animacji, to te argumenty powinny mieć wartość zero. Funkcja set_gfx_mode() zwraca wartość typu int. Jeśli jest ona różna od zera, to znaczy, że przełączenie do trybu graficznego nie powiodło się. Finalizację pracy biblioteki Allegro przeprowadza bezargumentowa funkcja allegro_exit(), która nie zwraca żadnej wartości. W programie korzystającym z tej biblioteki należy użyć makra end_of_main zaraz za definicją funkcji main(). Nie przyjmuje ono żadnych argumentów i wykonuje operacje związane z obsługą różnych systemów operacyjnych, na których biblioteka Allegro może być użyta. 7 / 28

Inicjacja i finalizacja Organizacja obrazu W trybie graficznym obraz na ekranie podzielony jest na punkty nazywane pikselami. Program używający biblioteki Allegro ma dostęp do ekranu za pomocą zmiennej globalnej o nazwie screen, która jest typu bitmap *, gdzie bitmap jest typem struktury opisującej zbiór pikseli nazywanych bitmapą. Liczbę pikseli w obrazie widocznym na ekranie monitora określają dwie stałe: screen_h - liczba pikseli w pionie, screen_w - liczba pikseli w poziomie. Każdy z pikseli na ekranie ma współrzędne, których składowe są liczbami naturalnymi. Punkt początkowy układu współrzędnych jest w lewym górnym rogu ekranu. Składowe poziome współrzędnych rosną od strony lewej do prawej. Wartość maksymalna dla nich to screen_w-1. Wartości składowych pionowych rosną od góry ku dołowi. Wartość maksymalna dla nich to screen_h-1. Punkt początkowy ma współrzędne (0, 0). 8 / 28

Rysowanie prymitywów Rysowanie prymitywów Prosty element obrazu graficznego nazywa się w grafice komputerowej prymitywem. Najprostszym z nich jest piksel. Funkcja put_pixel() służy do zmiany koloru pojedynczego piksela. Pierwszym argumentem tej funkcji jest wskaźnik na strukturę bitmapy (bitmap *), w której należy zmienić kolor piksela. Najczęściej tym wskaźnikiem jest screen. Dwa kolejne argumenty są typu int i stanowią składową poziomą i pionową współrzędnych piksela, którego kolor ma być zmieniony. Wartości współrzędnych są liczone względem lewego górnego rogu bitmapy, który ma zawsze współrzędne (0, 0). Czwarty argument jest również typu int i jest to kod koloru. Można go uzyskać na kilka sposobów. Najczęstszym jest zastosowanie funkcji makecol(), która przyjmuje trzy argumenty typu int. Są to odpowiednio: składowa czerwona, zielona i niebieska wynikowego koloru piksela. Pomimo posiadanego typu wartości te powinny należeć do zakresu od 0 do 255. Wartością zwracaną przez tą funkcję jest kod koloru o typie int. Inny sposób, to skorzystanie z palety 256 kolorów zapisanych w tablicy palette_color. Każdy element tej tablicy zawiera kod koloru. 9 / 28

Rysowanie prymitywów Rysowanie prymitywów Odcinek może być narysowany na obrazie za pomocą funkcji line(). Przyjmuje ona sześć argumentów wywołania. Pierwszy argument to wskaźnik na strukturę bitmapy. Dwa kolejne, typu int, to współrzędne piksela początkowego odcinka, a dwa kolejne, tego samego typu, to współrzędne piksela końcowego. Ostatni argument jest kodem koloru odcinka. Okrąg rysowany jest przez funkcję circle(), która przyjmuje pięć argumentów. Pierwszym jest wskaźnik na bitmapę. Pozostałe mają typu int. Drugi i trzeci argument to współrzędne środka okręgu, czwarty to długość promienia, a piąty jest kodem koloru. Prostokąt, w tym kwadrat, rysowany jest funkcją rect(). Przyjmuje ona sześć argumentów wywołania. Pierwszy jest wskaźnikiem na bitmapę. Dwa kolejne, typu int to współrzędne lewego górnego rogu rysowanego prostokąta, a dwa kolejne, tego samego typu, to współrzędne prawego dolnego roku. Ostatni argument, też typu int to kod koloru rysowanego prostokąta. Wszystkie funkcje rysujące prymitywy nie zwracają żadnych wartości. 10 / 28

Obsługa klawiatury Obsługa klawiatury Obsługę klawiatury inicjuje bezargumentowa funkcja install_keyboard(). Jeśli zwróci ona wartość różną od zera, to będzie to oznaczało, że nie udało się zainicjować obsługi klawiatury. Informacje o naciśniętych klawiszach nie są bezpośrednio odczytywane z klawiatury, ale z fragmentu pamięci operacyjnej komputera, który nazywa się buforem klawiatury. Do sprawdzania, czy w buforze znajdują się informacje o jakimkolwiek naciśniętym klawiszu służy bezargumentowa funkcja keypressed(). Zwraca ona liczbę typu int. Jeśli jest ona zerem, to znaczy że bufor klawiatury jest pusty. Informację o naciśniętym klawiszu z bufora klawiatury zwraca bezargumentowa funkcja readkey(). Wartością przez nią zwracaną jest liczba typu int, której najmłodszy bajt zawiera kod ascii znaku związanego z klawiszem, a bajt znajdujący się przed nim jest kodem klawisza (ang. scancode). Dosyć często ta funkcja jest wykorzystana do zatrzymywania działania programu do czasu naciśnięcia przez użytkownika dowolnego klawisza. Należy jednak pamiętać, że niektóre klawisze zapisują do bufora klawiatury więcej niż dwa bajty informacji, w związku z czym ta funkcja nie zawsze się zatrzyma. 11 / 28

Obsługa klawiatury Obsługa klawiatury Aby uniknąć sytuacji opisanej pod koniec poprzedniego slajdu należy zadbać, aby readkey(), jeśli ma blokować wykonanie programu, była zawsze wywoływana, kiedy bufor klawiatury jest pusty. Należy zatem wywoływać przed nią bezargumentową funkcję clear_keybuf(), która czyści ten bufor. Stan poszczególnych klawiszy na klawiaturze można również zbadać za pomocą tablicy o nazwie key. Jej elementy są typu char i opisują stan każdego z klawiszy klawiatury. Jeśli dany element ma wartość różną od zera, to znaczy to, że klawisz związany z tym elementem jest wciśnięty. Wartości indeksów tej tablicy zostały opisane stałymi o przedrostu key_, np.: key_esc to indeks elementu tablicy key odpowiadający klawiszowi Escape, a key_q to indeks elementu związanego z klawiszem q. Opis innych takich stałych można znaleźć w dokumentacji na stronie, której adres został podany na początku wykładu. 12 / 28

Animacja Animacja Biblioteka Allegro dostarcza mechanizmów pozwalających szybko rysować na ekranie monitora kolejne klatki obrazu przedstawiającego ruch. Minimalna częstotliwość wyświetlania klatek na ekranie, przy której mózg człowieka ma wrażenie, że widzi płynny ruch, wynosi 24 klatki na sekundę. Taki wymóg można spełnić stosując mechanizm stron biblioteki Allegro. Strona to bitmapa, na której jest rysowana pojedyncza klatka animacji. Allegro zapewnia mechanizm szybkiej zamiany takich stron. Jego działanie zostanie opisane dla przypadku, kiedy dostępne są dwie strony. Podczas gdy zawartość pierwszej jest wyświetlana na ekranie na drugiej jest rysowana kolejna klatka animacji. Następnie te strony zamieniane są miejscami - pierwsza jest odwzorowywana na ekranie, a na drugiej jest rysowana następna klatka animacji. Proces ten powtarzany jest tak długo, jak długo trwa animacja. 13 / 28

Animacja Animacja Biblioteka Allegro dostarcza kilku funkcji, które obsługują mechanizm stron. Do tworzenia bitmapy służy funkcja create_bitmap() przyjmuje ona dwa argumenty wywołania typu int, które określają, odpowiednio liczbę pikseli w poziomie i w pionie w tworzonej bitmapie. Zwraca ona wskaźnik na strukturę bitmapy. Tak utworzona bitmapa musi zostać usunięta przed zakończeniem programu lub przed zmianą trybu graficznego. Usuwaniem bitmap zajmuje się funkcja destroy_bitmap(), która jako parametr wywołania przyjmuje wskaźnik na strukturę opisującą bitmapę do usunięcia. Ta funkcja nie zwraca żadnej wartości. Aby wyczyścić bitmapę (ustawić kolor wszystkich jej pikseli na kolor, domyślnie, czarny) należy użyć funkcji clear_bitmap() przyjmującej jako argument wywołania wskaźnik na bitmapę. Funkcja ta nie zwraca żadnej wartości. Funkcja show_video_bitmap() odwzorowuje na ekranie bitmapę opisaną strukturą, na którą wskaźnik został jej przekazany jako argument wywołania. Zwraca ona liczbę typu int. Jeśli jej wartość jest różna od zera, to oznacza to, że odwzorowanie się nie powiodło. 14 / 28

Wyświetlanie tekstu Wyświetlanie tekstu Biblioteka Allegro dostarcza kilku funkcji, które pozwalają na umieszczenie tekstu na ekranie. Tutaj zostaną przedstawione dwie z nich. Funkcja textout_centre_ex() przyjmuje siedem argumentów wywołania. Pierwszym jest wskaźnik na strukturę bitmapy, drugim wskaźnik na strukturę opisującą font jaki posłuży do złożenia tekstu (font *), trzecim wskaźnik na tekst do wypisania (char *). Dwa kolejne argumenty, typu int, to współrzędne piksela, który stanowi środek wypisywanego tekstu. Kolejny argument to kod koloru wypisywanego tekstu (typ int), a ostatni to kod koloru tła (również typ int). Jeśli wartość ostatniego argumentu będzie wynosiła -1, to tło tekstu będzie przezroczyste. Jako drugi argument opisywanej funkcji może zostać przekazana zmienna globalna font będąca wskaźnikiem na strukturę opisującą domyślny font używany przez bibliotekę Allegro. Funkcja textout_centre_ex() nie zwraca żadnej wartości. 15 / 28

Wyświetlanie tekstu Wyświetlanie tekstu Funkcja textprintf_ex() jest kolejną, która umieszcza tekst na bitmapie. Podobnie jak funkcja opisana na poprzednim slajdzie, jako dwa pierwsze argumenty przyjmuje ona wskaźniki na struktury opisujące odpowiednio bitmapę i font. Kolejne dwa argumenty, typu int są współrzędnymi punktu na bitmapie, od którego funkcja ma rozpocząć wypisywanie tekstu. Następne dwa argumenty są również typu int. Pierwszy z nich jest kodem koloru tekstu, a drugi koloru tła. Jeśli wartość tego ostatniego wynosi -1, to tło tekstu będzie przezroczyste. Pozostałe argumenty wywołania tej funkcji są takie same jak dla funkcji printf(). Funkcja textprintf_ex() nie zwraca żadnej wartości. 16 / 28

Przykład - prosta grafika Przykład Na poprzednich slajdach zostały zaprezentowane jedynie te elementy biblioteki Allegro, które zostaną wykorzystane w przykładowych programach zaprezentowanych na tym i następnym wykładzie. Mimo, że jest ich niewiele, to za ich pomocą można stworzyć interesujące programu wykorzystujące grafikę 2D. Jako przykład zostanie zaprezentowany na tym wykładzie program rysujący w trybie pełnoekranowym różnokolorowe okręgi do czasu naciśnięcia przez użytkownika dowolnego klawisza na klawiaturze. Zarówno współrzędne środka, jak i długość promienia oraz kolor tych okręgów są pseudolosowe. 17 / 28

Przykład - prosta grafika Przykład #include<allegro.h> #include<allegro/keyboard.h> #include<stdlib.h> #include<time.h> #define WIDTH 1366 #define HEIGHT 768 18 / 28

Przykład - komentarz Przykład Na początku kodu źródłowego programu umieszczone są cztery dyrektywy preprocesora włączające pliki nagłówkowe. Pierwsze dwa z nich zostały opisane na wstępnie wykładu. Plik stdlib.h został włączony, bo zawiera deklarację funkcji realizujących generator liczb pseudolosowych. Ostatni nagłówek zawiera funkcję time() pozwalającą odczytać bieżący czas jako liczbę typu int. Wartość ta posłuży do zainicjowania generatora liczb pseudolosowych. Zdefiniowane stałe width i height określają odpowiednio liczbę pikseli w poziomie i w pionie obrazu wyświetlanego na monitorze w trybie pełnoekranowym, czyli rozdzielczość tego monitora. 19 / 28

Przykład - prosta grafika Przykład int initialize(int card, int width, int height) { srand(time(null)); if(allegro_init()) { allegro_message("allegro_init(): %s\n",allegro_error); allegro_exit(); return -1; } if(install_keyboard()) { allegro_message("install_keyboard(): %s\n",allegro_error); allegro_exit(); return -1; } set_color_depth(32); if(set_gfx_mode(card,width,height,0,0)) { allegro_message("set_gfx_mode(): %s\n",allegro_error); allegro_exit(); return -1; } return 0; } 20 / 28

Przykład - komentarz Przykład Funkcja initialize() odpowiedzialna jest za wykonanie inicjacji generatora liczb pseudolosowych, pracy biblioteki Allegro i obsługi klawiatury. Następnie określa ona przestrzeń kolorów (32 bitowa) oraz przełącza monitor w odpowiedni tryb graficzny. Wszystko to odbywa się poprzez użycie funkcji opisanych na poprzednich slajdach. Funkcja initialize() posiada trzy parametry typu int. Pierwszy to wartość określająca sterownik karty graficznej. Za ten parametr w miejscu wywołania funkcji będzie podstawiona jedna ze stałych wymienionych w opisie funkcji set_gfx_mode(). Dwa pozostałe określają rozdzielczość obrazu na ekranie. Warto zwrócić uwagę na dwa ostatnie argumenty wywołania funkcji set_gfx_mode(). Ponieważ nie będą wykorzystywane mechanizmy animacji biblioteki, to ich wartość wynosi zero. Jeśli nie powiedzie się działanie którejś z funkcji używanych przez initialize(), to użytkownik jest informowany o tym za pośrednictwem funkcji allegro_message(), która podaje kod zaistniałego błędu. Następnie wywoływana jest funkcja finalizująca działanie biblioteki Allegro i funkcja initialize() zwraca wartość -1 oraz kończy działanie. Jeśli wszystkie czynności inicjujące zakończą się prawidłowo, to funkcja ta zwróci zero. 21 / 28

Przykład - prosta grafika Przykład void draw_random_circles(bitmap* bitmap) { clear_keybuf(); while(!keypressed()) { int colour = makecol(random()%256,random()%256,random()%256); circle(bitmap,random()%screen_w,random()%screen_h,random()%50,colour); } } 22 / 28

Przykład - komentarz Przykład Funkcja draw_random_circles() zgodnie ze swoją nazwą wykonuje główną czynność w programie. Nie zwraca ona żadnej wartości, ale ma jeden parametr, przez który przekazywany jest wskaźnik na strukturę opisującą bitmapę, na której mają być rysowane okręgi. Pierwszą czynnością wykonywaną wewnątrz tej funkcji jest wywołanie funkcji czyszczącej zawartość bufora klawiatury. Następnie w pętli while ustalany jest kolor rysowanego okręgu poprzez wylosowanie z osobna wartości z zakresu od 0 do 255 dla każdej z jego składowych i przekazanie ich do wywołania funkcji makecol(), która wyliczy z nich kod koloru. Ten kod jest zapisywany w zmiennej colour. Okrąg jest rysowany za pomocą wywołania funkcji circle(). Jej pierwszym argumentem wywołania jest parametr funkcji draw_random_circles(), który jest wskaźnikiem na strukturę opisującą bitmapę. Składowe współrzędnych środka tego okręgu są losowane z zakresu od 0 do screen_w-1 (poziom) i od 0 do screen_h-1 (pion). Długość promienia z kolei losowana jest z przedziału od 0 do 49. Oznacza to, że niektóre okręgi w ogóle nie zostaną narysowane (promień równy 0) lub będą częściowo wystawać poza ekran, ze względu na położenie ich środka. 23 / 28

Przykład - komentarz Przykład Pętla while, w której wybierany jest kolor i rysowany jest okrąg, kończy się po naciśnięciu przez użytkownika dowolnego klawisza na klawiaturze. 24 / 28

Przykład - prosta grafika Przykład int main(void) { if(initialize(gfx_autodetect_fullscreen,width,height)) return -1; draw_random_circles(screen); allegro_exit(); return 0; } END_OF_MAIN() 25 / 28

Przykład - komentarz Przykład W funkcji main() najpierw wywoływana jest funkcja initialize(). Pierwszym argumentem jej wywołania jest stała gfx_autodetect_fullscreen, co oznacza, że wywoływana w ramach initialize(), set_gfx_mode() będzie próbowała włączyć pełnoekranowy tryb graficzny. Jego rozdzielczość jest określona wartościami stałych width i height, które są przekazywane do initialize() jako drugi i trzeci argument jej wywołania. Następnie wywoływana jest funkcja draw_random_circles(), do której przekazywana jest zmienna screen jako argument wywołania. Oznacza to, ze wszystkie operacje graficzne wykonywane w ramach tej funkcji będą odwzorowywane bezpośrednio na ekranie monitora. Po jej zakończeniu zostanie wywołana funkcja allegro_exit(), która dokona finalizacji pracy biblioteki Allegro. Proszę zwrócić uwagę na użycie po definicji funkcji main() makra end_of_main. 26 / 28

Pytania Zakończenie? 27 / 28

koniec Zakończenie Dziękuję Państwu za uwagę. 28 / 28