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
43 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 41, userów: 2, ukrytych: 0
tramur, Adriann

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
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
I am vader (13:39, 22.06.17):
Nie wiem jak dotrzeć do tego działu nawet
I am Lord (11:45, 22.06.17):
im vader moj jest w assorted top down
PatrykPlayingPOLSKA (10:00, 22.06.17):
Mi się wydaje że większość gości to boty ale może być też paru ludzi,trzeba jakoś zachęcić ludzi do zarejestrowania na tym forum,np można jakoś polepszyć tą polską dokumentajcę,coś do niej dodać,na steamworkshop gamemaker można jakoś popisać że jest takie ciekawe coś jak GMC,no sposobów może być wiele.
nowy_user (9:30, 22.06.17):
Chell , aktywnych userów może i dziesięciu, ale np. w tej chwili jest 133 gości! Unbelievable! Swoją drogą , ciekaw jestem dlaczego ludzie się tak ukrywają, zamiast po ludzku się zarejestrować.
Chell (22:56, 21.06.17):
niestety sprzedawanie assetow po zlotowke na ktore zbija sie po 5 osob jest malo oplacalne na forum na ktorym jest 10 aktywnych userow
nowy_user (22:52, 21.06.17):
A może powinniśmy stworzyć własny markietplace tu na gmclanie? Ja widzę same plusy: Po pierwsze - > ceny byłyby w złotówkach, więc więcej ludzi mogłoby sobie na nie pozwolić, Po drugie -> Nie wiem jak wy, ale ja wolałbym wspierać finansowo programistę od nas , ktoś kogo znam z forumowej aktywności zamiast jakiegoś anonimowego geeka z Californi lub Colorado. I po trzecie -> Zmotywowało by to nas wszystkich do twórczości.
I am vader (22:48, 21.06.17):
A który asset jest twój? Przegrzebałem showcase i top rated i nic podpisanego HuderLord nie znalazlem
I am Lord (19:06, 21.06.17):
Aha no super, nic się na głównej nic nie zmieniło pół toku już mój asset tam jest, yoygames zapomniało że ma ten MP że go nie moderują?
I am Lord (19:04, 21.06.17):
Dawno nie zaglądałem tam
nowy_user (12:47, 21.06.17):
Przepraszam , miało być Uzjel.
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.01731 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev