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
149 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 148, userów: 1, ukrytych: 0
Uzjel

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
I am Lord (18:10, 22.05.17):
A tak w ogóle to gumce też można rozmiar zwiększyć, tylko że ona ma miękkie krawędzie
I am Lord (18:08, 22.05.17):
aha Opacity na 0 jeszcze
I am Lord (18:08, 22.05.17):
Masz tak się to robi: i.imgur.com/IDtZODf.png
I am Lord (18:02, 22.05.17):
Nie wierzę co czytam
Uzjel (16:35, 22.05.17):
Aj ludzie, problemy se robicie
gnysek (16:34, 22.05.17):
GIMP ma przeźroczyste tła. GMS 1.x ma funkcję "make opaque", a GMS2 ma różdżkę która zaznacza na raz 1 kolor wszędzie (contignous).
Ignatus (16:16, 22.05.17):
Wlasnie GM ma funkcje ktorej mi w programach graficznych brakuje (albo nie wiem jak znalezc) "Erase a color"
nowy_user (15:46, 22.05.17):
Zaznaczanie róźdżką też jest strasznie toporne. No nie wierzę że w gm sudio nie ma innego sposobu. Przecież są ludzie, którxy tworzą grafiki np. w gimpie lub paincie, i nine chce mi się wierzyć że za każdym razem usuwają białe tło piksel po pikselu. Przecież to niedorzeczne.
nowy_user (15:26, 22.05.17):
gm studio 1 ; ehhh w gm 5.3 nie bylo problemu , tlo bylo lewym dolnym rogiem
gnysek (15:22, 22.05.17):
Ktory GM tak w ogóle?
gnysek (15:22, 22.05.17):
To zaznacz różdzką
nowy_user (15:07, 22.05.17):
Niestety przy 100% przezroczystosci, farba ,maluje na czarno, a zaznaczenie + delete owszem działa ale tylko na prostokątnych powierzzchniach. Dalej nie działa to tak jak trzeba
ANtY (13:05, 22.05.17):
spróbuj zaznaczenie + delete, jak pomoglem to daj okejke
gnysek (11:11, 22.05.17):
To weź farbę i ustaw 100% przeźroczystą
nowy_user (11:06, 22.05.17):
tak tylko że gumką muszę tak prezycyjnie piksel po pikselu, a ja chce cały obszar ograniczony konturami, tak samo jak farbą w paincie
ANtY (10:51, 22.05.17):
gumką
nowy_user (10:09, 22.05.17):
hej , jak zamalować tło na przezroczyste w edytorze spritow w game maker?
I am Lord (15:38, 21.05.17):
site:gmclan.org w google
BloodDzioch (14:39, 21.05.17):
Gdzie na community jest jakaś wyszukiwarka? Za cholery nie mogę znaleźć
Adriann (10:36, 21.05.17):
To odpada, potrzebuję czegoś animowanego pomiędzy
Threef (10:29, 21.05.17):
Nie da się. Możesz wstawić [1] pomiędzy [0] a [2], ale żadnych obiektów nie wsadzisz. Ona mają depth, ale silnik chyba rysuje je osobno. Możesz za to rysować draw_background()
Adriann (22:53, 20.05.17):
Tznnnn chcę umieścić jakiś obiekt między backgrond[0] a [1]
Adriann (22:52, 20.05.17):
Hymmm wiecie może czy da się ustalić depth tła?
MaxGaming (17:25, 20.05.17):
ktoś coś? xd forum.gmclan.or...mp;#entry444361
Adriann (13:33, 20.05.17):
Wszystkie dźwięki są do wymiany
Ignatus (13:32, 20.05.17):
Adrian- to "ouch" przy trafieniu jest bezwzgęldnie do zmiany, brzmi jak z pornosa
Adriann (17:01, 19.05.17):
Byłbym wdzięczny za kilka lajków;>
Uzjel (10:32, 19.05.17):
Kurde, myślałem że dłużej to robicie. To jednak szybko wam idzie
ANtY (9:16, 19.05.17):
zaczelismy dopiero w listopadzie, rok developmentu to chyba nie tak duzo na taka giere? :d
Uzjel (20:03, 18.05.17):
Myślałem, że premiera już niedługo, a tu Q1-18 ???
Chell (18:48, 18.05.17):
kiedyś za wprowadzanie innych w błąd były bany
ANtY (18:29, 18.05.17):
bit.ly/warlocks2steam
CyberZoGA (ZombiesWillBack) (17:01, 18.05.17):
Wprowadzam ale przypadkiem, nie robię tego specjalnie. Za co przepraszam
Nikas (15:18, 18.05.17):
Jak wykupię ponownie domenę. XD
Wojo (13:55, 18.05.17):
To nie wiem dlaczego wprowadzasz innych umyślnie w błąd
Chell (13:48, 18.05.17):
nikas, kiedy dodasz wybor jezyka na n94games.com?
CyberZoGA (ZombiesWillBack) (13:17, 18.05.17):
Do testowania jesr Mark a do animacji i modelowania Max
Wojo (13:15, 18.05.17):
Nie rozumiem, to do testowania jest max? Czy jak
CyberZoGA (ZombiesWillBack) (13:09, 18.05.17):
Tester grafiki :p, przepraszam, mój błąd
CyberZoGA (ZombiesWillBack) (13:09, 18.05.17):
Do grafiki jest 3DS Max, mark to benchmark :'
Wojo (12:45, 18.05.17):
Pobrałem tego 3D marka ale wątpię żeby to było do tworzenia grafiki
CyberZoGA (ZombiesWillBack) (10:24, 18.05.17):
*Max
CyberZoGA (ZombiesWillBack) (10:23, 18.05.17):
*3DS Mark bo 3D mark to tester grafiki xd
CyberZoGA (ZombiesWillBack) (10:18, 18.05.17):
Blender albo 3DMark?
Wojo (9:10, 18.05.17):
W czym najlepiej modelowac 3D? Bo chciałbym robić sobie jakieś grafiki pod unreal engine 4
Threef (8:35, 18.05.17):
Albo rób zip lub instalator. Bo Samorozpakowujący i odpalający się program zawsze będzie podejrzany przez większość antywirusów.
CyberZoGA (ZombiesWillBack) (21:40, 17.05.17):
Tu masz opisane co i jak nie ma problemu
PatrykPlayingPOLSKA (21:36, 17.05.17):
AVG,spróbuję to zrobić,dzięki
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.01718 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev