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
42 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 40, userów: 2, ukrytych: 0
nowy_user, Danielus

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
nowy_user (10:05, 28.04.17):
Czy ja wiem Wojo, Spójrzmy jak wielu ludzi tworzy dziś komercyjne gry w GM, otwierają się przecieżfirmy, które tworzą gry tylko w GMie. 10 lat temu to było nie do pomyślenia, jak ktoś zarobił 10$ na grze zrobionej w GM to już był happy.
Danielus (9:56, 28.04.17):
Najprościej założyć discorda. Staje się to coraz bardziej popularne jeśli idzie o chat
Wojo (9:36, 28.04.17):
Właśnie strona jest git ale game maker stracił mocno na znaczeniu w ciągu ostatnich lat.
Chell (9:00, 28.04.17):
uważam że tutaj każdy ma dość wartościowej wiedzy oraz jedną sprawą portalu jest brak nowej strony również brak naliczania postów w valhalli
Wojo (8:56, 28.04.17):
Gmclan rozwija się samodzielnie
nowy_user (8:40, 28.04.17):
Szkoda że GM czat nie działa. Przydałoby się takie miejsce gdzie moglibyśmy wymienić się wartościową wiedzą oraz porozmawiać o sprawach portalu i w końcu zdecydować w którym kierunku GMclan będzie się rozwijał.
Wojo (8:21, 28.04.17):
Tinychat zawsze zdycha
Chell (7:13, 28.04.17):
hmm, a może by tak tinychat??
Chell (7:13, 28.04.17):
ale zamkneli*
Chell (7:12, 28.04.17):
Simian - kiedyś był gmczat się zamknęli bo doszli do tych samych wniosków co ty ;p
Decretus (2:02, 28.04.17):
Witam serdecznie, zachęcam do wzięcia udziału w konkursie!
Adriann (1:17, 28.04.17):
Gibki Kaktus (23:30, 27.04.17):
Jestem gotowy na Pyrkon
Gibki Kaktus (23:30, 27.04.17):
Halo
Kotekhh (23:23, 27.04.17):
Krowa która ryczy, mało mleka daje
SimianVirus7 (22:18, 27.04.17):
Czy Gmclan posiada IRC'a czy coś w ten deseń? czy tylko ten czat funkcjonuje? (,bo w sumie po co IRC skoro jest to)
SimianVirus7 (22:17, 27.04.17):
Witam Nigdy nie używałem tego czatu, więc nie wiem, czy powinienem się przywitać czy nie
dxdiag (20:15, 27.04.17):
brawo dester
Adriann (18:28, 27.04.17):
starają się coraz bardziej:3
I am vader (18:03, 27.04.17):
Najlepsza bot reklama jaka tu widzialem led.feen.us/fq7e5b.png
Nikas (12:02, 27.04.17):
uuuuu
nowy_user (11:54, 27.04.17):
Człowiek ma już dość tych botów, niech Marmot lub Patrysław coś z nimi zrobią
Wojo (9:56, 27.04.17):
Znowu te boty
Penguin (7:23, 27.04.17):
mi też
Sutikku (22:51, 26.04.17):
Nie znajduje mi adresu DNS youtube, no to fajnie
Nikas (21:35, 26.04.17):
store.steampowe....com/app/206440 To The Moon zostało zrobione w rpg makerze.
Ignatus (21:33, 26.04.17):
Ja z GM mam ciekawa historie.Pewnego dnia 2 lata temu stwierdzilem ze spelnie marzenie dziecinstwa i zaczne robic gry, znajomy podpowiedzial zebym zaczal od nauki javy.Dla urozmaicenia zmudnego przerabiania kursow zaczalem instalowac rozne edytory i tak trafilem na GM
Ignatus (21:31, 26.04.17):
Każdy kojarzy spelunky
kriso99 (20:33, 26.04.17):
siemka, jest jakas lista na necie z id wszystkich klawiszy z klawiatury?
Suekii (18:58, 26.04.17):
Spelunky kojarzycie?
Flashek (18:46, 26.04.17):
każdy pierwszy program będzie dobry jeżeli tylko użytkownik sobie z nim radzi
I am vader (18:41, 26.04.17):
Bywają dobre gry w rpgmakerze..na przyklad ten, no..... Ahriman's Prophecy!
I am Lord (18:16, 26.04.17):
i nie chodzi mi o tego: www.adventuremaker.com tamten program potrafił tylko wyświetlać tekst i odpowiedzi
I am Lord (18:15, 26.04.17):
a nie, wcześniej tknąłem jakiś adventure maker i to był edytor gier tekstowych.
I am Lord (18:14, 26.04.17):
no bardzo fajna zabawka była to w nim poznałem czym są zmienne :d
I am Lord (18:14, 26.04.17):
Ja zaczynałem w rpg makerze 2000
Uzjel (18:13, 26.04.17):
Ej, Ja zaczynałem w RPG Makerze i bardzo dobrze go wspominam To tylko narzędzie, jak każde inne.
Suekii (18:08, 26.04.17):
rpg maker to zabawka dla dzieci w podstawówce.
I am vader (16:41, 26.04.17):
Mam chyba 50 gównogierek z rpgmakera na koncie bo kazde kostowalo 10 centow. Zadne nie jest dobre.
Kotekhh (16:18, 26.04.17):
rpg maker rządzi chłopcy
Flashek (16:09, 26.04.17):
Pamiętam moją pierwszą grę na androida, to była istna masakra. Autko wypierdzielało mi w kosmos. Tekstury były zniekształcone jak w jakimś psychologicznym horrorze. Jak znajdę to ci wyślę gdzieś na chomikuju mam obok modyfikowanych biosów )
dxdiag (16:07, 26.04.17):
praktycznie wszystko współdziała z tym cackiem
dxdiag (16:06, 26.04.17):
ale plusem jest kompatybilność
dxdiag (16:05, 26.04.17):
Nie tylko
Flashek (16:05, 26.04.17):
Z tego co czytałem to Ue3 to zabawa światłem głównie
Flashek (16:04, 26.04.17):
Domyślam się
dxdiag (16:03, 26.04.17):
HDR jest genialne
dxdiag (16:03, 26.04.17):
ja na trójce robiłem bardzo długi czas
dxdiag (16:01, 26.04.17):
w unrealu tez masz wady poważne
Ankieta
» Czy jesteś szczery odpowiadając w ankietach w Internecie?
Tak
Nie

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.00909 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev