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
Akademia GMCLANu
Menu
Panel użytkownika
Jesteś niezalogowany!

Nie masz konta? Zarejestruj się
Kategorie bazy artykułów
Artykuły -> AKADEMIA: Game Maker Studio 2 -> Łatwy
Lekcja w akademii
×
Stałe i enumeratory (constants, macros, enums)
autor: gnysek (27.07.21), czas czytania: 3 minuty, 55 sekund
Pokaż na pełym ekranie× Zamknij pełny ekran
GameMaker jeszcze w zamierzchłych czasach wprowadził zmienne zwane stałymi. Na pewnym jednak etapie YoYoGames postanowiło zmienić im nazwę na macros (makra), głównie z powodu ich faktycznego działania.

Makra (constants, macros)
W przeciwieństwie do prawdziwych stałych, które są w innych językach programowania i są dostępne jako identyfikatory z wartością w czasie działania, makra działają podobnie do chociażby dyrektywy #define z C/C++ i są jedynie definicją stworzoną przez programistę, informującą kompilator, które miejsce kodu należy zwyczajnie zastąpić podaną przez nas wartością.

Po usunięciu dedykowanego okienka znanego z GM i GMS 1.x, stałe definiuje się obecnie w dowolnym miejscu kodu, za pomocą prefiksu #macro, następnie nazwy i wartości, np.:
GML#macro nazwa_makra 15
Potem wystarczy użyć identyfikatora nazwa_macra w dowolnym miejscu kodu, a w momencie kompilacji zostanie ona podmieniona na wybraną przez nas wartość, np.:

GML#macro szerokosc_etapu 2000
if (x > szerokosc_etapu) {
...
Warto dodać, że po definicji makra nie dajemy średnika, gdyż wszystko co znajduje się po pierwszej spacji za jego nazwą, zostanie podmienione i mogłoby powodować błędy składni. Powyższy fragment jeszcze przed odpaleniem gry, w trakcie kompilowania zmieniony zostanie na:
GMLif (x > 2000) {
...
a w samej grze po naszej definicji nie zostanie ślad. Działa to więc trochę tak, jakby edytor za nas wykonywał funkcję "Znajdź i zamień" za każdym razem, gdy testujemy/kompilujemy grę.

Makra można oczywiście wykorzystać w bardziej kreatywny sposób, nie tylko podając wartości tekstowe/liczbowe ale np. nazwę zasobu czy nawet cały fragment kodu:
GML#macro pink make_color_rgb(255,192,203)
...
draw_set_color(pink);
// powyższy kod w momencie kompilacji da nam:
// draw_set_color(make_color_rgb(255,192,203));
Wskazówka:
Przez to, że GMS nie wykona funkcji w momencie kompilowania zwracając wartość, a robi jedynie znajdź i zamień, warto w przypadku kolorów podawać gotowe wartości HEX (w odwróconej kolejności BBGGRR), np. kolor różowy #FFC0CB w GMS zapiszemy jako $CBC0FF - znak $ oznacza liczby szesnastkowe)

Nic nie stoi też na przeszkodzie, aby napisać:
GML#macro jest_daleko if (x > 20 && zmienna = true)
...
jest_daleko {
// nasz kod
}

W ten sposób można też nadpisać oryginalne funkcje GMowe:
GML#macro show_debug_message moja_funkcja
show_debug_message(value);
Ponieważ wszystko działa na zasadzie "znajdź i zamień", aby nadal móc wykorzystać oryginalną funkcję, wystarczy zdefiniować ją jako kolejne makro linijkę niżej (ważne, aby nie linijkę przed, bo wtedy nasza definicja zastąpi tę sprzed chwili):
GML#macro show_debug_message moja_funkcja
#macro stare_sdb show_debug_message// teraz wszystkie wywołania stare_sdb staną się show_debug_message
Pamiętajmy jednak, że funkcje tak nadpisane muszą mieć tę samą liczbę argumentów, gdyż GM sprawdzi poprawność przed zastąpieniem makra i będzie się burzył :)

Wielolinijkowe makra zapisujemy natomiast tak:
GML#macro hello show_debug_message("Hej " + \
string(player_name) + \
", jak się masz?");

Można też używać makro dla różnych konfiguracji (Configs - manual.yoyogames.com/.../Configurations.htm ):
GML#macro rozmiar_ekranu 1920
#macro KonfiguracjaAndroid:rozmiar_ekranu 1270

Enumeratory (enum)
Na podobnej zasadzie działają enumeratory. One także zostają zastąpione w momencie kompilacji gry, ale mogą być tylko typu integer. Zaletą jest jednak fakt, że edytor podpowiada ich składnię i wartości, więc są przydatne do definiowania typów przedmiotów, czy flag/stanów jakiegoś zdarzenia (np. czy bohater biegnie czy idzie, albo jakiego typu jest przeciwnik).
Wskazówka:
wartości liczbowe enum nie są tak naprawdę typem real, a int64, w związku z tym funkcja is_real() zwraca dla nich false. Warto używać zamiast tego funkcji is_numeric()
Domyślnie enumeratory, jeśli nie nadano im wartości, są numerowane od 0 do n (0, 1, 2, 3...).
GMLenum moj_enum {
czerwony,
zielony,
niebieski,
czarny
}

show_debug_message(moj_enum.czarny); // zwroci 3
// w momencie kompilacji gry tak naprawdę powyższa linijka zmieni się na:
// show_debug_message(3)

Enumeratory nie muszą być jednak numerowane kolejno i tak długo, jak zachowamy warunek, że ich wartości są liczbowe, można nawet używać zdefiniowanych wcześniej (ale nie później) enumeratorów do ustawiania wartości, włącznie z prostymi działaniami:
GML
enum domki {
parterowy = 250,
pietrowy = domki.parterowy * 2,
wiezowiec = $F + 5,
empire_state_pietra = 102,
drapacz_chmur = domki.parterowy * domki.empire_state_pietra
}

show_debug_message(domki.drapacz_chmur); // zwraca 25500
// w momencie kompilacji powyższa linijka zmieni się na:
// show_debug_message(25550);
Komentarze
Dodaj komentarz:
Treść:

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.10064 sekund ] [ Liczba zapytań MySQL: 9 ]