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:

¤ KopiujGMLvar _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
4 użytkownik(ów) aktywny(ch) przez ostatnie 15 minut:
gości: 4, userów: 0, ukrytych: 0
Użytkownicy na czacie discord
Shoutbox
gnysekgnysek (23:51, 15.01.23):
Na fullscreenie nie, ale w okienku owszem. Najlepiej podpatrzyć jak robią to inni
MastodontMastodont (14:32, 14.01.23):
Jaką polecacie bezpieczną rozdzielczość gry na ten game jam Opery? 1920x1080 to chyba za dużo na przeglądarkę?
gnysekgnysek (15:03, 10.01.23):
Nie no, nginx, php, bazy danych
SutikkuSutikku (13:59, 10.01.23):
przenosiny ubuntu pewnie zamknęły się w przeniesieniu /home?
gnysekgnysek (11:26, 9.01.23):
Dziś pierwszy dzień pracuję z nowego lapka, ale jeszcze Windowsa mam do przeniesienia (coś koło 400GB danych)
gnysekgnysek (1:37, 7.01.23):
Tekst chyba nie, ale obrazki jak najbardziej. Tam jest taka gigantyczna struktura, którą w debuggerze najlepiej podejrzeć (albo do jsona wywalić na dysk), żeby znaleźć jak to zmienić.
AdriannAdriann (13:27, 6.01.23):
Da się zmieniać tekst i obrazki w sekwencjach za pomocą kodu?
gnysekgnysek (15:29, 4.01.23):
a ja przenoszę windowsa i ubuntu...
SutikkuSutikku (9:43, 3.01.23):
przenosiny na nowy sprzęt zawsze wiąże się dla mnie z bólem głowy, żeby odtworzyć milion customowych rzeczy które zrobiłem na wcześniejszym sprzęcie
gnysekgnysek (16:36, 2.01.23):
Na 2-3 dni muszę wstrzymać prace nad GMCLANem, bo przenoszę się na nowego laptopa
gnysekgnysek (17:48, 31.12.22):
@Adriann: myślałem tylko o ludziach z PL, @Sutikku pomyślę po weekendzie sylwestrowym
SutikkuSutikku (12:51, 30.12.22):
ja bym z chęcią pooglądał devlogi z przepisywania gmclanu, im just saying
AdriannAdriann (12:23, 30.12.22):
szczególnie jak będą nagrody
AdriannAdriann (12:22, 30.12.22):
A co myślisz żeby rozszerzyć temat i robić ją w formie game jamu na itch.io? Może dołączyliby nowi ludzie
gnysekgnysek (22:56, 29.12.22):
Tak, jest pomysł na np. 4x7 dni (1x na miesiąc) i nagrodę typu bon na steam za 100-200zł.
AdriannAdriann (21:37, 29.12.22):
Planujesz jakąś kontynuację ligi?
gnysekgnysek (15:09, 29.12.22):
W sumie zaczęte mam już 80%, nieruszone pozostały jedynie artykuły (czytanie, bo kategorie są) i liga.
gnysekgnysek (15:08, 29.12.22):
Dojechałem do przepisania 50% strony na nowy design i nowy kod. Niektóre moduły są teraz krótsze 0 80-90%, bo podobny kod przerobiłem na wspólne funkcje.
gnysekgnysek (14:05, 21.12.22):
To może kiedyś na jakimś dalszym etapie, na razie przepisuję obecne strony Wciąż są szanse na demo nowego designu jeszcze w tym roku.
SutikkuSutikku (12:40, 21.12.22):
to teraz jeszcze reakcje do shoutboxa, bo chciałem dać serduszko, a nie można
gnysekgnysek (13:29, 19.12.22):
No i aktualny GML (2023.1) jest dostępny. W końcu function i static jest kolorowane. Dodałem tez kopiowanie kodu
gnysekgnysek (9:10, 19.12.22):
GameMaker w folderze z runtime ma plik fnames i tam są definicje funkcji,stałych,wbudowanych zmiennych - trzeba to przeparsować i odpowiednio poprzydzielać. Ale brakuje if/else/break/try/while itp. i to trzeba ręcznie dodać. gist.github.com/.../a69ec324df61131b2546d1580f29a760
SutikkuSutikku (1:57, 17.12.22):
a z ciekawości, jak wygląda proces poprawienia kolorowania? Zaciągasz jakąś gotową paczkę, sam to jakoś definiujesz, w jakim formacie to jest zapisane?
gnysekgnysek (13:00, 16.12.22):
Teraz to chcę GMLa zaktualizować, bo nasze kolorowanie się na GM6-8 opiera
UzjelUzjel (12:17, 16.12.22):
Jeszcze zdjęcie profilowe na Twitterze zmień
gnysekgnysek (12:03, 16.12.22):
No i przerzuciłem mojego bota na GMCLANowy serwer, pod nowym adresem gms-updates.gmclan.org
gnysekgnysek (12:00, 16.12.22):
Dodałem LTS do listy aktualnych wersji GMa na głównej.
gnysekgnysek (23:22, 15.12.22):
Jeszcze nocki będziesz zarywał! Będę potrzebował testów i krytyki, to na pewno Ale to dopiero jak dojadę do czegoś bardziej podobnego do projektu z kanału dla patronów na Disco
UzjelUzjel (22:53, 15.12.22):
Gnysek jak coś potrzebujesz to przecież pisz :p
gnysekgnysek (16:55, 15.12.22):
Ja w sumie też. Myślę, że jeszcze tej zimy będzie, bo do świąt to już nie obiecam (ale przed sylwestrem może jakieś demo? )
AdriannAdriann (13:09, 15.12.22):
nie mogę się doczekać tego dark mode
gnysekgnysek (19:51, 14.12.22):
Tam jest błąd cache zapewne Nowy design sprawdzisz klikając na górze w "redakcja", ale to mocno wstępna wersja, bo Uzjel miał jeszcze kilka propozycji które będę wdrażał już robiąc całość.
SutikkuSutikku (15:14, 14.12.22):
Jak przejść na nowy design i podglądnąć?
ChellChell (11:27, 14.12.22):
aa, tam sa chyba po prostu zahardkodowane shouty
ChellChell (11:26, 14.12.22):
na nowym dizajnie nie laduje sie ostatni shout
gnysekgnysek (1:20, 9.12.22):
W sumie php8 to pikuś, testujemy też nowy design responsywny i z dark mode
SutikkuSutikku (10:03, 8.12.22):
odważny krok, puszczaj testy jednostkowe /s
gnysekgnysek (11:23, 7.12.22):
Zaktualizowałem PHP do 8.0, zgłaszajcie, gdyby coś nie działało
gnysekgnysek (10:57, 7.12.22):
2023.1
IgnatusIgnatus (8:58, 7.12.22):
Ciekawe o jaką wersję mogło chodzić
IgnatusIgnatus (8:58, 7.12.22):
No przynajmniej jakoś próbuje z tego wybrnąć XD zapodaj.net/images/2543c3a6eea62.png
IgnatusIgnatus (8:50, 7.12.22):
XD lol
gnysekgnysek (23:06, 6.12.22):
Nie ma takiej funkcji w GML, właśnie o to chodzi.
IgnatusIgnatus (20:36, 6.12.22):
Nie wiem o co chodzi więc wpisałem po prostu XD zapodaj.net/images/8bfcb19e4a9c5.png
gnysekgnysek (10:33, 6.12.22):
Zapytaj o shuffle na tablicy i zobaczysz, że różnie działa
IgnatusIgnatus (20:46, 5.12.22):
Jestem w szoku jak sprawnie to działa i że umie w GML XD
gnysekgnysek (16:09, 5.12.22):
już wiem, ChatGPT
gnysekgnysek (14:59, 5.12.22):
Co to za AI ?
SutikkuSutikku (7:52, 5.12.22):
bardzo dobra technika, ładne ślaczki wychodzą z pocisków, można się poczuć jak malarz
Ankieta
» Kiedy wyjdzie GameMaker (Studio) 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-2023. GMCLAN.ORG
Wszelkie prawa zastrzeżone. Kopiowanie materiałów bez zgody redakcji zabronione!
© 2002-2017 Ranmus, © 2017-2023 {=|=} fable_inside();

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