Fastbar
Powrót do strony głównej
Trzymaj pliki na gmclan.org!
Game Maker w pytaniach i odpowiedziach!
Polska dokumentacja
Tabela wyników ligi 24
Pobierz GM
Kategorie bazy artykułów
Artykuły -> Game Maker -> Kursy GML
Treść artykułu
Surfaces - co i jak
autor: Maximal (31.03.07)
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
gml:
new_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
gml:
surface_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ć
gml:
surface_reset_target();


Nie pozostaje nam nic innego jak wyświetlić naszego surface'a. W evencie Draw piszemy
gml:
draw_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:
gml:
new_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:
gml:
if ( 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:
gml:
draw_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:
gml:
if (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.
głosów: 13 | ocena: 9.00 oceń zasób | dodał: Maximal
Komentarze
stron: 21

2


47xxxxxxxx (18:35, 16.06.2009)

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

av

Marek.S (18:42, 16.06.2009)

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

47xxxxxxxx (19:03, 16.06.2009)

to mam dobrze

av

pivot18 (19:27, 4.10.2009)

a jak wyciąć w surface coś?

av

ZeroXbot (19:35, 4.10.2009)

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

av

pivot18 (23:18, 4.10.2009)

daj link do dokumentacji o nie mogę znaleść

av

ZeroXbot (14:08, 5.10.2009)

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

av

pivot18 (21:22, 5.10.2009)

Ale polskA wersja

av

ZeroXbot (21:44, 5.10.2009)

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

av

Makary155 (8:44, 6.10.2009)

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"

av

pivot18 (22:04, 7.10.2009)

aha dzięx

av

kamcio540 (20:26, 6.05.2010)

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.

av

Marek.S (20:28, 6.05.2010)

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

av

kamcio540 (20:31, 6.05.2010)

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

av

Marek.S (20:35, 6.05.2010)

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

av

kamcio540 (20:37, 6.05.2010)

a jak to zrobic?

av

bluks (20:40, 6.05.2010)

Czemu się nie dziwię że to ty?

av

Marek.S (20:54, 6.05.2010)

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

av

TheMarcQ (18:38, 7.05.2010)

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

H2S04 (4:05, 5.12.2015)

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);

stron: 21

2



Dodaj komentarz:
Treść:
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Użytkownicy on-line
50 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 45, userów: 5, ukrytych: 0
I am vader, Uzjel, exp, Czołg Krymski, ALT

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
I am vader (0:13, 27.06.17):
Na 2.0 możesz co najwyżej uczyć kogoś programowania, ale gry nie zrobi bo nie ma robienia plików exe na darmolcu
I am vader (0:12, 27.06.17):
NIe ma w zasadzie juz darmowego GM'a. GMS 1.4 nie pozwala na zakladanie juz darmowych kont a 2.0 w ogole ma wszystko poblokowane w wersji free.
Uzjel (0:07, 27.06.17):
Chcesz za darmo co?
exp (23:27, 26.06.17):
jeżeli chcę za darmo
exp (23:20, 26.06.17):
ej której wersji GM się teraz używa?
Uzjel (22:03, 26.06.17):
xD
I am vader (20:51, 26.06.17):
Haha, o tym samym pomyslalem jak to zobaczylem
exp (17:04, 26.06.17):
mamo no ja nie oglądałem nic dla dorosłych, to samo tak wyskoczyło no
I am Lord (16:34, 26.06.17):
No mi się wyświetlały jakieś dildosy a to nie jest moje zainteresowanie Ktoś coś dziwnego przeglądał na moim kompie
Threef (16:30, 26.06.17):
Banery reklamowe są personalizowane. Wy widziesz to co wg reklamodawców Cię nteresuje (na podstawie twojej historii)
nowy_user (10:36, 26.06.17):
Hej, czy był ktoś z was na kursie programowania CodersLab(Ci od baneru)? Zastanawiam się nad tym, ale jestem ciekaw czy warto.
Chell (1:16, 26.06.17):
conieco
ANtY (1:03, 26.06.17):
elo co tam
I am Lord (19:53, 25.06.17):
Za dużo tam różnych optymalizacyjnych działań na bitach i flagach bitowych
I am Lord (19:50, 25.06.17):
Ogółem prawie nic nie rozumiem z tego kodu źródłowego, analiza gry AAA to nie mój poziom :p
I am Lord (19:49, 25.06.17):
Udało mi się skompilować i odpalić kod źródłowy ArxLibertatis (portu gry ArxFatalis) ile z tym roboty było ja pierdziele, nigdy więcej
I am vader (4:04, 25.06.17):
Nie ma to jak usuwanie botów o 4'tej
I am vader (20:22, 24.06.17):
Threef za biały jest na allahuackbar
Ignatus (19:59, 24.06.17):
Threef zapuść wąsa do tej brody bo jest teraz za bardzo allahuakbar
I am Lord (18:01, 24.06.17):
ok mam chwilkę> to wbiję
Threef (17:26, 24.06.17):
Właśnie zaczynam streamować. www.twitch.tv/threef_games
I am Lord (17:02, 24.06.17):
Zbanowałem bota zanim zrobił temat to jest skill a nie jakieś programowanie
I am Lord (15:07, 24.06.17):
Chyba sobie do niego powrócę ale pamiętam że ciężko mi było się w tym połapać wszystkim, niby tego Newton Ponga zrobiłem ale połowę gry odwalił za mnie silnik fizyczny więc za wiele się nie nauczyłem
ANtY (13:21, 24.06.17):
na szczescie, bo to co w unity było to nawet nie był prawdziwy JS
Danieo (11:44, 24.06.17):
C# jest wiodącym językiem w Unity. Tak jak Boo już wymarło to powoli wymiera JS
Adriann (22:49, 23.06.17):
Łoo, pszekonał :3
Nikas (22:03, 23.06.17):
chuj kurwa gem makr zarabiaj dorary
PatrykPlayingPOLSKA (21:33, 23.06.17):
Są wakacje więc postanawiam nie zmarnować tego czasu.
I am vader (20:55, 23.06.17):
C#
I am Lord (19:40, 23.06.17):
C#
PatrykPlayingPOLSKA (19:09, 23.06.17):
Właśnie,może ktoś powiedzieć w czym zacząć pisać w Unity czy w C# czy javascript.W czym lepiej ?
ANtY (17:42, 23.06.17):
w GMie możesz programować bardzo mieszaną składnią, także zależy jak to robisz, w Unity korzystasz z C# (wcześniej dużo ludzi jeszcze z JS korzystało ale unity juz go nie supportuje na rowni z c#)
I am vader (16:54, 23.06.17):
Anty
nowy_user (12:59, 23.06.17):
Rozumiem, a czy jest na forum ktoś kto się "przebranżowił" z GMa na Unity? Sam o tym myślę, ale wiecie, to jest całkiem inny język programowania i domyślam się że wymaga to ogromu pracy...
Wojo (10:35, 23.06.17):
O tym juz pisalem ze możliwości GMa są stanowczo zbyt małe jak na dzisiejsze czasy. GM nie nadazyl za skokiem technologicznyn
nowy_user (8:53, 23.06.17):
Rzeczywiście cena lekko przesadzona. Ja oczywiście rozumiem, że ostatnio powstało sporo komercyjnych gier na GMa i domyślam się też, że włodarze Yoyo aspirują do tego, aby GM był używany przez studia developerskie, i to wszystko fajnie. Ale bądźmy szczerzy, jeśli porównamy możliwości GMa do Unity to jednak nasz kochany program jeszcze musi sporo nadgonić, więc te wysokie ceny - na ten moment- są od czapy.
Danieo (8:17, 23.06.17):
W Unity też. Jedynie musisz być zarejestrowanym developerem Sony (mieć dostęp do Devkita PS4)
Wojo (7:45, 23.06.17):
W Unreal Engine za to nie doplacasz nic. Jedynie jakiś tam procent z zysku ale myślę że to i tak jest uczciwe biorąc pod uwagę możliwości
Ignatus (23:22, 22.06.17):
3000zł z roczną możliwość eksportu na PS4 solidna cena
Uzjel (21:27, 22.06.17):
Master chyba
I am vader (21:03, 22.06.17):
Errr...czym jest Ultimate?
Threef (19:32, 22.06.17):
gnysek na Ultimate, na X1 i PS4. 3 Moduły są teraz na subskrypcję
gnysek (19:16, 22.06.17):
Subskrypcja jest tylko na Ultimate, na resztę nie.
I am Lord (19:01, 22.06.17):
Vader no tutaj na głównej: i.imgur.com/SPrqXPK.png
Threef (17:42, 22.06.17):
Na razie to info że exporty na X1 i PS4 są ważne na 12 miesięcy
I am Lord (17:41, 22.06.17):
Teraz żałuję że kupiłem go :/
I am Lord (17:40, 22.06.17):
Najpierw baitują że nie będzie subskrypcji a teraz ją wprowadzają
Adriann (17:36, 22.06.17):
Cooooooooooooo?!
Threef (17:25, 22.06.17):
Przepraszam co...? GM:S2 ma mieć teraz moduły subskrypcyjnie? Na 12 miesięcy? lol
Ankieta
» Jakiej wersji GameMakera głównie Używasz?
GameMaker: Studio 2
GameMaker: Studio
GameMaker 8.1 i starsze
Żadnej

GMCLAN to serwis o programie Game Maker i nie tylko.
Copyright © 2002-2017. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!

[ Czas generowania strony: 0.04842 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev