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



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

Obsługa myszy oraz tekst Korzystanie z myszki oraz wyświetlanie tekstu na przykładzie prostej klasy buttona. : )

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

Rysowanie punktów na powierzchni graficznej

Kurs WWW. Paweł Rajba.

Obsługa programu Paint materiały szkoleniowe

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

Podstawy Processingu. Diana Domańska. Uniwersytet Śląski

CorelDraw - wbudowane obiekty wektorowe - prostokąty Rysowanie prostokątów

Simba 3D LOGO. Cele zajęć: - Poznanie zasad i sposobów tworzenia procedur z parametrami. - Poznanie zasad wywoływania procedur z parametrami.

Janusz Ganczarski. OpenGL Pierwszy program

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

Opis implementacji: Poznanie zasad tworzenia programów komputerowych za pomocą instrukcji języka programowania.

Grafika Komputerowa Materiały Laboratoryjne

Java. Wykład 9. Piotr Tronczyk

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

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

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

8. Dynamiczne generowanie grafiki, cz. 2

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

Paweł Kaźmierczak. styczeń 2009

Wizualne systemy programowania. Wykład 11 Grafika. dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD

1 Podstawy c++ w pigułce.

Geometria wykreślna. 5. Obroty i kłady. Rozwinięcie wielościanu. dr inż. arch. Anna Wancław. Politechnika Gdańska, Wydział Architektury

KGGiBM GRAFIKA INŻYNIERSKA Rok III, sem. VI, sem IV SN WILiŚ Rok akademicki 2011/2012

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

Zadanie 1. Ściana. 1. Potrzebne zmienne w dołączonym do zadania kodzie źródłowym

PODSTAWY > Figury płaskie (1) KĄTY. Kąt składa się z ramion i wierzchołka. Jego wielkość jest mierzona w stopniach:

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 6. Karol Tarnowski A-1 p.

Temat: Transformacje 3D

TWORZENIE OBIEKTÓW GRAFICZNYCH

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

WIZUALIZACJA INFORMACJI TEKSTOWEJ WSTĘP DO HTML 5 CANVAS

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

Ćwiczenie 14 Dmuchawce

Praktyka programowania projekt

Szybkie tworzenie grafiki w GcIde

Odwrócimy macierz o wymiarach 4x4, znajdującą się po lewej stronie kreski:

I. Wstawianie rysunków

KONSTRUKCJA TRÓJKĄTA 1 KONSTRUKCJA TRÓJKĄTA 2 KONSTRUKCJA CZWOROKĄTA KONSTRUKCJA OKRĘGU KONSTRUKCJA STYCZNYCH

Programowanie komputerowe. Zajęcia 4

Kurs Adobe Photoshop Elements 11

Język programowania zbiór reguł określających, które ciągi symboli tworzą program komputerowy oraz jakie obliczenia opisuje ten program.

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.

WASM AppInventor Lab 3. Rysowanie i animacja po kanwie PODSTAWY PRACY Z KANWAMI

Obsługa wyświetlaczy graficznych z wbudowanym kontrolerem S6B1713, część 2 Przykłady dla mikrokontrolera AT91SAM7S256

Politechnika Warszawska Wydział Mechatroniki Instytut Automatyki i Robotyki

Obcinanie grafiki do prostokąta

Uzyskanie podkładu topograficznego z Geoportalu przy użyciu biblioteki GDAL. Krzysztof Kochan

Część 4 życie programu

Wstęp. Opis programu :

3.9 Tworzenie rysunku kurczaka

Tworzenie logo. Omówione zagadnienia

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.

Laboratorium 1: Szablon strony w HTML5

Animacje cz. 2. Rysujemy koło zębate

Rysowanie precyzyjne. Polecenie:

Tik Z wiadomości wstępne

PROJEKT WIZYTÓWKI WIZYTÓWKA A

" Przekształcenia. 1. Korzystamy z narzędzi Wielokąt i Krzywa. 3. Zmieniamy rozmiar obrazu i pochylamy go

Jarosław Kuchta Podstawy Programowania Obiektowego. Podstawy grafiki obiektowej

Kurs programowania. Wykład 6. Wojciech Macyna. 7 kwietnia 2016

Ćwiczenie 2 Warstwy i kształty podstawowe

4. Rysowanie krzywych

3 Przygotował: mgr inż. Maciej Lasota

Geometria wykreślna. 2. Elementy wspólne. Cień jako rzut środkowy i równoległy. dr inż. arch. Anna Wancław. Politechnika Gdańska, Wydział Architektury

Logo Komeniusz. Gimnazjum w Tęgoborzy. Mgr Zofia Czech

Algorytm selekcji Hoare a. Łukasz Miemus

GRAFIKA KOMPUTEROWA 7: Kolory i cieniowanie

O czym należy pamiętać?

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

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Prostokąt. AutoCAD pozwala na szybkie rysowanie figur o czterech bokach prostokątów. Do tego celu służy funkcja Prostokąt. Funkcję tą można wywołać:

Ćw. I Projektowanie opakowań transportowych cz. 1 Ćwiczenia z Corel DRAW

B Biblioteka GD. B.1 Koncepcja biblioteki GD.

Zajęcia nr 15 JavaScript wprowadzenie do JavaScript

LOGO KOMENIUSZ PODSTAWOWE KOMENDY W LOGO KOMENIUSZ:

INSTYTUT INFORMATYKI STOSOWANEJ MODELOWANIE CZĘŚCI Z WYKORZYSTANIEM PROGRAMU SOLID EDGE

Ćwiczenia GIMP. S t r o n a Uruchom program gimp: 2. I program się uruchomił:

1 Podstawy c++ w pigułce.

W niniejszym samouczku przedstawiono sposób tworzenia logo dla wymyślonej kawiarni. Tak będzie wyglądać ostateczny efekt pracy:

I. Menu oparte o listę

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Zastosowania informatyki w geologii ćwiczenia 1,2 INKSCAPE 1

PROSTY PROGRAM DO MALOWANIA

Baltie 2010 etap szkolny, zadania dla kategorie A, B

Spis treści. Włodzimierz Gajda

Symbole graficzne. 1. Rezystor Rysujemy symbol graficzny rezystora

IX. Wskaźniki.(3 godz.)

2 Przygotował: mgr inż. Maciej Lasota

Zadanie I. 2. Gdzie w przestrzeni usytuowane są punkty (w której ćwiartce leży dany punkt): F x E' E''

grafika 2D i animacja obsługa rotacji i elementy 3D-OpenGL w Androidzie

Ćwiczenie 1 Automatyczna animacja ruchu

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

Języki formalne i automaty Ćwiczenia 5

Ćwiczenie dodatkowe - Wybrane narzędzia modelowania Zadanie Przygotować model stołu z krzesłami jak na rysunku poniżej(rys. 1).

Ikona aplikacji. Ikona aplikacji to grafika wyświetlająca się na ekranie ipada. Służy do uruchomienia aplikacji Salesbook.

Układ scalony UL 1111

Transkrypt:

Przyszedł czas na rysowanie własnych figur, czyli prymitywy, obracanie bitmap, oraz alpha blending-czyli półprzezroczystość. Będę opisywał tylko rzeczy nowe-nie ma potrzeby abym się powtarzał. Zaczynajmny więc. : ) Druga aplikacja Prymitywy, alpha blending, obracanie bitmap oraz mały zestaw przydatnych funkcji wyświetlających własnej roboty. Na początku oprócz naszego bufora deklarujemy także bitmapę o jakże oryginalnej nazwie bitmapa. Posłuży nam ona za płótno, na którym będziemy malować nasze prymitywy. Będziemy potrzebowali również dwóch pomocniczych zmiennych: angle oraz alpha, obie najlepiej zmiennoprzecinkowe. Pierwsza z nich będzie pamietała kąt obrotu naszego sprita(na początku najlepiej ją wyzerować), a druga będzie robiła za składową alpha. Cóż to takiego? Otóż alfa to czwarta składowa koloru i oznacza poziom widoczności piksela. 255 to pełna widoczność, 0 to całkowity jej brak. Następnie w funkcji load() tworzymy sobie naszą bitmapkę(proponuję rozmiar 100x100), oraz wyczyścimy ją na różowo(255,0,255), aby przy rysowaniu nie było widać tła. Teraz pokolorujemy ją: circlefill(bitmapa,50,50,45,makecol(200,200,0)); ellipsefill(bitmapa,30,30,15,10,makecol(255,255,255)); circlefill(bitmapa,30,30,5,makecol(0,0,0)); ellipsefill(bitmapa,70,30,15,10,makecol(255,255,255)); circlefill(bitmapa,70,30,5,makecol(0,0,0)); rectfill(bitmapa,30,70,70,80,makecol(255,0,0)); rectfill(bitmapa,10,00,90,15,makecol(0,0,0)); triangle(bitmapa,40,60,60,60,50,35,makecol(180,180,0)); Pojawiają się tu nowe funkcje, więc omówię je: void circlefill(bitmap *bmp, int x, int y, int radius, int color); Rysuje koło. Jako argumenty pobiera bitmapę docelową, współrzędne środka koła, jego promień oraz kolor. void ellipsefill(bitmap *bmp, int x, int y, int rx, int ry, int color); Rysuje wypełnioną elipsę. Jako argumenty pobiera to samo, co circlefill, z tą różnicą, że tu musimy podać dwa promienie: poziomy oraz pionowy. void rectfill(bitmap *bmp, int x1, int y1, int x2, int y2, int color); Rysuje wypełniony prostokąt. Jako argumenty pobiera bitmapę docelową, współrzędne lewego górnego i prawego dolnego wierzchołka oraz kolor. void triangle(bitmap *bmp, int x1, y1, x2, y2, x3, y3, int color); Rysuje wypełniony trójkąt. Jako argumenty przyjmuje bitmapę docelową, współrzędne trzech wierzchołków oraz kolor. Funkcji rysujących prymitywy jest oczywiście wiele więcej, należy ich szukać w dokumentacji(dla niepełnosprawnych link: http://www.allegro.cc/manual/api/drawing-primitives/ ). Przyszedł czas na wyświetlenie naszego obrazka. W tym celu napiszemy sobie kilka pomocniczych funkcji, takich jak:

void draw_centre_sprite(bitmap *dest, BITMAP *sprite, float x, float y); void draw_centre_trans_sprite(bitmap *dest, BITMAP *sprite, float x, float y, float alpha); void rotate_centre_sprite(bitmap *dest, BITMAP *sprite, float x, float y, fixed angle); void rotate_trans_sprite(bitmap *dest, BITMAP *sprite, float x, float y, fixed angle, float a); void rotate_centre_trans_sprite(bitmap *dest, BITMAP *sprite, float x, float y, fixed angle, float a); Dość łatwo domyślić się co one robią: draw_centre_sprite rysuje sprite tak, aby jego środek wypadł w podanej pozycji(w normalnym draw_sprite w podanej pozycji wypada lewy górny wierzchołek sprita). draw_centre_trans_sprite robi to samo, co draw_centre_sprite, tylko, że wykorzystując alphablending. Następne trzy analogicznie, z tym, że dodatkowo obracają obrazek. void draw_centre_sprite(bitmap *dest, BITMAP *sprite, float x, float y) draw_sprite(dest,sprite,x-sprite->w/2,y-sprite->h/2); Ciało tej funkcji jest chyba dość zrozumiałe-wywołujemy zwykłe draw_sprite odejmując od x połowę szerokości obrazka, a od y połowę wysokości. void draw_centre_trans_sprite(bitmap *dest, BITMAP *sprite, float x, float y, float alpha) set_trans_blender(255,255,255,alpha); draw_trans_sprite(dest,sprite,x-sprite->w/2,y-sprite->h/2); Tu już pojawia się coś nowego. Funkcja void set_trans_blender(int r, int g, int b, int a) przygotowuje nas do blendingu. My wykorzystujemy alpha-blending, więc zmieniamy tylko alphę. void draw_trans_sprite(bitmap *bmp, BITMAP *sprite, int x, int y); zaś robi to samo co, zwykły draw_sprite, tylko, że wykorzystuje blending. void rotate_centre_sprite(bitmap *dest, BITMAP *sprite, float x, float y, fixed angle) rotate_sprite(dest,sprite,x-sprite->w/2,y-sprite->h/2,angle); Ta funkcja jest bardzo podobna do draw_centre_sprite. Jedyne czym się róźni to to, że wykorzystuje nową instrukcję void rotate_sprite(bitmap *bmp, BITMAP *sprite, int x, int y, fixed angle). Jako argumenty pobiera ona dokładnie to samo, co draw_sprite(), z tą różnicą, że dodatkowo potrzebuje kąta obrotu obrazka. Jest on w jednostkach z zakresu 0-255, do tego musi zostać przekonwertowany do allegrowskiego formatu fixed-pomoże nam w tym funkcja fixed itofix(int x) konwertująca inty na fixed. void rotate_trans_sprite(bitmap *dest, BITMAP *sprite, float x, float y, fixed angle, float a) temp=create_bitmap(sprite->w*2,sprite->h*2); draw_trans_sprite(dest,temp,x-sprite->w/2,y-sprite->h/2); Ta funkcja jest już bardziej skomplikowana-rysuje nam obrócony obrazek wykorzystując alphablending. Na początku wywołujemy set_trans_blender przygotowując allegro do wykorzystania blendingu, później tworzymy tymczasową bitmapę temp. Następnie tworzymy ją nadając jej rozmiar 2h*2w, gdzie w i h to wymiary naszego sprita, ponieważ obrazek po obróceniu może zmienić

wymiary swojego AABB(axis-aligned bounding box-prostokąta o bokach równoległych do osi opisanego na naszym obrazku). Czyścimy naszą bitmapę na różowo, aby ukryć jej tło, po czym rysujemy na niej nasz obrazek obracając go. Teraz rysujemy naszą tymczasową bitmapkę i usuwamy ją. void rotate_centre_trans_sprite(bitmap *dest, BITMAP *sprite, float x, float y, fixed angle, float a) temp=create_bitmap(sprite->w*2,sprite->h*2); draw_trans_sprite(dest,temp,x-sprite->w,y-sprite->h); Ta funkcja od poprzedniej różni się tylko tym, że przy rysowaniu odejmując wymiary obrazka od x i y nie dzielimy ich przez 2. Gotowe. Teraz w końcu narysujemy sobie naszą bitmapkę w kilku wariantach (oczywiście w funkcji draw()). rotate_sprite(bufor,bitmapa,100,100,itofix(angle)); rotate_trans_sprite(bufor,bitmapa,200,100,itofix(angle),alpha); rotate_centre_trans_sprite(bufor,bitmapa,200,100,itofix(-angle),255-alpha); Na początku rysujemy naszą bitmapkę bez żadnych udziwnień-poprostu ją obracamy. Następnie wykorzystujemy naszą funkcję, aby narysować obrazek obrócony wykorzystując alpha-blending. Na końcu rysujemy naszą bitmapę centralnie w podanym miejscu, do tego obracając ją w drugą stronę i wykorzystując odwrotność alphy. W funkcji logic() dodamy możliwość ruszania naszymi obrazkami: if(key[key_left]) angle-=2; if(key[key_right]) angle+=2; if(key[key_up]) alpha+=10; if(key[key_down]) alpha-=10; if(alpha>255) alpha=255; if(alpha<0) alpha=0; Myślę, że nie muszę tego tłumaczyć. Na końcu standardowo sprzątamy po naszym programieusuwamy bitmapy oraz zamykamy allegro. Oto screen z programu i kod:

#include <allegro.h> #pragma comment(lib,"alleg.lib") #define WIDTH 800 #define HEIGHT 600 BITMAP *bufor; BITMAP *bitmapa; float angle=0; float alpha=128; int ticks=0; bool wyjscie; void timerproc() ticks++; void draw_centre_sprite(bitmap *dest, BITMAP *sprite, float x, float y) draw_sprite(dest,sprite,x-sprite->w/2,y-sprite->h/2); void draw_centre_trans_sprite(bitmap *dest, BITMAP *sprite, float x, float y, float alpha) set_trans_blender(255,255,255,alpha); draw_trans_sprite(dest,sprite,x-sprite->w/2,y-sprite->h/2);

void rotate_centre_sprite(bitmap *dest, BITMAP *sprite, float x, float y, fixed angle) rotate_sprite(dest,sprite,x-sprite->w/2,y-sprite->h/2,angle); void rotate_trans_sprite(bitmap *dest, BITMAP *sprite, float x, float y, fixed angle, float a) temp=create_bitmap(sprite->h*2,sprite->w*2); draw_trans_sprite(dest,temp,x-sprite->w/2,y-sprite->h/2); void rotate_centre_trans_sprite(bitmap *dest, BITMAP *sprite, float x, float y, fixed angle, float a) temp=create_bitmap(sprite->w*2,sprite->h*2); draw_trans_sprite(dest,temp,x-sprite->w,y-sprite->h); void init() allegro_init(); install_keyboard(); set_color_depth(32); set_gfx_mode(gfx_autodetect_windowed, WIDTH, HEIGHT, 0, 0); install_int(timerproc,30); void load() bufor=create_bitmap(width,height); bitmapa=create_bitmap(100,100); clear_to_color(bitmapa,makecol(255,0,255)); circlefill(bitmapa,50,50,45,makecol(200,200,0)); ellipsefill(bitmapa,30,30,15,10,makecol(255,255,255)); circlefill(bitmapa,30,30,5,makecol(0,0,0)); ellipsefill(bitmapa,70,30,15,10,makecol(255,255,255)); circlefill(bitmapa,70,30,5,makecol(0,0,0)); rectfill(bitmapa,30,70,70,80,makecol(255,0,0)); rectfill(bitmapa,10,00,90,15,makecol(0,0,0)); triangle(bitmapa,40,60,60,60,50,35,makecol(180,180,0)); void draw() clear_to_color(bufor,makecol(0,0,255)); rotate_sprite(bufor,bitmapa,100,100,itofix(angle)); rotate_trans_sprite(bufor,bitmapa,200,100,itofix(angle),alpha); rotate_centre_trans_sprite(bufor,bitmapa,200,100,itofix(-angle),255-alpha); blit(bufor,screen,0,0,0,0,width,height);

void logic() if(key[key_left]) angle-=2; if(key[key_right]) angle+=2; if(key[key_up]) alpha+=10; if(key[key_down]) alpha-=10; if(alpha>255) alpha=255; if(alpha<0) alpha=0; if(key[key_esc]) wyjscie=true; void release() destroy_bitmap(bitmapa); destroy_bitmap(bufor); allegro_exit(); int main() init(); load(); while(!wyjscie) draw(); while(ticks>0) logic(); ticks--; release(); return 0; END_OF_MAIN()