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 dla początkujących
Treść artykułu
Zmienne lokalne, globalne i tymczasowe.
autor: gnysek (23.12.10)
Zmienne w GM można podzielić na 3 typy: tymczasowe, lokalne i globalne.

Zmienne globalne:

Zmienna globalna to taka, która dostępna jest dla wszystkich obiektów w jednym jej egzemplarzu. GM posiada kilka wbudowanych zmiennych globalnych, np. fps - liczba klatek na sekundę jest jedna dla całej gry. Nie ma innej liczby klatek dla jednego obiektu, innej dla drugiego - z każdego obiektu uzyskamy tą samą wartość w danej chwili.
Własne zmienne globalne poprzedzamy słowem global oraz kropką, po której następuje nazwa tej zmiennej.
Można też użyć słowa globalvar a po nim wypisać zmienną (lub zmienne po przecinku) i nie potrzeba wtedy poprzedzać ich słowem global., niestety zapis taki może nam utrudnić pracę z grą - za tydzień możemy już nie pamiętać, że dana zmienna była globalna, lub lokalna, bo jej zapis o tym nie świadczy - podaję to raczej jako ciekawostkę. Aby oszczędzić sobie nerwów, zawsze pisz global. przed zmienną.
Zmienne globalne od momentu zdefiniowana są dostępne w grze aż do jej wyłączenia i nie resetują swoich wartości gdy zmieniamy plansze.

Zmienne lokalne:

Zmienne lokalne to takie, które istnieją tylko w danej instancji obiektu. W związku z tym, mając na planszy np. 5 obiektów przeciwnik, każdy egzemplarz (instancja) posiada te same zmienne, ale inne wartości. Inaczej mówiąc, ustawiając jakąś własną zmienną z góry wiemy, że zmienna o takiej nazwie w tym obiekcie istnieje - ale każdy egzemplarz tego obiektu może mieć inną wartość. Np. może to być zmienna energia. Na początku (w create) ustawiamy ją w obiekcie przeciwnik na 100, ale przy kolizji z nabojem odejmujemy 10. W tym momencie jeden z egzemplarzy obiektu przeciwnik na planszy może mieć 90 energii, a inny 60. Oba mają zmienną o tej samej nazwie, ale oba posiadają swoją własną (lokalną) wartość.
Tych zmiennych nie poprzedzamy niczym. Musimy je po prostu zdefiniować (czyli podać wartość początkową) przed pierwszym użyciem w warunku, lub operacją matematyczną jak dodawanie, odejmowanie itp. Zmienne lokalne znikają wraz z eventem destroy, lub z końcem planszy (wtedy niszczone są wszystkie obiekty bez opcji persistent, więc ich dane są usuwane).

Zmienne tymczasowe:

Zmienne tymczasowe to takie, które istnieją (jak sama nazwa mówi) tylko przez pewien czas. Używamy ich np. do jakichś tymczasowych obliczeń, czy przypisania pewnych wartości które potrzebujemy w danym kawałku kodu kilka razy (np. odległość między dwoma punktami, na podstawie której wykonane są jakieś akcje) - najczęściej są pewnym rodzajem bufora który pomaga nam przetrzymać coś przez chwilę w pamięci, lub ograniczyć wywołanie jakiejś funkcji aby nie przeciążać gry.
Zmienne tymczasowe mogą działać w dwóch zakresach: całego skryptu, lub klocka z kodem, lub też tylko w bloku kodu (tzn. pomiędzy znakiem { i } na wszystkie jego podbloki). Gdy dany blok, klocek z kodem lub skrypt kończą się, zmienna nie jest więcej dostępna.
Zmienne tymczasowe definiujemy poprzez var, a następnie po spacji nazwa (lub kilka po przecinku). Warto pamiętać, że wartość możemy (i musimy przed użyciem) przypisać im dopiero w kolejnej linijce.
Kolejną ważną rzeczą jest informacja, że zmienna tymczasowa jest dostępna również w instrukcji with pomimo wykonywania kodu w innym obiekcie, tzn. hipotetycznie załóżmy, że mamy obj_obecny i obj_inny i wywołujemy kod w tym drugim za pomocą with:

gml:
var _zmienna;
_zmienna = 10;

with (obj_inny) {
if (x == _zmienna) then {}
}


Jak widać, mamy dostęp do zmiennej tymczasowej, pomimo, że nie należy ona do tego obiektu. W przypadku gdyby była to zmienna lokalna, należało by napisać obj_obecny.zmienna, lub other.zmienna, aby uzyskać wartość zmiennej z pierwszego obiektu w tym drugim, a nie do własnej zmiennej tego drugiego.
Można więc w skrócie powiedzieć, że zmienna tymczasowa jest zmienną o zasięgu globalnym która znika wraz z zakończeniem bloku kodu, lub danego skryptu. Ponieważ kod obiektów jest wykonywany jeden po drugim (chociaż tak szybko, że mamy wrażenie, iż dzieje się to w tym samym momencie), to zmienne te nie przeszkadzają sobie wzajemnie.
Przykładem użycia zmiennej tymczasowej jest np. otworzenie jakiegoś pliku z którego czytamy tekst - potrzebujemy mieć uchwyt na ten plik który zwraca funkcja, ale przecież nie potrzebujemy go przez np. 10 godzin trwania gry, tylko raz, przez ułamek sekundy, gdy odczytujemy plik. W tym przypadku, zmienna tymczasowa dostanie uchwyt na plik, a na końcu danego skryptu zniknie i nie będziemy mieć już na ten uchwyt dłużej dostępu.
Znak _ przed nazwą nie jest potrzebny, ja używam go aby odróżnić te zmienne od lokalnych gdy wracam do kodu po długiej przerwie.
Jeszcze jedna informacja - jeżeli w kodzie wywołamy jakiś skrypt, a zmienna tymczasowa istniała,to będzie ona dostępna również w tamtym skrypcie, więc te zmienne są dziedziczone - tak jak mówiłem, są tymczasowo globalne.


PODSUMOWANIE:

Zmienna globalna: np. global.zmienna = 1; - dla wszystkich obiektów jest to ta sama zmienna, zmieniając ją z jednego obiektu inne odczytają tą nową wartość.

Zmienna lokalna: np. zmienna = 5; - pomimo tej samej nazwy, każda kopia obiektu może mieć inną wartość.

Zmienna tymczasowa np. var _zm; _zm = 5; - nie można się do niej odwołać z innego obiektu i istnieje tylko od miejsca w którym ją zdefiniujemy, do końca okienka w którym aktualnie piszemy kod, lub, jeśli występuje po znaku { do znaku } który tę pierwszą klamerkę zamyka, i nie przechodzi pomiędzy klockami/skryptami itp.


Porównując to z programowaniem obiektowym, zmienna globalna to właściwość klasy statycznej global, lokalna to publiczna właściwość instancji (obiektu) klasy, a tymczasowa to zmienna użyta w metodzie.
głosów: 8 | ocena: 8.63 oceń zasób | dodał: gnysek
Komentarze
stron: 1

1


av

I am Lord (22:49, 23.12.2010)

globalvar wth, skąd o tym się dowiedziałeś?

av

Shockah (22:53, 23.12.2010)

Ja tam już od wieków używam globalvar.

av

gnysek (22:58, 23.12.2010)

Przez przypadek zobaczyłem w jakimś artykule albo przykładzie Marka Overmarsa.

av

I am Lord (22:59, 23.12.2010)

W sumie może być przydatne jak by się nazwało takie zmienne z jakimś przedrostkiem ( np. glCostam ). Zawsze mnie wnerwiało że muszę pisać global.costam bo jestem leniwy i wolę krótkie zmienne, które się szybciej pisze. Od teraz będę robił globalne z użyciem globalvar.

av

gnysek (23:01, 23.12.2010)

ja mam w almorze obiekt, który mi ustawia vx i vy i to są moje aliasy do view_xview[0] itd., zeby tyle nie pisać, a tam trochę rzeczy tego uzywa. W innych miejscach tego unikam, dla bezpieczeństwa i zeby sie nie pomylić. Myślę, że 2-3 zmienne w całej grze korzystające z globalvar to maks., dla nie zaciemniania kodu.

av

sunflower (12:18, 24.12.2010)

Podoba mi się ten artykuł, nawet niespodziewanie się dowiedziałam czegoś nowego (globalvar), nawet jeśli nie zamierzam z tego nadmiernie korzystać (choć miejscami faktycznie może się przydać). Poza tym podoba mi się pomysł poprzedzania nazw zmiennych tymczasowych podkreślnikiem dla odróżnienia od lokalnych.

av

Platyna (17:47, 25.12.2010)

Niesamowite. Nawet ja się czegoś nowego nauczyłem. Nigdy z tymczasowych nie korzystałem, bo nie widziałem, ze tak działają w połączeniu z with więc zawsze używałem globali do takich zadań.

av

gnysek (9:54, 27.12.2010)

Platyna, ja się o tym with dowiedziałem z pół roku temu, bo też korzystałem z globalnych

av

Mentoss (17:02, 8.01.2011)

hehe... globalvar to bardzo ciekawa informacja. Co do przedrostków - w większosci kodu i tak oznaczam zmiennne tymczasowe przez v_zmienna bądź _vzmienna, a skrócenie global. do g_ będzie dobrą opcją...

av

Muuuuczek567 (17:20, 8.01.2011)

Ja to wszystko wiedziałem przed przeczytaniem tego artykułu. Ale jeśli nawet Platynie się przydał...

av

baca (12:39, 16.01.2011)

Nie jest sztuką znać, sztuką jest umieć użyć.

av

kt1117 (21:17, 17.01.2011)

Ja tam używam prawie samych globalnych, nie trzeba potem kombinować i szukać gdzie się daną zmienną zadeklarowało (chyba że deklaruje ją w skrypcie).

av

pablo1517 (1:55, 27.03.2011)

Co do przedrostków, to ja jak "pracowałem" kiedyś z tymonem to przybrałem sobie jego nawyk robienia _____zmienna xD itp

av

Mentoss (11:13, 27.03.2011)

Pięć podłóg? Domek sobie budujesz? Uważaj, bo Ci desek zabraknie

av

gnysek (11:20, 27.03.2011)

W obiektówce często właściwości i metody prywatne mają podłogę przed nazwą, bo łatwiej je wtedy odróżnić.

av

Tymon (14:09, 27.03.2011)

Ja akurat tymczasowe oznaczam różnie. Przeważnie coś w stylu t_..., czy po prostu __..., sposobów jest wiele, każdy woli inny.

stron: 1

1



Dodaj komentarz:
Treść:
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Użytkownicy on-line
79 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 77, userów: 2, ukrytych: 0
lew_leo, ALT

0 użytkownik(ów) na gmczacie i 0 bot(ów)
Shoutbox
Nikas (15:16, 21.01.17):
ayyy ;///
exp (13:54, 21.01.17):
to nie byłem ja
Wojo (13:23, 21.01.17):
tylko przy referenie
Wojo (13:22, 21.01.17):
tatu - robot
Nikas (13:01, 21.01.17):
A ja nie wiem już, pamiętam tylko, że pytałeś się przy jakim traczku ją przelecieć. xDDD
exp (11:37, 21.01.17):
o jakiej lasce ja ci pisałem kiedyś?
Nikas (0:15, 21.01.17):
spk a u ciebie exp? stuknąłeś w końcu tą laskę co mi o niej pisałeś kiedyś? xD
Chell (0:02, 21.01.17):
przywolalem po nieobecnosci od wrzesnia, nie ma za co
exp (23:47, 20.01.17):
jak tam żyjecie
Nikas (23:39, 20.01.17):
XDDDD
MaxGaming (22:52, 20.01.17):
YXE bo jak mówiłeś trzeba być miłym dla niepełnosprawnych
Nikas (22:41, 20.01.17):
Jezu w ogóle olać kwestię bana czy ostrzeżenia. xD Przeciez jak ja teraz dostaję warna to nie wiem co o tym mysleć. xD
ΨΧΞ (22:34, 20.01.17):
to dlaczego nie mam?
MaxGaming (22:15, 20.01.17):
No ale jak już YXE sam wszedł w ten temat to gdyby Nikas obraził jego matkę(w dodatku sugerując że jest lekkich obyczajów) miałby bana na pewno...
Wojo (22:13, 20.01.17):
powinieneś dostać na odmułę ale układy, układziki
MaxGaming (22:11, 20.01.17):
Masz na myśli że ja teraz zasugerowałem że złamałeś regulamin? Nie, nie zasugerowałem
ΨΧΞ (22:09, 20.01.17):
iksde xD zastanawiam sie, skoro rzekomo złamałem regulamin, dlaczego nie mam jeszcze bana?
MaxGaming (21:08, 20.01.17):
Pod tytułem "Czy jeżeli 27 latek obraża matki innych userów ci zareagują inaczej niż na gimba?" XDD
ΨΧΞ (17:50, 20.01.17):
durnyś xD
Ranmus (17:43, 20.01.17):
O wy durni, ale się daliście wciągnąć. Przecież to kolejny test socjologiczny. Nie widzicie tego?
ANtY (7:27, 20.01.17):
>długa dyskusja przed snem, że po prześwietleniu historii postów patryka jego DZIEWCZYNA (ONA MA DZIEWCZYNE, NIE ZAPOMNIJCIE!!! była zawiedziona poziomem jego wypowiedzi, po czym nastąpiły długie przeprosiny i obietnica poprawy hmm
Wojzax (2:47, 20.01.17):
YXE co to za pedalski slang i gdzie jest obiecana gra w niszczenie wieżowców?
ΨΧΞ (22:48, 19.01.17):
nudzi mi się, odpisz coś
ΨΧΞ (22:25, 19.01.17):
pamiętasz, co pisałem o mojej obietnicy grzecznego i miłego odzywania się do niepełnosprawnych? nom, to pardon, ale albo załapiesz, albo ta dyskusja nie ma sensu :*
MaxGaming (21:41, 19.01.17):
Patrząc na ilość buziaczków i czułych zwrotów to chyba Twoja dziewczyna jest bardziej męska od Ciebie?
Adriann (20:28, 19.01.17):
Nie mit, nie chodzi tam o samą ilość a nie radzenie sobie organizmu z czymśtam..;d
Ignatus (20:11, 19.01.17):
Nie wiem czy z tym testosteronem i łysieniem to nie jakiś mit.W końcu najwyższy poziom testy jest w okresie dojrzewania-kiedy każdy ma burze loków, a po 30 zaczyna gwałtownie spadać,kiedy właśnie u większości zaczyna się łysienie...
ΨΧΞ (19:56, 19.01.17):
xD oj pysiu głuptaśny, a w mikołaja też wierzysz? nie przejmuj się, każdy ma prawo nie wiedzieć - pozwól, iż przedstawię Cię łysinie androgenowej. dokształcon? nie dziękuj :*
MaxGaming (19:00, 19.01.17):
No zazwyczaj stres o tym mówię, tylko że YXE twierdzi że nie ma uczuć i się niczym nie przejmuje absolutnie xd
Adriann (18:55, 19.01.17):
Eee nie ma co się przejmować, sam mam bardzo mało włosów i wiem że niebawem będę miał kolano na głowie ale to nie oznaka stresu a zbyt dużej ilości testosteronu, możesz nie mieć włosów a dalej być takim seksualnym tyranozaurem jak ja
MaxGaming (18:48, 19.01.17):
A czy łysienie w tym wieku to nie jest głównie oznaka stresu? Czy stres nie oznacza że jednak masz emocję i dosyć bardzo się przejmujesz? xd Zrozum że udając kogoś kim nie jesteś zawsze wcześniej czy później narazisz się na śmieszność. Masz ogromną wiedzę i ogółem swoimi dobrymi stronami powinieneś się legitymować a nie udawać coś w wieku 27 lat...
Wojo (17:10, 19.01.17):
nawet moja składnia
Wojo (17:10, 19.01.17):
nie wiesz wcale, że jego nic nie rusza ?
Wojo (17:10, 19.01.17):
ah ty pysiaczku głupaśny
ΨΧΞ (16:59, 19.01.17):
nie, no jasne iż nie mam. to mój najczulszy punkt, przezeń płaczę po nocach
Ranmus (16:41, 19.01.17):
Patryk spokojnie. Nie musisz tak szczegóło tłumaczyć, że masz dystans do siebie w kwestii łysienia... masz?
ANtY (16:09, 19.01.17):
zawsze kisne xD
ANtY (16:08, 19.01.17):
>ludzie często pytają mnie [..]
ΨΧΞ (15:29, 19.01.17):
przeto to logiczne: chociażby dlatego, że noszę kapelusz i mówię dlaczego, gdy ktoś mnie pyta, nawet tu się to przewijało myślałeś, że noszę go bo chcę być fajny i mędrkuję? xD kaman, łysina jest nieestetyczna D: musiałbym się ogolić cały, a do 30-stki nie zrobie tego.
Ranmus (14:39, 19.01.17):
Patryk, przecież o tym wiem i nie neguję. Zresztą skąd miałbym wiedzieć, że łysiejesz skoro cały czas nosisz czapkę?
Wojo (14:20, 19.01.17):
brrr xD
ΨΧΞ (13:40, 19.01.17):
znikas, dzięki - ląduje w kolekcji memów :*
ΨΧΞ (13:39, 19.01.17):
Pysiaczku głuptaśny, przeto ja mówiłem, "[...] bo łysieję" - nie było tam nigdzie "nie". ale to cudowne, że się starasz pamiętać :*
Ranmus (13:31, 19.01.17):
Zmień "bo mam klasę i chłód" na "bo mam klasę i wcalę nie łysieję Xd". Będzie legitniej.
Nikas (13:23, 19.01.17):
also psichix fajne meme znalazłem podobne tylko z innym kolesiem hehe gmclan.org/uplo...wiek_top_bk.png
Nikas (13:18, 19.01.17):
>mów komuś o tym, żeby nauczył się dobrych pocisków >sam dowal jakiś gimbopocisk po matce xDDDD boże jak to możliwe mając tyle lat
Ignatus (11:11, 19.01.17):
Dzieki
Ranmus (11:10, 19.01.17):
Korodzik, co tam u rodzinki słychać?
Korodzik (10:55, 19.01.17):
Ignatus, kliknij "Opcje" i wybierz widok standardowy
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.01382 sekund ] [ Liczba zapytań MySQL: 16 ]

thecrims Otserv List Otserv LyricsTown Harry Potter Serwery Gier
dev nodev