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)
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
1 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 1, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
Shoutbox
Chell (22:01, 21.01.18):
zobaczymy w poniedzialek
BanDa (21:49, 21.01.18):
Czemu do poniedziałku?
Nikas (18:07, 21.01.18):
nie warto
Nikas (18:06, 21.01.18):
warto
Chell (14:43, 20.01.18):
ja bym z tą decyzją poczekal do poniedziałku (stay tuned)
BanDa (12:56, 20.01.18):
Dawno mnie tu nie było, jak wygląda aktualna sytuacja z GM? Warto teraz zrobić zakup czy lepiej wkuwać jave (głównie pytam o androida)
gnysek (12:03, 18.01.18):
Akurat Nintendo nie zawodzi nigdy w takich sprawach.
I am Lord (11:37, 18.01.18):
i pewnie 90% nie działa bo to efekt montażu
Uzjel (0:57, 18.01.18):
Switch jest genialny, a to wygląda zajebiście
Chell (0:26, 18.01.18):
damn, jednak nintendo to nintendo
PsichiX (21:02, 17.01.18):
no i w tym roku nie bedzie nagrody za przyklad roku
MaxGaming (20:33, 16.01.18):
JUŻ MAM XD
MaxGaming (20:29, 16.01.18):
robię jakiś podstawowy błąd bo to jest banalna strona ale ja nigdy nie rozumiałem cssa, uczę się go bardziej na pamięć bo gdybym ja robił cssa wiele rzeczy zrobiłym zupełnie inaczej bo skupisko absurdów obecnie
MaxGaming (20:28, 16.01.18):
Ten mój css jest jakiś bardziej wadliwy niż myślałem. Jest ktoś chętny żebym mu wysłał na pw protą stronkę i mi powiedział co robię źle?
Chell (13:51, 15.01.18):
konkurentów masz dwóch
Wojo (11:50, 15.01.18):
Nie daję żadnego kurde
gnysek (10:43, 15.01.18):
Kurde, w temacie na przykład roku nie mogę głosować, bo albo na siebie albo na jedynego konkurenta...
gnysek (10:43, 15.01.18):
Ja nie widzę czegoś takiego, aleeeeee może masz niekompletny profil usera
Chell (22:46, 14.01.18):
oczywiście to był żart, nic nie ustawiałem, zachęcam do głosowania
Chell (21:22, 14.01.18):
oddałem swoje głosy i ustawiłem przekierowanie, w tym roku to ja rozdaje karty
Ignatus (21:18, 14.01.18):
Ciekawe Nie można wejść na żaden z tematów [głosowanie] bo ładuje się zawsze strona o treści "Następny krok: Optional Profile Information" i nic więcej...
ANtY (13:59, 14.01.18):
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaargh
Uzjel (19:23, 13.01.18):
To MaxGaming, fake konto Paqa.
Uzjel (15:51, 13.01.18):
Moduł Androida za darmo do testów do końca miesiąca (GMS2)
Wojo (12:21, 13.01.18):
Odszedłeś bezpowrotnie z twoją muzyką.
Wojo (12:20, 13.01.18):
lil peep czemu to zrobiłeś ja pierole
Chell (8:21, 13.01.18):
no dobra, nie przemyślałem tego
gnysek (8:49, 12.01.18):
Ale to jest własnie własciwość focusu, ze jest na jednym elemencie. Inaczej to juz nie focus
ANtY (22:02, 11.01.18):
Fullscreen Windowed
Chell (20:08, 11.01.18):
w sensie zebym mial sobie gierke na full screenie na glownym, powiedzmy walkthrough na drugim i zebym mogl sie przelaczac miedzy tymi dwoma tak, zeby gra nie gubila focusu
Chell (20:08, 11.01.18):
jest jakis soft pozwalajacy na osobny focus na kazdym monitorze?
I am Lord (19:26, 11.01.18):
Sahara w krakowie?
Uzjel (21:11, 10.01.18):
Ahhh... Obejrzałem właśnie walki robotów. Fajnie było
gnysek (10:53, 10.01.18):
problemy z monetyzacją - wszyscy wrzucali darmowe rzeczy, a nikt nie płacił za miejsce - woleli cwaniakować i kilka kont zakładać.
I am Lord (21:56, 9.01.18):
A co się stało z tymi serwisami?
Morro (14:28, 9.01.18):
nie polecam nikomu ;d
Morro (14:28, 9.01.18):
wjeżdzą na banię, dopiero dzisiaj od piątku przespałem koło 8 godzin ciągiem
gnysek (7:51, 8.01.18):
chociaz pb to chyba tylko żąda kasy i zdjęć nie skasował, ale imageshack chyba po prostu wywalił serwery przez okno
gnysek (7:50, 8.01.18):
wrzuta, fotka, wiele serwisów. Najgorsze że imageshack i photobucket też, sporo contentu w sieci straciło treść bezpowrotnie.
Korodzik (1:02, 8.01.18):
huh, ja wrzutę pamiętam głównie jako magazyn pirackich muzyczek, bodajże w czasach zanim na youtube można było znaleźć dowolny utwór świata
Chell (20:38, 7.01.18):
wlasnie zauwazylem ze wrzuta.pl zniknela, a wraz z nia masa dobrej polskiej muzyki :/
I am vader (20:29, 7.01.18):
Informatycznie led.feen.us/fp8ox1id.png
Chell (18:15, 7.01.18):
w ogóle tak mi się teraz przypomniało jak byłem małym 4tk i na gmclanie funkcjonowały acziki. jeden z nich był za "wypicie pół litra sam na sam z shoutboxem", i jak wiedziałem co to pół litra, tak nie miałem pojęcia jak można je wypić z shoutboxem. dobre, beztroskie czasy
Nikas (14:55, 7.01.18):
Też raz w gimbazie widziałem. Byłem z rodzicami nad jeziorem i jakieś młode łebki się najebały i ukradły rowerek wodny w nocy. Jeden typ jakoś wypadł do wody i się nie wynurzył. Nurkowie go wyciągnęli jakieś 2 dni później. Mało przyjemny widok to był.
I am vader (14:43, 7.01.18):
Czy tylko ja trupa tutaj nie widzialem?
ANtY (14:03, 7.01.18):
nie wiem czy to taki lol
Wojo (9:40, 7.01.18):
lol xD
Chell (23:39, 6.01.18):
i no pilem do tego ze tez wtedy pol nocy nie spalem bo mi zle z tym bylo strasznie
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.
Copyright © 2002-2018. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus (ranmus.pl), © 2017 {=|=} fable_inside();

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