Surfaces - co i jak
Czasem mamy potrzebę narysowania na ekranie czegoś, co będzie odseparowane od reszty i łatwe w modyfikacji (np. HUD w grze). W takim wypadku najczęściej bawimy się w rysowanie kolejnych elementów w zależności od wartości jakiejś zmiennej. Jest to metoda może i skuteczna, ale niezbyt wygodna. Zamiast się tak katować, lepiej użyć surfaces - bo właśnie głównie do takiego typu zadań są one przeznaczone.
Jak to działa?
Surface to, mówiąc najprościej, powierzchnia, na której możemy zapisać jakieś elementy (figury, obrazki itp.). Dzięki temu, że wszystkie te elementy są ze sobą powiązane, możemy łatwo je obrócić, zeskalować, pokolorować, oteksturować, czy skopiować do pliku. Do obsługiwania powierzchni służą odpowiednie funkcje. Najważniejsze z nich postaram się opisać tutaj.
Pierwsze, co należy zrobić, to stworzyć nowego surface'a o określonych wymiarach. Służy do tego polecenie
kodnew_surface = surface_create(szerokość, wysokość); Funkcja ta zwraca id powierzchni, które będzie niezbędne do wywołania dalszych funkcji.
Teraz postaramy się narysować coś na naszym surface. Aby tego dokonać, musimy rozpocząć tryb edycji powierzchni. Służy do tego komenda
kodsurface_set_target(id_naszego_surface);Bezpośrednio po tym możemy używać funkcji rysujących np. draw_circle.
Uwaga, ważne!
Surface'a nie wolno edytować w evencie Draw! Może to spowodować niewłaściwe rysowanie.
A jak zakończyć tryb edycji? Wystarczy wpisać
kodsurface_reset_target();
Nie pozostaje nam nic innego jak wyświetlić naszego surface'a. W evencie Draw piszemy
koddraw_surface(id_naszego_surface,x,y);
Proste, prawda?
Teraz czas wykorzystać zdobytą wiedzę w praktyce. Napiszemy program, który pozwoli użytkownikowi stawiać na ekranie kolorowe kółka.
Tworzymy nowy obiekt i nazywamy go obj_surface. Następnie piszemy:
Create:
kodnew_surface = surface_create(room_width,room_height); // tworzymy nowego suface'a o wymiarach room'a
surface_set_target(new_surface);//rozpoczynamy tryb edycji
draw_set_color(c_black);
draw_rectangle(0,0,room_width,room_height,0); //czyścimy surface'a, rysując na ekranie czarny prostokąt
surface_reset_target(); //kończymy tryb edycji
Step:
kodif ( mouse_check_button_pressed (mb_left) )
{
surface_set_target(new_surface);
col1 = make_color_rgb(random(255),random(255),random(255));
col2 = make_color_rgb(random(255),random(255),random(255));
draw_circle_color(mouse_x,mouse_y,100,col1,col2,0);
// jeżeli user kliknie myszą, rysujemy koło w losowym kolorze
surface_reset_target();
}
Draw:
koddraw_surface(new_surface,0,0);
Uruchamiamy grę i chwilę rozkoszujemy się stawianiem kółek na ekranie.
Teraz dodamy do naszego programu możliwość zapisu.
Do eventa Step dopisujemy:
kodif (keyboard_check_pressed(vk_space))
{
surface_save(new_surface,'obrazek.bmp');
}
Łatwo możemy też dodać obracanie, skalowanie, rozjaśnianie obrazu, posługując się funkcją draw_surface_general. Ale to już pozostawiam Wam. :)
A na koniec kilka ważnych uwag.
-Surfaces nie działają poprawnie w trybie 3D. Można używać ich dopiero po zakończeniu tegoż trybu (d3d_end()), ale należy pamiętać, że po ponownym uruchomieniu trybu 3D, surfaces zostaną zniszczone.
-Surfaces są zapisywane w pamięci karty graficznej. W skutek tego można utracić surface'a podczas np. zmiany rozdzielczości czy włączenia się wygaszacza ekranu.
-Surfaces nie są zapisywane wraz z grą.
Mam nadzieję że ten art pomógł zrozumieć istotę i zastosowanie surfaces. Po więcej zapraszam do helpa i mojego przykładu [URL=gmclan.org/index.php?plik=116]Menu z użyciem surfaces[/URL].
Pozdrawiam.