Nasze strony: gmclan.org gameonly.pl ps-plus.pl gameswithgold.pl n-switch.pl hmt.pl
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 dla początkujących
Treść artykułu
Zmienne lokalne, globalne i tymczasowe.
autor: gnysek (23.12.10) | czas czytania: 5 minut, 2 sekund
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:

GMLvar _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
3 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 3, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
Shoutbox
gnysekgnysek (22:58, 11.05.22):
ale tam 39dll chyba też dział, tylko trzeba było dodać brakujące argumenty z numerem bufora (bo GMS nie umiał już ustawiać niezdefiniowanych zmiennych na 0).
SutikkuSutikku (18:34, 11.05.22):
tfu, gms w ogóle, nie gms2
SutikkuSutikku (18:34, 11.05.22):
jak nauczyłem się korzystać z 39dll, to gms2 wyszedł o i tyle z moich nauk
gnysekgnysek (23:29, 9.05.22):
Pisałem już, że przekompilowałem 39dll do x64 i działa w GMS2 ?
gnysekgnysek (21:28, 28.04.22):
Pusty WP - 30-40mb ramu na 1 request.
ChellChell (14:25, 27.04.22):
narzeczona troche bardziej oblatana w temacie mi powiedziala co tam moge poinstalowac i na co zwrocic uwage zeby to zabezpieczyc, ale wciaz smiech na sali
ChellChell (14:24, 27.04.22):
stawialem ostatnio jeden landing na wp dla klienta (wykonany przez jakiegos zewnetrznego kontraktora), w tydzien jakies boty pozmienialy podstrony
ChellChell (14:23, 27.04.22):
jasne, ze powinni zaorac - najnowszy WP ma "wsparcie beta" dla php 8 (ktory wyszedl poltora roku temu), gdzie 7.4 nie jest aktywnie wspierany od 4 miesiecy.
gnysekgnysek (12:56, 26.04.22):
Wordpressa powinni zaorać. Dziwię się, że nikt nie zrobił lżejszego odpowiednika.
ChellChell (11:01, 25.04.22):
aa, nawet nie zauwazylem ze to bylo 3 dni temu
AdriannAdriann (10:09, 25.04.22):
Dziękuje ale już kolega mi to ogarnął i wszystko śmiga :3
ChellChell (9:59, 25.04.22):
nie jestem na tyle kompetentny zeby sie zdzwaniac i to tlumaczyc, ale jak mi podrzucisz dostepy to moge Ci dzisiaj wieczorem to postawic
AdriannAdriann (15:39, 23.04.22):
O kuwa, na wishliście codziennie wpadało po +-5 a tu dzisiaj walnęło i zrobiło się 82 z 28!
AdriannAdriann (22:01, 22.04.22):
privie *
AdriannAdriann (22:01, 22.04.22):
Tak, właśnie problem że nie mam się do kogo zwrócić a to sporo informacji, najlepiej byłoby na provie
gnysekgnysek (21:59, 22.04.22):
Ciężko pomóc jak napiszesz "nie działa". Coś musi się dziać. Biała strona, domyślna strona .html na serwerze, itp.
AdriannAdriann (18:58, 22.04.22):
To nie za bardzo moja dziedzina i nie wiem czy powinienem zrobić coś jeszcze żeby odpalił się instalator
AdriannAdriann (18:57, 22.04.22):
Wziąłem masterneta z któego już kiedyś korzystałem. Tylko coś mi nie działa, dawno tego nie robiłem i nie wiem co może być nie tak. Zalogowałem się do serwera ftp wg danych które wysłali i wrzuciłem rozpakowane pliki wordpressa ale strona nie działa
ChellChell (16:23, 22.04.22):
cloudways fajne na wordpressa
gnysekgnysek (20:14, 20.04.22):
Jutro o 17:00 będzie stream o przyszłości GMa, nie wrzucam newsa, bo napiszę podsumowanie pod koniec po fakcie
gnysekgnysek (20:13, 20.04.22):
ja polecam dhosting
KorodzikKorodzik (8:30, 20.04.22):
neocities
AdriannAdriann (18:36, 19.04.22):
Kiedyś polecaliście miejsca na hostowanie strony ale oczywiście nie zapisałem :d Możecie przypomnieć fajne tanie stronki?
SimianVirus7SimianVirus7 (9:37, 3.04.22):
pasuje i do strony gmclanu na 1 kwietnia i do wersji językowej polskiej do gma
UzjelUzjel (20:35, 1.04.22):
Moje oczy xD
gnysekgnysek (0:22, 31.03.22):
Dziś premiera stabilnej wersji polskiego GMS Z paroma błędami xD
gnysekgnysek (10:17, 29.03.22):
Pozdrawiam cieplutko.
PatrykPlayingPOLSKAPatrykPlayingPOLSKA (14:13, 26.03.22):
Pysznej kawusi
PatrykPlayingPOLSKAPatrykPlayingPOLSKA (14:12, 26.03.22):
Dzień dobry wszystkim !
SimianVirus7SimianVirus7 (18:53, 24.03.22):
idą jak burza z tymi aktualizacjami do gmsa
gnysekgnysek (17:10, 22.03.22):
U mnie też nie działała.
SimianVirus7SimianVirus7 (12:55, 21.03.22):
o, dziękuje, tutaj działa. Ja wchodziłem na konto i w rubrykę downloads, która jako jedyna się nie ladowała
gnysekgnysek (9:57, 21.03.22):
Samego GMa pobierzesz tutaj: gms.yoyogames.com/ReleaseNotes.html
gnysekgnysek (9:56, 21.03.22):
pobierania z marketplace ?
SimianVirus7SimianVirus7 (8:30, 21.03.22):
i tak od wczoraj próbuje pobrać i nie mogę, co ja mam skorzystać z instalki.pl xD
SimianVirus7SimianVirus7 (7:58, 21.03.22):
ja rozumiem, żeby padł marketplace... ale żeby podstrona pobierania nie działała? przecież to blokuje korzystanie ;-;
gnysekgnysek (0:00, 15.03.22):
No widzisz, jakie ładne dekadowe rocznice
KorodzikKorodzik (11:10, 12.03.22):
W którymś "Bajtku" sprzed 30 lat był cały artykuł o wyświetlaniu "duszków" - nie spodziewałem się, że znowu to zobaczę
AdriannAdriann (9:36, 11.03.22):
A te duszki to już w ogóle :d
AdriannAdriann (8:17, 11.03.22):
To jakaś totalna abstrakcja
gnysekgnysek (0:14, 11.03.22):
Dziwnie się używa GameMakera w wersji PL... 🇵🇱
gnysekgnysek (9:59, 7.03.22):
Front jest nasz, forum nie, a kod był pisany pod stare IPB więc coś może nie łączyć czasem. W wolnej chwili w to zerknę.
ChellChell (9:39, 6.03.22):
przecież to jakaś totalna amatorszczyzna, myślałby kto że z tak wysoką opłatą rejestracyjną wiązałaby się wyższa jakość usługi
MamPytanieMamPytanie (21:52, 5.03.22):
Przecież to co jest dostępne jako gość nadal powinno być dostępne
MamPytanieMamPytanie (21:52, 5.03.22):
No tak, tylko problem nie jest w samym forum. Chociaż tam też powinna być po prostu jak an moje blokada postu, a tu dla ułatwienia ktoś walnął na każdą podstronę plus logout też powinien być na forum. Ale problem w tym że na strone gmclan można, a na forum już nie można. Tak samo na stronie gmclan(a nie na forum) nie można wejść w ustawienia użytkownika nawet. W sumie w ogóle to jakaś amatorka, że naprościej bylo z miejsca zablokować wszystko. Przecież to co jest dostę
gnysekgnysek (9:42, 4.03.22):
coś w stylu adssasdad@adasdasd.com Forum jest zaprojektowane przez Invision Board, możesz napisać reklamację Ale dzięki za info, muszę sprawdzić z tym wylogowywaniem
AdriannAdriann (8:08, 4.03.22):
pewnie miałeś Rosyjskiego maila!
MamPytanieMamPytanie (0:39, 4.03.22):
Dobra jestem, zapomniałem że rzeczywiście to konto wyżej założyłem na podejrzany email i przecież poprawne było bez jedynki na końcu(hasło miałem to samo XD)
MamPytanie1MamPytanie1 (0:26, 4.03.22):
Nie mogę też użyć funkcji wyloguj. Po prostu świetnie ktoś zrobił to forum XD Nie wiem kto je projektował, ale podejrzewam, że jakiś pijany student bądź gimazjalista. Muszę wyczyścić coockies żeby się wylogować, a dostępu do emaila nie mam czy ustawień konta.
MamPytanie1MamPytanie1 (0:24, 4.03.22):
Nawet nie mogę sprawdzić jakiego emaila podałem gdyż wejście we własny profil też mam zablokowane. Czy to tak powinno działać? XD
Ankieta
» Kiedy wyjdzie GameMaker 3.0?
Q1 2022
Q2 2022
Q3 2022
Q4 2022
2023 albo i później

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

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