SFML (Simple and Fast Multimedia Library) I Przygotowanie do tworzenia programów z użyciem biblioteki SFML w środowisku Code::Blocks.... 2 II Struktura programu... 3 III Obiekty graficzne... 3 1. Podstawowe kształty, figury... 3 2. Kolory i przezroczystość... 4 3. Pozycja, obrót, skalowanie,... 5 4. Przykłady programów (odbicie od ścianek, podbijanie obiektu, odbijanie paletkami)... 8-1 -
I Przygotowanie do tworzenia programów z użyciem biblioteki SFML w środowisku Code::Blocks. 1. Otwarcie strony internetowej projektu: www.sfml-dev.org. 2. Wybór i pobranie najnowszej wersji biblioteki SFML (XII 2013 - wersja 2.1): GCC 4.7 TDM (SJLJ) - 32 bits [15.0MB] - dla środowiska Code::Blocks. 3. Rozpakowanie biblioteki (powstanie katalog o nazwie SFML-2.1) i umieszczenie w odpowiednim miejscu na dysku; przykładowa struktura katalogów: sfml SFML-2.1 (katalog biblioteki) p01_struktura (katalog projektu pierwszego) p02_kszt-graf (katalog projektu drugiego) 4. Konfiguracja Code::Blocks: a) Uruchomienie środowiska i utworzenie pustego projektu: File New Project Empty project Next > - wprowadzamy tytuł projektu [Project title] (np. struktura), który będzie później widoczny jako katalog projektu, - wskazujemy miejsce zapisu projektu [Folder to create project in] (np. katalog struktura), - zostanie utworzona nazwa startowego pliku projektu [Project filename]: struktura.cbp, - zostanie uzupełniona ścieżka jego umieszczenia [Resulting filename]. Next > Zostawiamy standardowe ustawienia: - kompilatora [Compiler] GNU GCC Compiler, - tworzonej konfiguracji [ Release, Debug ]. Finish. b) Tworzymy nowy pusty plik i dołączamy go do naszego (aktywnego) projektu pod nazwą main.cpp : File New Empty file [Add file to project] - Potwierdzamy Poprawiamy nazwę na main.cpp. Po lewej stronie na karcie Projects zostanie dodany katalog Sources z utworzonym przez nas plikiem main.cpp. c) Dostosowanie projektu i środowiska do pracy z biblioteką SFML: Ustalenie czy ma się pojawiać okienko tekstowe: Project Properties zakładka [Builds targets] dla trybu kompilacji Release oraz Debug - ustawienie [Type] na [GUI application] zamiast [Console application]. Wskazanie na odpowiednie katalogi w bibliotece SFML: Project Build options zakładka [Search directories] dla trybu kompilacji Release oraz Debug, przycisk [Add]: - w zakładce [Compiler] - ścieżka do katalogu include biblioteki SFML, - w zakładce [Linker] - ścieżka do katalogu lib biblioteki SFML; proponuję wybrać ścieżkę względną [ relative path]. Wskazanie na dołączane pliki bibliotek (*.dll) do naszych projektów: Project Build options zakładka [Linker settings], przycisk [Add]: - dla trybu kompilacji Release : sfml-graphics, sfml-window, sfml-system,, - dla trybu kompilacji Debug : sfml-graphics-d, sfml-window-d, sfml-system-d,. Przekopiowanie plików: - dla trybu kompilacji Release : sfml-system-2.dll, sfml-window-2.dll, sfml-graphics-2.dll,, - dla trybu kompilacji Debug : sfml-system-d-2.dll, sfml-window-d-2.dll, sfml-graphics-d-2.dll,, znajdujących się w katalogu bin (będącym podkatalogiem SFML-2.1) do katalogu naszego projektu. Jeśli pliki bibliotek mają być włączane na stałe do pliku wykonywalnego, dołączamy je w postaci statycznej: - dla trybu kompilacji Release : sfml-graphics-s, sfml-window-s, sfml-system-s,, - dla trybu kompilacji Debug : sfml-graphics-s-d, sfml-window-s-d, sfml-system-s-d,. oraz w podanym niżej miejscu dodajemy wpis: SFML_STATIC: Project Build options zakładka [Compiler settings], zakładka [#defines]. d) Teraz możemy już wkleić treść programu z następnej strony do pliku main.cpp, zapisać program i po kompilacji i uruchomieniu zobaczyć efekt naszej pracy. Jeśli pojawi się okienko z wypełnionym na zielono kółeczkiem wszystko poszło OK. Jesteśmy przygotowani do korzystania z biblioteki SFML. - 2 -
II Struktura programu [p01_struktura] 4 RenderWindow okno(videomode(200,200),"okienko SFML!"); 5 CircleShape kolo(100); 6 kolo.setfillcolor(color::green); 7 while (okno.isopen()) { 8 Event zdarz; 9 while (okno.pollevent(zdarz)) { 10 if (zdarz.type == Event::Closed) okno.close(); 11 } 12 okno.clear(); 13 okno.draw(kolo); 14 okno.display(); 15 } 16 return 0; 17 } III Obiekty graficzne 1. Podstawowe kształty, figury [p02_kszt-graf] 4 RenderWindow okno(videomode(640,480),"okienko SFML!"); 5 CircleShape kolo1(240); kolo1.setfillcolor(color::cyan); 6 CircleShape kolo2(200,100); kolo2.setfillcolor(color::blue); 7 CircleShape trojkat(200,3); trojkat.setfillcolor(color::green); 8 CircleShape czworokat(200,4); czworokat.setfillcolor(color::red); 9 CircleShape pieciokat(200,5); pieciokat.setfillcolor(color::magenta); 10 RectangleShape prostokat(vector2f(160,70)); prostokat.setfillcolor(color::cyan); 11 RectangleShape kwadrat(vector2f(100,100)); kwadrat.setfillcolor(color::blue); 12 RectangleShape linia(vector2f(140,2)); linia.setfillcolor(color::magenta); 13 ConvexShape wielokat; 14 wielokat.setpointcount(5); 15 wielokat.setpoint(0,vector2f(470,360)); 16 wielokat.setpoint(1,vector2f(630,370)); 17 wielokat.setpoint(2,vector2f(580,450)); 18 wielokat.setpoint(3,vector2f(510,460)); 19 wielokat.setpoint(4,vector2f(470,420)); - 3 -
20 wielokat.setfillcolor(color::yellow); 21 while (okno.isopen()) { 22 Event zdarz; 23 while (okno.pollevent(zdarz)) { 24 if (zdarz.type == Event::Closed) okno.close(); 25 } 26 okno.clear(); 27 okno.draw(kolo1); 28 okno.draw(kolo2); 29 okno.draw(pieciokat); 30 okno.draw(czworokat); 31 okno.draw(trojkat); 32 prostokat.setposition(460,20); okno.draw(prostokat); 33 kwadrat.setposition(500,110); okno.draw(kwadrat); 34 linia.setposition(480,320); okno.draw(linia); 35 okno.draw(wielokat); 36 okno.display(); 37 } 38 return 0; 39 } 2. Kolory i przezroczystość [p03_kolor-przezr] 4 RenderWindow okno(videomode(400,400),"okienko SFML!"); 5 CircleShape kolo1(200,100); 6 kolo1.setfillcolor(color::cyan); 7 // Black, White, Red, Green, Blue, Cyan, Magenta, Yellow, Transparent 8 kolo1.setoutlinecolor(color(50,150,75)); 9 // zakres liczb: 0..255 (udzial: Red-50, Green-150, Blue-75) 10 kolo1.setoutlinethickness(5); 11 CircleShape kolo2(150,100); 12 kolo2.setfillcolor(color::transparent); 13 kolo2.setoutlinecolor(color::red); 14 kolo2.setoutlinethickness(3); 15 CircleShape kolo3(100,100); 16 kolo3.setfillcolor(color(0,0,200,75)); 17 kolo3.setoutlinecolor(color::blue); 18 kolo3.setoutlinethickness(1); 19 while (okno.isopen()) { 20 Event zdarz; 21 while (okno.pollevent(zdarz)) { 22 if (zdarz.type == Event::Closed) okno.close(); 23 } 24 okno.clear(); 25 okno.draw(kolo1); okno.draw(kolo2); okno.draw(kolo3); - 4 -
26 okno.display(); 27 } 28 return 0; 29 } 3. Pozycja, obrót, skalowanie, [p04_poz-przes] 4 RenderWindow okno(videomode(800,700),"okienko SFML!"); 5 CircleShape kolo1(40); 6 kolo1.setfillcolor(color::red); kolo1.setposition(20,20); 7 CircleShape kolo2(40); 8 kolo2.setfillcolor(color::green); kolo2.setposition(20,120); 9 CircleShape kolo3(40); kolo3.setfillcolor(color::blue); 10 CircleShape kolo4(40); kolo4.setfillcolor(color::magenta); 11 while (okno.isopen()) { 12 Event zdarz; 13 while (okno.pollevent(zdarz)) { 14 if (zdarz.type == Event::Closed) okno.close(); 15 } 16 okno.clear(); 17 okno.draw(kolo1); 18 kolo2.move(1,0); okno.draw(kolo2); 19 kolo3.setposition(20,120); 20 for (int i=0;i<5;i++) { kolo3.move(100,0); okno.draw(kolo3); } 21 kolo3.setposition(20,220); 22 for (int i=0;i<5;i++) { kolo3.move(i*10+100,0); okno.draw(kolo3); } 23 kolo3.setposition(20,320); 24 for (int i=0;i<5;i++) { 25 kolo3.move(i*10+100,0); kolo3.setradius(40-i*8); okno.draw(kolo3); } 26 kolo3.setposition(20,420); 27 for (int i=0;i<5;i++) { 28 kolo3.move(i*10+100,8); kolo3.setradius(40-i*8); okno.draw(kolo3); } 29 kolo3.setradius(40); 30 kolo4.setposition(20,520); 31 for (int i=0;i<5;i++) { 32 kolo4.move(i*10+100,0); kolo4.setpointcount(i+3); okno.draw(kolo4); } 33 okno.display(); 34 } 35 return 0; 36 } - 5 -
[p04a_los-obiekty] 4 int szer=1024, wys=768; 5 const int N=100; 6 int r[n], x[n], y[n], R[N], G[N], B[N]; 7 srand(time(null)); 8 for (int i=0;i<n;i++) { 9 r[i]=rand()%50; 10 x[i]=rand()%szer; y[i]=rand()%wys; 11 R[i]=rand()%256; G[i]=rand()%256; B[i]=rand()%256; } 12 RenderWindow okno(videomode(szer,wys),"okienko SFML!"); 13 CircleShape kolo(0); 14 kolo.setoutlinethickness(1); 15 while (okno.isopen()) { 16 Event zdarz; 17 while (okno.pollevent(zdarz)) { 18 if (zdarz.type == Event::Closed) okno.close(); } 19 okno.clear(); 20 for (int i=0;i<n;i++) { 21 kolo.setradius(r[i]); 22 kolo.setposition(x[i],y[i]); 23 kolo.setoutlinecolor(color(g[i],b[i],r[i])); 24 kolo.setfillcolor(color(r[i],g[i],b[i])); 25 okno.draw(kolo); } 26 okno.display(); 27 } 28 return 0; 29 } - 6 -
[p05_rozm-obrot] 4 RenderWindow okno(videomode(800,360),"okienko SFML!"); 5 RectangleShape prostokat(vector2f(160,80)); 6 prostokat.setfillcolor(color::green); 7 RectangleShape kwadrat1(vector2f(80,80)); 8 kwadrat1.setfillcolor(color::blue); 9 kwadrat1.setoutlinecolor(color::magenta); 10 kwadrat1.setoutlinethickness(1); 11 kwadrat1.setposition(140,220); 12 RectangleShape kwadrat2(vector2f(80,80)); 13 kwadrat2.setfillcolor(color::red); 14 kwadrat2.setoutlinecolor(color::yellow); 15 kwadrat2.setoutlinethickness(1); 16 kwadrat2.setposition(400,220); 17 while (okno.isopen()) { 18 Event zdarz; 19 while (okno.pollevent(zdarz)) { 20 if (zdarz.type == Event::Closed) okno.close(); 21 } 22 okno.clear(); 23 prostokat.setposition(20,20); 24 prostokat.setsize(vector2f(160,80)); okno.draw(prostokat); 25 for (int i=0;i<5;i++) { 26 prostokat.move(180-i*20,i*20); prostokat.setsize(vector2f(140-i*20,80)); 27 okno.draw(prostokat); } 28 for (int i=1;i<=6;i++) { kwadrat1.setrotation(i*60); okno.draw(kwadrat1); } 29 kwadrat2.rotate(2); okno.draw(kwadrat2); 30 okno.display(); 31 } 32 return 0; 33 } [p06_oryg-skal] 4 RenderWindow okno(videomode(640,480),"okienko SFML!"); 5 CircleShape kolo1(40,100); 6 kolo1.setfillcolor(color::red); kolo1.setposition(20,20); 7 kolo1.setscale(3.5,1.5); 8 CircleShape kolo2(4,100); 9 kolo2.setfillcolor(color::green); kolo2.setposition(320,240); 10 kolo2.setorigin(4,4); 11 while (okno.isopen()) { 12 Event zdarz; 13 while (okno.pollevent(zdarz)) { 14 if (zdarz.type == Event::Closed) okno.close(); 15 } 16 okno.clear(); 17 okno.draw(kolo1); 18 kolo2.scale(1.001,1.001); okno.draw(kolo2); - 7 -
19 okno.display(); 20 } 21 return 0; 22 } 4. Przykłady programów (odbicie od ścianek, podbijanie obiektu) [p07_odbicie] 4 int szer=600, wys=400; 5 RenderWindow okno(videomode(szer,wys),"okienko SFML!"); 6 int r=20, minx=0, miny=0, maxx=szer-2*r, maxy=wys-2*r; 7 float px=0.2, py=0.2, lp=px, gd=py; 8 CircleShape kolo(r,100); 9 kolo.setfillcolor(color::transparent); 10 kolo.setoutlinecolor(color::cyan); 11 kolo.setoutlinethickness(1); 12 Vector2f poz; 13 while (okno.isopen()) { 14 Event zdarz; 15 while (okno.pollevent(zdarz)) { 16 if (zdarz.type == Event::Closed) okno.close(); 17 } 18 poz=kolo.getposition(); 19 if (poz.x>=maxx) lp=-px; else if (poz.x<=minx) lp=px; 20 if (poz.y>=maxy) gd=-py; else if (poz.y<=miny) gd=py; 21 kolo.move(lp,gd); 22 okno.clear(); 23 okno.draw(kolo); 24 okno.display(); 25 } 26 return 0; 27 } - 8 -
[p07a_podbicie] 4 int szer=640, wys=400; 5 RenderWindow okno(videomode(szer,wys),"okienko SFML!"); 6 int r=20, minx=0, miny=0, maxx=szer-2*r, maxy=wys-2*r; 7 float px=0.2, py=0.2, lp=px, gd=py; 8 CircleShape kolo(r,100); 9 kolo.setfillcolor(color::transparent); 10 kolo.setoutlinecolor(color::green); 11 kolo.setoutlinethickness(1); 12 int szer_p=100, wys_p=5; 13 RectangleShape paletka(vector2f(szer_p,wys_p)); 14 paletka.setfillcolor(color::yellow); 15 paletka.setposition(szer/2-szer_p/2,wys-wys_p*2); 16 Vector2f poz_k, poz_p; 17 while (okno.isopen()) { 18 Event zdarz; 19 while (okno.pollevent(zdarz)) { 20 if (zdarz.type == Event::Closed) okno.close(); 21 } 22 23 poz_k=kolo.getposition(); 24 if (poz_k.x>=maxx) lp=-px; else if (poz_k.x<=minx) lp=px; 25 if (poz_k.y>=maxy) gd=-py; else if (poz_k.y<=miny) gd=py; 26 kolo.move(lp,gd); 27 28 poz_k=kolo.getposition(); 29 poz_p=paletka.getposition(); 30 if (poz_k.y+2*r >= poz_p.y && 31 poz_k.x+r >= poz_p.x && poz_k.x-r <= poz_p.x+szer_p) gd=-py; 32 33 if (Keyboard::isKeyPressed(Keyboard::Left)) paletka.move(-px,0); 34 if (Keyboard::isKeyPressed(Keyboard::Right)) paletka.move(px,0); 35 36 okno.clear(); 37 okno.draw(kolo); 38 okno.draw(paletka); 39 okno.display(); 40 } 41 return 0; 42 } [p07b_odbijanie-gra] 2 #include <sstream> 3 using namespace sf; 4 using namespace std; 5 string na_string(int n) { ostringstream stm; stm << n; return stm.str(); } - 9 -
6 7 int main() { 8 int szer=640, wys=400; 9 RenderWindow okno(videomode(szer,wys),"okienko SFML!"); 10 int r=20, minx=0, miny=0, maxx=szer-2*r, maxy=wys-2*r; 11 float px=0.2, py=0.2, lp=px, gd=py; 12 int punkty1=0, punkty2=0; 13 CircleShape kolo(r,100); 14 kolo.setfillcolor(color::transparent); 15 kolo.setoutlinecolor(color::green); 16 kolo.setoutlinethickness(1); 17 kolo.setposition(szer/4+r,wys/4-r); 18 int szer_p=100, wys_p=5; 19 RectangleShape paletka(vector2f(szer_p,wys_p)); 20 paletka.setfillcolor(color::yellow); 21 paletka.setposition(szer/2-szer_p/2,wys-wys_p*2); 22 RectangleShape paletka2(vector2f(szer_p,wys_p)); 23 paletka2.setfillcolor(color::cyan); 24 paletka2.setposition(szer/2-szer_p/2,wys_p); 25 Vector2f poz_k, poz_p, poz_p2, poz; 26 Font czcionka; 27 czcionka.loadfromfile("arial.ttf"); 28 Text tekst_p1, tekst_p2, gracz1, gracz2; 29 gracz1.setfont(czcionka); 30 gracz1.setcharactersize(20); gracz1.setcolor(color::yellow); 31 gracz1.setposition(20,wys-40); gracz1.setstring("gracz 1: "); 32 gracz2.setfont(czcionka); 33 gracz2.setcharactersize(20); gracz2.setcolor(color::cyan); 34 gracz2.setposition(20,30); gracz2.setstring("gracz 2: "); 35 tekst_p1.setfont(czcionka); tekst_p1.setcharactersize(30); 36 tekst_p1.setcolor(color::red); tekst_p1.setposition(105,wys-50); 37 tekst_p2.setfont(czcionka); tekst_p2.setcharactersize(30); 38 tekst_p2.setcolor(color::red); tekst_p2.setposition(105,20); 39 while (okno.isopen()) { 40 Event zdarz; 41 while (okno.pollevent(zdarz)) { 42 if (zdarz.type == Event::Closed) okno.close(); 43 } 44 45 poz_k=kolo.getposition(); 46 if (poz_k.x>=maxx) lp=-px; else if (poz_k.x<=minx) lp=px; 47 if (poz_k.y>=maxy) { gd=-py; punkty1--; } 48 else if (poz_k.y<=miny) { gd=py; punkty2--; } 49 kolo.move(lp,gd); 50 51 poz_k=kolo.getposition(); 52 poz_p=paletka.getposition(); 53 if (poz_k.y+2*r>=poz_p.y && poz_k.x+r>=poz_p.x && poz_k.x+r<=poz_p.x+szer_p) 54 { gd=-py; punkty1++; } 55 poz_p2=paletka2.getposition(); 56 if (poz_k.y<=poz_p2.y+wys_p && poz_k.x+r>=poz_p2.x && poz_k.x+r<=poz_p2.x+szer_p) 57 { gd=py; punkty2++; } 58 59 tekst_p1.setstring(na_string(punkty1)); 60 tekst_p2.setstring(na_string(punkty2)); 61 62 if (Keyboard::isKeyPressed(Keyboard::Left)) paletka.move(-px,0); 63 if (Keyboard::isKeyPressed(Keyboard::Right)) paletka.move(px,0); 64 if (Keyboard::isKeyPressed(Keyboard::A)) paletka2.move(-px,0); 65 if (Keyboard::isKeyPressed(Keyboard::D)) paletka2.move(px,0); 66 67 okno.clear(); 68 okno.draw(kolo); 69 okno.draw(paletka); 70 okno.draw(paletka2); 71 okno.draw(gracz1); 72 okno.draw(gracz2); 73 okno.draw(tekst_p1); - 10 -
74 okno.draw(tekst_p2); 75 okno.display(); 76 } 77 return 0; 78 } - 11 -