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 [URL=gmclan.org/index.php?plik=116]Menu z użyciem surfaces[/URL].
Pozdrawiam.
Komentarze (łącznie 40, wyświetlam 31 - 45):
p
Pivot18 (śro., 07 Paź. 09, 22:04)
#31

aha dzięx

kamcio540 (Czw., 06 Maj. 10, 20:26)
#32

zmieniłem kod zapisywania surfaca na taki: if (keyboard_check_pressed(vk_space))
{
get_string("podaj nazwe pliku","");
surface_save(new_surface,'kickflip2.bmp');
}
{
sprite_merge('kickflip2.bmp',add)
}

i wyskakuje bład:

ERROR in
action number 2
of Step Event
for object obj_edytor_grafiki:

Trying to merge from non-existing sprite.

Marek Siemaszko (Czw., 06 Maj. 10, 20:28)
#33

w sprite_merge podajesz identyfikator sprita który jest załadowany w pamięci gm a nie gdzieś w pliku.

kamcio540 (Czw., 06 Maj. 10, 20:31)
#34

wiec?musze zmienic sprite_merge('kickflip2.bmp',add)
na sprite_merge("kickflip2.bmp",add)?

Marek Siemaszko (Czw., 06 Maj. 10, 20:35)
#35

po co w ogóle zapisujesz tego surface do pliku?
zrób z niego sprita i wtedy zmerguj

kamcio540 (Czw., 06 Maj. 10, 20:37)
#36

a jak to zrobic?

b
bluks (Czw., 06 Maj. 10, 20:40)
#37

Czemu się nie dziwię że to ty? :P

Marek Siemaszko (Czw., 06 Maj. 10, 20:54)
#38

add sprite from surface czy jakoś tak. poszukaj sobie w dokumentacji.

TheMarcQ (Pią., 07 Maj. 10, 18:38)
#39

myślisz że on to zrobi? On nie wie gdzie jest dokumentacja, zaraz będzi temat gdzie o to pyta

H
H2S04 (Sob., 05 Gru. 15, 04:05)
#40

Miałem problem z rysowaniem surface krwi... Problemem był użyty view. Zamiast room_width i room_height trzeba użyć:
new_surface = surface_create(view_wview,view_hview);

Najnowsze wersje GameMakera:

Stabilna
2024.8.1.171 • 2024.8.1.218
wydana 73 dni temu
LTS
2022.0.3.83 • 2022.0.3.98
wydana  wczoraj
Beta
2024.1100.0.686 •
2024.1100.0.707
 0.13.0

wydana 7 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
Shoutbox
gnysek (11:46, 17.11.24)
Witamy, witamy!
baca (12:22, 16.11.24)
To już 25 lat.. Witam po paru latach nieobecności.
gnysek (11:05, 15.11.24)
Natomiast obecne forum istnieje od 2004, jak z iglu.cz na gmclan.org przeszliśmy i od tego czasu nie było resetów danych.
gnysek (12:35, 13.11.24)
Ogólnie GMCLAN istnieje 22 lata, ale na to trofeum nie zrobiłem (jeszcze xD)
Chell (20:41, 08.11.24)
wow, ta emotka w ogóle nie wygląda jak : O xD
Chell (20:40, 08.11.24)
tylko? :O 4tk ma 15
Borek (18:12, 07.11.24)
Właśnie dostałem powiadomienie z forum, że jestem na GMClanie 18 lat :D Ja pierdzielę...
S
Sutikku (08:43, 18.10.24)
TIL, gamemaker jest starszy ode mnie
gnysek (16:04, 15.10.24)
Za równo miesiąc, GameMaker kończy 25 lat.
Wojo (15:38, 05.09.24)
Ciekawe
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?