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
Akademia GMCLANu
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


av

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ć.

av

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

av

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
6 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 4, userów: 2, ukrytych: 0
Chell, Uzjel
Użytkownicy na czacie discord
Uzjel (22:42, 25.05.18):
Max, spróbuj piktochart
PsichiX (20:46, 25.05.18):
ale ja mowie serio. Ty chcesz infografike, ja mowie Ci moja cene za to.
Wojo (19:51, 25.05.18):
penguin robisz świetne pixelki
MaxGaming (19:11, 25.05.18):
Psichix nie próbuj być na siłę śmieszny bo Ci to nie wychodzi...
Danielus (19:11, 25.05.18):
RODO z GMC trafia do spamu w gmailu :d
PsichiX (18:44, 25.05.18):
50zl za 1024 piksle kwadratowe
MaxGaming (16:31, 25.05.18):
Jest ktoś kto mógłby mi machnąć infografikę?
gnysek (11:54, 25.05.18):
Toż bym z tych 20zł miesięcznie nie wypłacił sobie ZUSu za GMCLAN
gnysek (11:53, 25.05.18):
No moja firma działa jeszcze gdzieś indziej Poza tym, regulamin jest wspólny dla wszystkich stron, kosztowało mnie to dopisać "gmclan.org" do listy
Wojo (11:40, 25.05.18):
ale gmclan moze miec kare w granicach 6zł chyba ze gdzies indziej jeszcze dzialacie
gnysek (23:03, 24.05.18):
Kara jest od obrotów firmy, nie strony
Wojo (18:46, 24.05.18):
nie ma potrzeby tego robic imo, jakbys dostal mandat to przychód z gmclanu napewno go pokryje xD
gnysek (15:34, 24.05.18):
Niestety, pewnie wieczorem dodam popup o ciastkach również
gnysek (15:26, 24.05.18):
Jesteśmy gotowi na RODO, dodałem Politykę Prywatności
Ignatus (23:06, 20.05.18):
To bedzie w zasadach opcjonalnych- no i tylko jezeli przejdzie solidne testy, bo teraz dziala to wszystko idealnie wiec nie ma co kombinowac
I am Lord (22:58, 20.05.18):
Nie przekombinuj, chyba że chcesz zostawić to jako opcję dla zaawansowanych
Ignatus (22:49, 20.05.18):
wiec wrzucilem jako cel przyszly
Ignatus (22:49, 20.05.18):
ale to jeszcze nie przetestowane wiec do bazowej gry nie dodalem
Ignatus (22:49, 20.05.18):
to by dzialalo tak ze jezeli gracz ulozy karty o wartosci 1,2,3 (i w tej kolejnosci) dobiera 1 z 3 kart specjalnych
Ignatus (22:48, 20.05.18):
Jeszcze planuje przy przekroczeniu celu kampanii 10k dorzucic kilka kart i umiejetnosci
Ignatus (22:48, 20.05.18):
Pewnie że tak
I am Lord (22:42, 20.05.18):
żeby było więcej kart
I am Lord (22:41, 20.05.18):
kupując np 2 zestawy gry
I am Lord (22:41, 20.05.18):
zmodyfikować zasady*
I am Lord (22:40, 20.05.18):
zawsze można będzie zmodyfikować sobie jak się chce mieć losową rękę
Ignatus (22:33, 20.05.18):
Niektórzy na Pyrkonie dosłownie po 5 minut myśleli nad ruchem
Ignatus (22:32, 20.05.18):
Zerowa losowośc- gracze mają do dyspozycji symetryczne talie 7 kart od początku do dyspozycji.Jest takie ciężkie kombinowanie że aż sam jestem w szoku
I am Lord (22:28, 20.05.18):
Teraz przeczytałem opis gry Humor taki jak u Pratchetta
I am Lord (22:13, 20.05.18):
A powiedz mi jak dużą rolę gra szczęście? Kółko i krzyżyk był grą o zerowym szczęsciu, nie da się go wygrać gdy staną przeciwko sobie przeciwnicy na tym samym poziomie. U ciebie elementem losowym jest talia kart tak? Czy rozdanie mocno wpływa na przebieg gry?
I am Lord (22:11, 20.05.18):
Przez ciebie mam chęć zrobienia takiej gierki samemu
Uzjel (22:00, 20.05.18):
Od razu z góry mogę zaproponować port na iOS'a, bo właśnie się uzbroiłem w CAŁY sprzęt Powodzenia!
Ignatus (21:54, 20.05.18):
A jezeli sie powiedzie to oczywiscie bede to przekuwał w multi na andka w przyszłości
Ignatus (21:53, 20.05.18):
Ujzel:wydawcą jest póki co wspieram.to ;p Ale juz rozmawiam z jednym sklepem większym który mnie wychaczyl na Pyrkonie
Ignatus (21:51, 20.05.18):
Jak się skonczy kampania to beda chodzic w sklepie po 30-35 wiec na pewno jakis zysk bedzie
Ignatus (21:50, 20.05.18):
Bardzo dziękuje!!!!!!!!
Uzjel (21:50, 20.05.18):
O! Albo sprzedam z zyskiem!
Uzjel (21:50, 20.05.18):
Na początku czerwca mam ostatnie zajęcia, więc pewnie się nie uda Rozdam planszówkowym kolegom.
I am Lord (21:49, 20.05.18):
Może ich też to natchnie
I am Lord (21:49, 20.05.18):
To rozdaj maluchom ze szkoły
I am Lord (21:41, 20.05.18):
a nie bo przesyłka będzie kłopotliwa :d
I am Lord (21:41, 20.05.18):
Na gmclan do konkursu
Uzjel (21:34, 20.05.18):
Też dorzucę, ale nie wiem co zrobię z dodatkowymi sztukami :p
I am Lord (21:30, 20.05.18):
Wow ignatus zasady wyglądają na faktycznie grywalne, nie mam i tak z kim w to zagrać chyba że zrobisz kiedyś giereczkę na PC czy androida ale dorzucę grosza
Uzjel (21:25, 20.05.18):
Fajnie Ignatus, kto będzie wydawcą?
Ignatus (19:46, 20.05.18):
Panowie zachęcam do wspierania mojej kampanii gry karcianej.Po prawie 100 partiach na Pyrkonie nieskromnie stwierdzam ze jest zajebsicie grywalna. wspieram.to/czarowieze
Wojzax (19:27, 20.05.18):
No mi najwięcej oryginalnych pomysłów wpada gdzieś w plenerze. Nie że związanych z tym plenerem po prostu tak wyjście mi czasem działa na mózg.
Wojo (19:15, 20.05.18):
za pieniądze z genialnego pomysłu możesz spłacić kredyt za który się wyprowadziłeś
Wojo (19:14, 20.05.18):
wniosek jest taki, że trzeba wyprowadzić się do ciepłych krajów
Sutikku (14:52, 20.05.18):
zawsze jak jest ciepło to tyle pomysłów do tworzenia, a jak jest zima siedzi się w domu, tyle czasu i nic
I am vader (10:33, 19.05.18):
Bry :v
Ankieta
» Jakie kursy najchętniej widziałbyś na stronie ?
GM Studio
GM Studio 2
Godot
Construct

GMCLAN to serwis o programie Game Maker i nie tylko.
[ Polityka prywatności ]
Copyright © 2002-2018. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus (ranmus.pl), © 2017-2018 {=|=} fable_inside();

[ Czas generowania strony: 0.02397 sekund ] [ Liczba zapytań MySQL: 13 ]