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:

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
3 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 1, userów: 2, ukrytych: 0
Konrad-GM, Adriann
Użytkownicy na czacie discord
SimianVirus7 (7:13, 5.08.20):
Masz rację, przepraszam ._. jak zwykle gmclan służy dobrą radą
gnysek (0:26, 5.08.20):
Ale jak widzisz, wszystko dziala zgodnie z dokumentacją + możliwościami danego systemu.
SimianVirus7 (17:29, 4.08.20):
dobrze, że przypomniałem sobie jeszcze o nieobsługiwanych back slashach w linuksie, bo też mi to napsuło krwi >
gnysek (17:07, 4.08.20):
Android to linux, na pewno nie potrafi
SimianVirus7 (15:55, 4.08.20):
A widzisz, bardzo możliwe. Windows potrafi kasować folder z zawartością, a android możliwe, że nie. Czyli wystarczy napisać funkcje z file_find_next w środku. Dzięki
gnysek (16:59, 3.08.20):
Zapewne nie można kasować NIEPUSTYCH katalogów, musisz najpierw skasować wszystkie pliki (file_find_next itd.) i wtedy katalog.
gnysek (16:58, 3.08.20):
Dlaczego nie można kasować folderów? Pierwsze o tym słyszę.
SimianVirus7 (12:38, 3.08.20):
Więc albo jestem głupią kanapką i nie potrafię czytać albo na serio nie można, a wielu ludzi w tym Ty Gnusku znają gma o wiele lepiej niż ja i czasem znają jakieś fajne skróty
SimianVirus7 (12:35, 3.08.20):
Niezbadane są dla mnie ścieżki gma, np. nie widziałem w dokumentacji że na androidzie nie można kasować folderów (a tworzyć można, co jest dziwne)
gnysek (11:27, 3.08.20):
A skąd w ogóle pomysł, że można na skróty, jeśli nie jest opisany w dokumentacji ?
Borek (21:59, 2.08.20):
Ja kasuję każdy plik osobno. Nie mam żadnych katalogów po drodzę. Możliwe, że usuwanie katalogów nie działa, w sumie to nie sprawdzałem tego nigdy
SimianVirus7 (21:50, 2.08.20):
pewnie nie można na skróty zrobić file_delete("*"? Czy są do tego jakieś sprytne kody?
SimianVirus7 (21:40, 2.08.20):
no właśnie mam zrobione, żeby usuwał cały folder z "sejwami" i na androidzie to nie działa :/
Borek (21:36, 2.08.20):
Działa w working_directory poza tym katalogiem nie działa. Ja tak mam w Almorze, że jak gracz chce rozpocząć nową grę to usuwa pliki "sejwów"
SimianVirus7 (20:48, 2.08.20):
file_delete() nie działa na androidzie? czy działa tylko z rootem?
Flashek (23:18, 30.07.20):
dzieki ale nie skorzystam
gnysek (15:16, 9.07.20):
Nowy manual do GMS manual.yoyogames.com
gnysek (11:26, 3.07.20):
Nie, Kinga ma bledszą cerę i mniej zdrową.
nowy_user (10:51, 3.07.20):
No, Kasia teraz już się trochę postarzała, pewnie teraz celujesz w Kingę Dudę Podobny typ urody. Choć jak jej tata dowie się, że swego czasu głosowałeś na Tuska, to zabroni Wam się spotykać
gnysek (0:15, 3.07.20):
Zdecydowanie bardziej Kasia
gnysek (0:14, 3.07.20):
To bylo jakieś zdjecie ze szkoły, w wiecej osób, nic szalonego.
nowy_user (11:16, 2.07.20):
Ja to jestem bardziej zainteresowany tym zdjęciem Gnyska z plakatem Martyny Wojciechowskiej. Zawsze myślałem, że Gnysek podbijał do młodej i niewinnej Kasi Tusk, a to jednak dojrzała i niezależna kobieta zawróciła mu w głowie. Ciekawe...
gnysek (0:44, 2.07.20):
Hm, obawiam się, że kiedyś sporo rzeczy leciało nieodwracalnie do kosza i sporo kontrowersyjnych tematów i postaci zniknęło bez śladu. Dziś sam bym to poczytał.
Korodzik (20:25, 1.07.20):
A gdzie to się działo w ogóle? Na forum, w shoutboxie? Bym se poczytał i się pośmiał
gnysek (11:22, 1.07.20):
No co Ty, wystarczyła weryfikacja IP, GMCLAN akurat zawsze je zapisywał.
nowy_user (10:50, 1.07.20):
Pamiętam to, i moim zdaniem zbyt szybko oskarżyliśmy Elvisa o podszywanie się bez dostatecznych dowodów. Jak na moje to mógł być Mark Overmars we własnej osobie. W tamtym okresie GMClan przeżywał swoje lata świetności i to było całkiem prawdopodobne, że takie osobistości nas odwiedzały.
Korodzik (10:39, 1.07.20):
Mnie ciekawi ta historia o użytkowniku podszywającym się pod Overmarsa...
Korodzik (10:27, 1.07.20):
27
adam014 (6:41, 1.07.20):
27
gnysek (0:26, 1.07.20):
28/59.
Adriann (21:21, 30.06.20):
Trudne cholerstwo Twój wynik: 16/59
nowy_user (21:03, 30.06.20):
Przyznawać się, ile punktów zdobyliście. U mnie 53/59.
nowy_user (21:00, 30.06.20):
Hej chłopaki! Znalazłem coś świetnego! Test ze znajomości Gmclanu. Jeszcze z dawnych czasów: funtest.pl/test/gmclan
Adriann (22:56, 26.06.20):
Ja odpaliłem alee zrobił mi się burdel w projekcie więc uznałem że przetestuję nieco później;p
Threef (17:08, 26.06.20):
Ficzerki są fajne, ale nie do istniejących projektów ani projektów "na godzinkę". Trzeba zacząć coś większego by skorzystać
nowy_user (15:46, 26.06.20):
Każdy się boi tych nowych ficzerów Chłopaki z YoYo zarywali nocki, pracowali ponad siły, żeby nam tylko dogodzić, a teraz nikt z tego nie korzysta...
gnysek (15:06, 26.06.20):
Nadal nic ?
SimianVirus7 (19:19, 22.06.20):
Zainstalowałem ale jeszcze nie sprawdziłem. Jak dla mnie jest dużo nowych opcji i to trzeba usiąść w niedziele na spokojnie
gnysek (10:24, 22.06.20):
Sprawdziliście już 2.3 ?
SimianVirus7 (18:25, 17.06.20):
Szampan wylewa się...
nowy_user (16:06, 9.06.20):
W takim razie zaczynam chłodzić szampana.
gnysek (13:33, 9.06.20):
Publiczna beta GMS 2.3 powinna ruszyć dziś, bo jakiś update kont leci.
gnysek (1:29, 30.05.20):
Gdyby szefem był overmars, to by się nazywało GameMaker 12 teraz
gnysek (1:28, 30.05.20):
Przecież russell ma gówno do powiedzenia. Playtech tym rządzi.
nowy_user (13:28, 29.05.20):
Gdyby szefem dalej był Mark Overmars, to pewnie zgodziłby się, to był idealista. Russel to inna sprawa, ma żonę, dzieci, rachunki do opłacenia. Nie ma szans, że obniży cenę, nawet jakby ludzie zagrozili zniszczeniem kopii Lemingów na jego oczach.
gnysek (1:44, 29.05.20):
Jaka zadyma, stary temat ktoś odświeżył i na gównie się zna.
SimianVirus7 (17:50, 28.05.20):
Ja mam zamiar kupić export na androida, fajnie jakby też jakaś promocja z tego wynikła
nowy_user (17:15, 28.05.20):
Na forum YoYo zadyma, sfrustrowani użytkownicy strajkują i żądają obniżenia cen licencji na konsole. Poszła już nawet petycja w tej sprawie, a niektórzy grożą zainstalowaniem Unity!
SimianVirus7 (21:26, 24.05.20):
GMS 2 Line Counter
SimianVirus7 (21:26, 24.05.20):
Dobra, Dzięki Threef, poszukałem i jest jakaś alternatywa do gms2
Ankieta
» Ile powinny trwać tury Ligi 24?
24h
48h
54h (piątek od 18:00)
7 dni
inna długość (podałem w komentarzu ankiety)

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

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