Ten artykuł został stworzony dla starszych wersji GameMakera i może nie być aktualny.

Surfaces - co i jak

Sobota, 31 Marca 2007, 17:00
Czas czytania 3 minuty, 20 sekund
Zgodne z GM: gm6 gm7 gm8
Nie wiesz, czym są surface? Chcesz nauczyć się z nich korzystać? Ten artykuł jest dla Ciebie!
Surfaces (ang. powierzchnia) to jedno z wielu dobrodziejstw Game Makera, które bardzo ułatwiają życie programiście. Przez wielu uważane za skomplikowane, trudne w obsłudze i niepotrzebne. Niesłusznie. W tym krótkim artykule postaram się przybliżyć zasadę działania surfaces.

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 Menu z użyciem surfaces.
Pozdrawiam.
Komentarze (łącznie 40, wyświetlam 16 - 30):
Ranmus (śro., 04 Kwi. 07, 11:43)
#16

Iseen, jeżeli nie ma błędów, to znaczy, że po stronie silnika GM liczby i tak są zaokrąglane, więc po co powtarzać i tracić na wydajności? :)

Piczer (Pią., 06 Kwi. 07, 14:06)
#17

Kody nie nadają się do skopiowania, bo komentarze nie są poprzedzone znakami //

Misztrzunio (Czw., 02 Sie. 07, 09:20)
#18

Fajny art i nawet niezły przykładzik ;) . Mi akurat już się nie przyda :P .

kubasz (Czw., 15 Lis. 07, 16:20)
#19

Super!!!
Nauczyłem się dużo :):):)

a
adam014 (Pią., 10 Kwi. 09, 18:12)
#20

Emoty sie w kod wcinają :(

4
47xxxxxxxx (Wto., 16 Cze. 09, 18:35)
#21

a w ID surfaca trzeba dać jego nazwę?bo nie wiem jak pobrać ID

Marek Siemaszko (Wto., 16 Cze. 09, 18:42)
#22

funkcja surface_create zwraca jego uchwyt, ktory trzeba przypisać do zmiennej aby móc się potem do niego odwoływać.

4
47xxxxxxxx (Wto., 16 Cze. 09, 19:03)
#23

to mam dobrze

p
Pivot18 (Nie., 04 Paź. 09, 19:27)
#24

a jak wyciąć w surface coś?

ZeroXbot (Nie., 04 Paź. 09, 19:35)
#25

surface_copy_part(destination,x,y,source,xs,ys,ws,hs) - to jest kopiowanie jeśli o to ci chodzi. Zajrzał bys do dokumentacji -_-

p
Pivot18 (Nie., 04 Paź. 09, 23:18)
#26

daj link do dokumentacji o nie mogę znaleść

ZeroXbot (Pon., 05 Paź. 09, 14:08)
#27

nie możesz zajrzeć do dokumentacji GMa w dziale SURFACES? T_T

p
Pivot18 (Pon., 05 Paź. 09, 21:22)
#28

Ale polskA wersja

ZeroXbot (Pon., 05 Paź. 09, 21:44)
#29

no to skoro nie ma jej w tym miejscu w polskiej dokumentacji co w oryginale to znaczy że nie ma polskiej wersji X_X

Robert Prus (Wto., 06 Paź. 09, 08:44)
#30

Jestem prawie pewien że chodzi ci o stworzenie latarki. Nie musisz nic wycinać, wystarczy namalować białe światło na czarnym tle i rysować na surfie z użyciem draw_set_blend_mode(bm_subtract) tak jak w przykładzie "cykl dnia i nocy"

Najnowsze wersje GameMakera:

Stabilna
2024.4.1.152 • 2024.4.1.202
wydana 8 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 226 dni temu
Beta
2024.600.0.560 • 2024.600.0.577
wydana  6 dni temu
= IDE, = Runtime
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
Shoutbox
Wojo (03:18, 30.05.24)
gmclan wiecznie żywy
gnysek (10:09, 21.05.24)
Ale z jakimi błędami...
I am Lord (09:52, 20.05.24)
o piszą o nas 😁
Chell (11:15, 17.05.24)
nareszcie będzie można zaimplementować padający śnieg w gierce
gnysek (18:33, 16.05.24)
JS zmierza do GM xD
I am Lord (16:29, 05.05.24)
Czaję
gnysek (13:38, 04.05.24)
Nie wbudowują tego przez warunki licencyjne. Ale kto wie, może jako prefab zobaczymy to już w kolejnym wydaniu, bo wtedy prefaby mają zostać dodane.
I am Lord (12:17, 03.05.24)
Aha to trzeba coś tam jeszcze kombinować tak
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?