Zmienne lokalne, globalne i tymczasowe.

Czwartek, 23 Grudnia 2010, 22:37
Czas czytania 5 minut, 2 sekundy
Zgodne z GM: gm5 gm6 gm7 gm8 gms1 gms2
Krótki opis tego, jakie typy zmiennych występują w GM.
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:

kodvar _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.
Komentarze (łącznie 16, wyświetlam 1 - 15):
HuderLord (Czw., 23 Gru. 10, 22:49)
#1

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

Shocker51374 (Czw., 23 Gru. 10, 22:53)
#2

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

gnysek (Czw., 23 Gru. 10, 22:58)
#3

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

HuderLord (Czw., 23 Gru. 10, 22:59)
#4

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. :P

gnysek (Czw., 23 Gru. 10, 23:01)
#5

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.

sunflower (Pią., 24 Gru. 10, 12:18)
#6

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.

Platyna (Sob., 25 Gru. 10, 17:47)
#7

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

gnysek (Pon., 27 Gru. 10, 09:54)
#8

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

mentos_96 (Sob., 08 Sty. 11, 17:02)
#9

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

Muuuuczek567 (Sob., 08 Sty. 11, 17:20)
#10

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

baca (Nie., 16 Sty. 11, 12:39)
#11

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

kt1117 (Pon., 17 Sty. 11, 21:17)
#12

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

p
pablo1517 (Nie., 27 Mar. 11, 01:55)
#13

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

mentos_96 (Nie., 27 Mar. 11, 11:13)
#14

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

gnysek (Nie., 27 Mar. 11, 11:20)
#15

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

Najnowsze wersje GameMakera:

Stabilna
2024.2.0.132 • 2024.2.0.163
wydana 43 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 182 dni temu
Beta
2024.400.0.532 • 2024.400.0.551
wydana 14 dni temu
= IDE, = Runtime
Użytkownicy online
2 użytkowników aktywnych:
gości: 1, userów: 1
 Cannon Fodder
(~ostatnie 15 minut)
Discord
48 użytkowników online na discordzie:
Kysiu, s..., Alice, DungeonFairy🧚, Nitro Slav, Carl-bot, p..., Dominator2v, Grela, Wielki Druid, TinyFish, Add92, 21Lancz, Kowu, OdrzuconyKrakers, Filyps, fervi, Radek Ignatów, Kalor, r..., antek, LadyLush, lethian, VanhGND, HappyOrange, MKP (GEM), Arrekin, MagnusArias, Domeen0, Dyno, 🆅🅸🆃🅾74🅼, Deusald, Korodzik, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, LeD, Ulti, 🧁Cupcake🧁, bagno, Mtax, g..., l..., Alkapivo, moeglich, Nikas, Krzysiek1250, Shockah, Kandif, exigo
Shoutbox
gnysek (20:44, 11.04.24)
Niektórzy dlatego wybierają GMEdit. Ale ja liczę na Code Editor 2, tylko na razie zbyt zbugowany jest.
Tymon (16:11, 11.04.24)
Stitch dla mnie osobiście jest lepszy bo nie musze kopać się z interfejsem GMa i mogę tylko pisać kod.
Tymon (16:05, 11.04.24)
Yes. Obecny nie jest taki zły, jak zainstalowałem najnowszą stabilną to w porównaniu z tym czego używałem... 10 lat temu...? Wszystko wydaje się lepsze.
gnysek (22:48, 10.04.24)
bscotch/stitch ? Ja czekam na fixy do nowego edytora, bo wszystko wydaje się dziś lepsze od tego obecnego :D
Tymon (19:54, 10.04.24)
Hm, Stitch okazuje się całkiem dobrą alternatywą dla wbudowanego edytora
Wojo (22:16, 08.04.24)
siemano huder myślałem, że zniknąłeś całkiem z gmclanu bo na discordzie cie nie ma :D
I am Lord (00:37, 05.04.24)
O dzięki :D
gnysek (09:58, 02.04.24)
Znalazłem na podstawie jego postów: youtube.com/@Jakim_
I am Lord (20:16, 01.04.24)
Ktoś ogarnia jakie konto miał Jakim na YT?
gnysek (16:07, 29.03.24)
Nowy Edytor kodu jednak po świętach
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?