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
4 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 3, userów: 1, ukrytych: 0
ANtY
Użytkownicy na czacie discord
Wojo (10:48, 16.10.18):
www.youtube.com...h?v=XhmsV_IBles tutaj masz jakieś wyjaśnienia
I am Lord (9:18, 16.10.18):
swędzenie ni występuje po przedwakowaniu kofeiny tylko beta alaniny, na niektórych w tym mnie bardzo negatywnie to wpływa
I am Lord (9:17, 16.10.18):
ale ten filmik jest pocięty i moco zmanipulowany, obejrzyj full 5 minutowy wywiad i tam sprawia wrażenie normalnego tylko lekko nabuzowanego i tyle
MaxGaming (1:49, 16.10.18):
Osoby które nie mają doczynienia z mefedronem itp nie mają pojęcia że tu nie chodzi tylko o te jego drapanie po nosie czy oczy. Chodzi nawet o sposób ekspresji emocji. A raczej nadekspresji w taki bardzo nie typowy sposób. Jak to wyjąsnić? No najlepiej obejrzyjcie ten filmik z adbusterem bo to przykład 1:1
MaxGaming (1:47, 16.10.18):
natomiast na 90% mogę stwierdzić że ćpał
MaxGaming (1:46, 16.10.18):
jedno w tym wszystkim jest pewne - prawdy nie da się udowdnić, ani że był trzeźwy ani że ćpał
MaxGaming (1:46, 16.10.18):
mój kolega który nigdy nie brał amfetaminy a palił codziennie trawę na badaniach na mocz miał amferaminę ktorej nigdy w życiu nie brał i thc nie wykryto
MaxGaming (1:45, 16.10.18):
kolejna sprawa to jakość tych testów... miałem kiedyś robione testy na mocz dzień po paleniu trawy. THC ku mojemu zaskoczeniu nie wyszło wcale
MaxGaming (1:45, 16.10.18):
i czy serio oni robili wgl testy na rcki czy tylko narkotyki tradycyjne?
MaxGaming (1:44, 16.10.18):
co więcej są rcki na które nawet nie ma testów jeszcze
MaxGaming (1:44, 16.10.18):
nie wychodzi za bardzo w moczu. Ludzie donoszą że nawet dzień po nie ma śladu w moczu, po tylu dniach nie ma opcjo na pewno
MaxGaming (1:44, 16.10.18):
z ciekawości sprawdziłem, jesli już weźmiemy testy które obejmują RCki, do tego dodamy że to tylko najpopularniejsze to... najbardziej osławiony 3mmc(aka mefedron) jest do wykrycia w praktyce do 3 dni(testy drugie były robione bodaj po 10 dniach a przed walką to wiadomo...), ale już dzisiaj niemal równie popularny 4cmc(to nie mefedron ale sprzedają go jako mefedron bo działa tak samo a do niedawna był legalny - mefedron od wielu lat nie jest)
MaxGaming (1:24, 16.10.18):
to nie jest do końca takie proste, od zawsze przedtreningówki budzą kontrowersje. Na pewno żadna ilośc kofeiny tak nie robi
MaxGaming (1:23, 16.10.18):
pamiętajmy że kiedyś legalnie w przedtreningówkach stosowano eufedrynę dzisiaj uważaną za narkotyk, a leki z pseudefedryną(praktycznie zerowy efekt psychoaktywny w stsunku do efedryny) są ograniczone w sprzedaży
MaxGaming (1:21, 16.10.18):
nawet jedząc. Nie trzeba wcale walić w nos nawet
MaxGaming (1:21, 16.10.18):
jego oczy są porobione jak nie wiem. Wojo czerwone oczy są po trawie nie po takich rzeczach. Uwierzcie że doskonale wiem jak człowiek się zachowuje po takich rzeczach i jakie ma oczy. Testy na narkotyki wykryją amfę ale jej nawet nikt nie stosuje. Nie wykryje za to np 3mmc, 4mmc, 3cmc, 4cmc, hexenu.... mam wymieniać dalej? Każdy z tych środków działa dokładnie jak na filmiku. Jest tego tyle że nie można sobie wybierać i przebierać. Każdy z nich można zażyć po prostu w płyni
I am Lord (0:09, 16.10.18):
Co ciekawe też pod nosem mnie najbardziej swędziało i tam często próbowałem się drapać
I am Lord (0:08, 16.10.18):
dodajmy do tego adrealinę w kosmicznych ilościach u niego
I am Lord (0:07, 16.10.18):
trzymało mnie dobrą godzinę, myślałem że umrę
I am Lord (0:06, 16.10.18):
wszystko przez to zasrane swędzenie które czujesz pod skóra i drapanie na nie nie pomaga
I am Lord (0:06, 16.10.18):
mi tak ryj też wykręcało jak napalmshota przedawkowałem, a to była dawka tylko dwukrotna
Wojo (22:18, 15.10.18):
A adbuster się po prostu popisywał przed kamerami
Wojo (22:14, 15.10.18):
To, że oczy mi się robią czerwone (zwłaszcza zimą) to nie jest wina narkotyków (ani przedtreningówek)
Wojo (22:13, 15.10.18):
Mnie cały czas podejrzewają o branie narkotyków ludzie, którzy mają o tym nikłe pojęcie
Wojo (22:12, 15.10.18):
Ale co wy w ogóle opowiadacie, w życiu nie widzieliście naćpanego człowieka. Spójrzcie na jego oczy, są one normalne. To, że robi z siebie głupa i jest pobudzony wygraną i przedtreningówkami to jest inny temat
Ignatus (21:06, 15.10.18):
Trenując 20 lat na siłowni testowałem chyba wszystkie przedtreningówki na rynku- żadna nawet w podwójnej dawce nie porabia tak jak Adbustera- naćpany jest jak z podręcznika, zresztą widziałem wszystkie jego filmiki-totalnie inaczej się zachowuje normalnie
MaxGaming (16:03, 15.10.18):
a to czy on wrąbał mefę albo inny rcek do przedtrenigówki i wypił czy walnął w nos to wszystko jedno. Raczej dziwne gdyby walnał w nos bo spożycie oralne cechuje się tym że działanie trwa od kilkudziesięciu minut do kilku godzin a noski działają maksymalnie kilkadziesiąt minut, no może godzinkę zależy co wiadomo
MaxGaming (16:02, 15.10.18):
każdy kto widział kogoś po mefie ten z kilometra rozpozna co z tym typem jest
MaxGaming (16:02, 15.10.18):
nieźle lata ta szczęka, niezłe oczka a zachowanie wgl. Na pewno przedtrenigówka standardowa Na kofeinie na pewno
MaxGaming (16:00, 15.10.18):
ale gdzie duch sportu? Naćpany że ledwo co mówi i cieszy się że zwyciężył
MaxGaming (15:59, 15.10.18):
i jest problem. ale to jest problem że ciężko zakazać wszystkiego bo jest tyle stimów że nie da się nawet tego ogarnąć
MaxGaming (15:59, 15.10.18):
tylko potem zawodnikowi pikawa za którymś razem pada
MaxGaming (15:59, 15.10.18):
w lidze amatorskiej najcześciej to legalne co jest najśmieszniejsze
MaxGaming (15:58, 15.10.18):
znam ludzi którzy walczą amatorsko z takimi przedtrenigowkami zaprawianymi RCekami
MaxGaming (15:58, 15.10.18):
Wojo wiem co mówię, on był naćpany jak meserszmit. Ta przedtreningówka to conajmnej z 3mmc była haha
I am Lord (11:37, 15.10.18):
rafonix chyba go jeszcze tam wyzwał jak go magicala na noszach zawijali
Wojo (9:46, 15.10.18):
i nie byl pod wplywem narkotykow tylko co najwyzej emocji oraz ewentualnie przedtreningówek
Wojo (9:46, 15.10.18):
niepotrzebnie wysmiewal binkowskiego
MaxGaming (23:25, 14.10.18):
ten jego wywiad, ja nie wiem ile on tej nocy skonsumował narkotyków ale powinni zrobić anty doping nawet jeśli to freak fight w stylu reality show a nie sportowe wydarzenie
MaxGaming (23:25, 14.10.18):
Adbuster naćpany tak że to była porażka
MaxGaming (23:04, 14.10.18):
dobrze pociśnięta ta walka z magicalem, 40 sekund i połamany a 4lata spiny
MaxGaming (23:03, 14.10.18):
ale z rafonixa psychopata
MaxGaming (19:30, 11.10.18):
ale nie takie było pytanie
MaxGaming (19:30, 11.10.18):
Da się konfigurować php.ini dla subdomeny? Wrzucene pliku php.ini do katalogu subdomeny nie działa. Obsługa technicna odpowiedziała po prostu że zmiany dokonywane w php.ini przez directpael są przeprowadzane dla całej domeny
MaxGaming (19:13, 11.10.18):
? haha
I am Lord (18:52, 11.10.18):
Sorry ale chodziło mi o zdjęcie z tą kulką papieru
MaxGaming (15:52, 11.10.18):
nie no jeśli chodzi o to w sidebardze no to nieźle wyszłeś, przyznaję
MaxGaming (15:52, 11.10.18):
Johny Depp przy Tobie to zwykły nerdziak haha
ANtY (6:44, 11.10.18):
to w sidebarze? xDD
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.02403 sekund ] [ Liczba zapytań MySQL: 13 ]