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 16 - 30):
Tymon (Nie., 27 Mar. 11, 14:09)
#16

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

Najnowsze wersje GameMakera:

Stabilna
2024.13.1.193 • 2024.13.1.242
wydana 181 dni temu
LTS
2022.0.3.85 • 2022.0.3.99
wydana 316 dni temu
Beta
2024.1400.0.907 •
2024.1400.0.896
 0.17.0

wydana  wczoraj
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
35 użytkowników online na discordzie:
Miłosz, Nikas, LeD, Carl-bot, Saus, GibkiKaktus, Andrzej Apparition, Alkapivo, Radek Ignatów, r..., Threef, Arrekin, yazaa, Destiny, Dyno, 🆅🅸🆃🅾74🅼, szmalu, Korodzik, sgames, Sporekula, Kandif, Danieo, bagno, antek, 🧁Spookcake👻, Tidżi, Mtax, MrTesterr, g..., Huder, s..., l..., moeglich, Add92, Shockah
Shoutbox
S
Sutikku (10:42, 14.10.25)
Ja jeszcze trafiam na fora jak szukam konkretnych haseł (chociażby wczoraj zepsuty pendrive który się identyfikuje jako Phison 2307 Boot ROM). Teraz projekty opensource często mają społeczności na discordzie i tam jest tona przydatnych informacji ale niedostępna poza discordem. Fajnie by to było wyeksponować
Korodzik (04:24, 14.10.25)
A w sumie to forum się normalnie indeksuje w wyszukiwarkach? Bo ja stwierdziłem, że np. w Google ciężko znaleźć cokolwiek z gmclanowego forum. Większość tematów jest chyba nieindeksowana od dawna...
S
Sutikku (08:44, 13.10.25)
mam niedokończony projekt bota, którego dodaje się do discorda, a on synchronizuje wiadomości z discorda -> na readonly forum. Wtedy treści mogą być indeksowane z wyszukiwarek i łatwo dostępne bez logowania. No ale leży w czyśćcu i czeka.
Wojo (11:52, 11.10.25)
Może kiedyś powróci moda na fora internetowe. Pamiętam w sumie, że czasami aktywność rosła i malała, ale tak pusto to chyba jeszcze nigdy nie było i myślę, że ta cała migracja użytkowników jest zasługą Discorda i zmiany czasów. Po prostu lata dwudzieste spowodowały zmiany trendów w internecie
S
Sutikku (09:06, 08.10.25)
najwyższa pora zopensourcować kod gmclanu!
gnysek (10:33, 06.10.25)
Może tak zrobię :D Jak znajdę czas :D
I am Lord (10:49, 01.10.25)
Tutaj powinna być na głównej jakaś wielka informacja o tym że na Discordzie teraz wszystko jest
Wojo (20:34, 17.07.25)
Discordy i Facebooki pogrzebały erę forów internetowych...
gnysek (10:36, 04.07.25)
Bo wszyscy piszą na discordzie :)
M
Modnar23 (20:08, 29.06.25)
Ja po 13 latach postanowiłem się zalogować i widzę, że straszne pustki na forum. Kiedyś to aż huczało na forum. :)
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?