Ten artykuł został stworzony dla starszych wersji GameMakera i może nie być aktualny.

O błędach i ich przyczynach

Niedziela, 28 Grudnia 2008, 19:29
Czas czytania 7 minut, 6 sekund
Zgodne z GM: gm5 gm6 gm7 gm8 gms1
Krótki, lecz w miarę wyczerpujący artykuł o błędach w Game Makerze oraz ich przyczynach.
Podczas pracy z Game Makerem, możemy natrafić na różnego rodzaju błędy. Niektóre możemy zignorować podczas wyświetlenia - jednak niektóre wymuszają wyłączenie gry. W tym artykule postaram się opisać wyskakujące błędy, ich przyczynę oraz jak je naprawiać.

Error Messages
W większości przypadków, okno z informacją o błędzie wskaże nam miejsce gdzie takowy wystąpił - przez co nie powinniśmy mieć problemów z wyszukaniem problemu.

Grafika: upload/gm/obledachiichprzyczynach_1.png

1 - Numer akcji, w której wystąpił błąd ( "1" to ta na samej górze eventu ).
2 - Event ( wydarzenie ), w jakim wystąpił błąd. W tym wypadku jest to step.
3 - Informacja, w jakim obiekcie wystąpił błąd ( w tym wypadku object0 ).
4 - Linia w jakiej wykryto błąd. W tym wypadku jest to pierwsza linia kodu. Używając wbudowanego edytora, można bez problemu "skoczyć" do szukanej linii używając "Go to a particular line".
5 - Część kodu, w którym wykryto błąd.
6 - Opis błędu. W tym wypadku nieznana zmienna.
7 - Przerywamy działanie gry.
8 - Ignorujemy napotkany błąd - nie zawsze jest to jednak skuteczne.
9 - Kopiujemy cały raport do schowka.
10 - Czyścimy okno błędu.

Rodzaje Błędów
Każdemu, nawet najlepszemu mistrzowi nie raz wyskoczą różnego rodzaju błędy. W większości będą to problemy łatwe do naprawienia, drobne przeoczenia. Zdąża się też jednak i takie, nad którymi będziemy siedzieć i głowić się jak go rozwiązać.

Błąd: Unknown variable <nazwa>.
Tłumaczenie: Nieznana zmienna <nazwa>.
Opis: Musimy pamiętać, że przed jakąkolwiek operacją z użyciem zmiennej, musimy ją uprzednio zadeklarować. Zazwyczaj robimy to w create, lecz nie jest to konieczne. Zasada jest taka, że przed użyciem zmiennej musimy ją zadeklarować, nadać jakąś początkową wartość. Robimy to w taki sposób: nazwa = dowolna_wartość. Innym rozwiązaniem problemu jest zaznaczenie w ustawieniach Game Makera opcji "Treat uninitialized variables as value 0". Znajdziemy ją w Global Game Settings > Errors.
Możliwość zignorowania: Istnieje. Ale w tym wypadku ignorowanie błędu jest bez sensu - gdyż błąd będzie się wyświetlał tak długo, dopóki zmienna nie zostanie wykryta. Może to nastąpić po jakimś czasie, gdy mamy ustawiony np. alarm, gdzie została zadeklarowana zmienna.

Błąd: Division by 0.
Tłumaczenie: Dzielenie przez zero.
Opis: W jakieś operacji matematycznej, chcemy podzielić dowolną liczbę przez zero. W programowaniu nie jest to dopuszczalne. Pozostaje nam tylko zmiana dzielnika liczby.
Możliwość zignorowania: Nie istnieje.

Błąd: Unknown variable "nazwa" or array index out of bounds.
Tłumaczenie: Nieznana zmienna "nazwa", lub indeks tablicy poza jej granicami.
Opis: Tworząc tablice, ustalamy również jej granice. Możemy ją powiększać, dopisując kolejne wartości, ale nie możemy bezpośrednio odwoływać się do indeksu poza jej granicami. Przykładowo : Tablica o nazwie "array" ma rozmiar 8, więc nie możemy odwołać się do indeksu 9 : zmienna = array[9]. - przed wykonaniem tej operacji musi być dopisana tam jakaś wartość np. array[9] = 5. Aby powiększyć tablicę.
Możliwość zignorowania: Istnieje. Po zignorowaniu, Game Maker nie wykona po prostu obliczeń.

Błąd: Negative array index.
Tłumaczenie: Negatywny indeks tablicy.
Opis: Tablica nie może mieć ujemnego indeksu - przeszukaj kod. Często zdarza się w przypadku, gdy jakaś zmienna posiada wartość ujemną, a my próbujemy za jej pomocą odwołać się do jakiegoś indeksu tablicy ( tablica[zmienna] ).
Możliwość zignorowania: Istnieje. Po zignorowaniu, Game Maker nie wykona obliczeń.

Błąd: Error defining an external function.
Tłumaczenie: Błąd w definiowaniu zewnętrznej funkcji.
Opis: Błąd ten głownie występuje, gdy korzystamy z funkcji biblioteki dll, a nie umieściliśmy jej w tym samym folderze co gra. Większość bibliotek posiada również tzw. Funkcję inicjalizującą, którą musi być wykonana przed używaniem reszty funkcji. Możliwe, że o niej zapomniałeś. Błąd może występować również w innych wypadkach - ale jak nie jesteśmy twórcą danego dll'a nic więcej nie możemy zrobić.
Możliwość zignorowania: Istnieje. Tak jak w wypadku "Unknown variable <nazwa>", Game Maker nie będzie dawał nam spokoju póki problem nie będzie rozwiązany. Krótko mówiąc "Ignore" nic nam nie da.

Błąd: Wrong number of arguments to function or script.
Tłumaczenie: Zła liczba argumentów w funkcji bądź skrypcie.
Opis: Do większości funkcji możemy wpisać tylko określoną liczbę argumentów, niezbędną do wykonania obliczeń. Jeśli jest ona nieprawidłowa - zostaniemy o tym poinformowani.
Możliwość zignorowania: Nie istnieje.

Błąd: Cannot compare arguments.
Tłumaczenie: Nie można porównać argumentów.
Opis: Pamiętajmy, że porównywać można ze sobą zmienne tylko tego samego typu. W GML istnieją dwa typy : real ( liczby rzeczywiste ) oraz string ( ciąg znaków ), jeśli zmienna "a" będzie liczbą, a zmienna "b" ciągiem znaków, kod: if a == b { game_end(); } będzie nieprawidłowy.
Możliwość zignorowania: Nie istnieje.

Błąd: Unexpected symbol in expression.
Tłumaczenie: Niepożądany symbol w wyrażeniu.
Opis: Przyczyną ich występowania może być pomyłka bądź też niewystarczająca wiedza GML. Możliwości jest bardzo wiele więc nie będę ich wszystkich wymieniał. Unikniemy ich - jeśli dobrze poznamy składnie oraz zasady panujące w tym języku. Symbole takie jak !, ^, ^^, & itd. Używamy w konkretnych sytuacjach - nie możemy natomiast stawiać ich wszędzie gdzie nam się podoba. Odsyłam do kursów GML.
Możliwość zignorowania: Nie istnieje.

Błąd: Wrong type of arguments to <symbol>.
Tłumaczenie: Złe typy argumentów dla <symbolu>.
Opis: Przy operacjach takich dodawanie (+), odejmowanie ( - ), dzielenie (/), mnożenie ( * ), dzielenie całkowite ( div ) oraz reszta z dzielenia (mod ) - używać możemy tylko liczb rzeczywistych ( tzn. po lewej i po prawej stronie tego symbolu muszą znaleźć się zmienne typu real. Oprócz tego znakiem "+" możemy łączyć ciągi znaków.
Możliwość zignorowania: Nie istnieje.

Błąd: Symbol <symbol> expected.
Tłumaczenie: Wymagany symbol <symbol>.
Opis: Pojawia się, kiedy zapomnieliśmy dopisać jakiegoś znaku np. zamknąć nawiasu podczas pisania funkcji, Zamknąć blok klamrą.
Możliwość zignorowania: Nie istnieje.

Może też się zdarzyć, że twój kod będzie poprawnie napisany - a gra będzie się ciągle wyłączać. Powodem tego mogą być zbyt obciążające obliczenia bądź funkcje, z którymi Game Maker nie może sobie poradzić. Przykładem może być funkcja draw_getpixel(), którą należy stosować z umiarem.

Kontrola nad błędami
Istnieje kilka opcji, które mogą pomóc nam w kontrolowaniu błędów. Znajdziemy je wchodząc do "Global Game Settings" w zakładce "Errors".

Grafika: upload/gm/obledachiichprzyczynach_2.png

1 - Jeśli to odznaczymy, nie będą wyświetlane okienka z błędami. Jeśli błąd nie może być zignorowany - gra zostaje wyłączona.
2 - Po zaznaczeniu, każdy błąd zostanie zapisany do pliku game_errors.log.
3 - Po wystąpieniu jakiegokolwiek błędu , Game Maker przerywa działanie gry.
4 - Wszystkim nieznanym zmiennym, które wystąpiły w kodzie - zostaje przypisana wartość 0 ( patrz tabelka - Unknown variable "nazwa" ).

Wersja PDF
Komentarze (łącznie 29, wyświetlam 16 - 30):
Dawidds (Sob., 17 Kwi. 10, 14:08)
#16

!akcja = 'lot'?

Chyba akcja != 'lot', bo porównujesz reala do stringa w tym momencie.

mentos_96 (Nie., 18 Kwi. 10, 10:33)
#17

aha... dzięki działa

mentos_96 (Nie., 25 Kwi. 10, 17:05)
#18

ERROR in
action number 1
of Step Event
for object o_klatwa:

Error in code at line 1:
if point_distance(x-13,y-1,o_gracz.x,o_gracz.y) and kakao=false;
^
at position 64: Statement expected.


---> a tu ???

Assassin (Nie., 25 Kwi. 10, 18:47)
#19

po co ten srednik ?
po warunkach powinno sie cos dziac, a nie srednik
POZDRO

mentos_96 (Pon., 26 Kwi. 10, 17:13)
#20

aaaha... ja z automatu na koncu linijki srednik postawilem.. sory za problem

P
PsichiX (Wto., 27 Kwi. 10, 12:55)
#21

zeby tylko srednik - and tez wywal albo then wstaw chociaz

Misiek999 (Wto., 27 Kwi. 10, 15:17)
#22

yyy, a czemu tak nie może być ? ;p sprawdza czy kakao false jest.

Assassin (Wto., 27 Kwi. 10, 16:28)
#23

YXE miał na myśli, że kakao=false to skutek, a nie przyczyna, dlatego powiedział: wywalić and (a opcjonalnie dać then) :P .

mentos_96 (Wto., 27 Kwi. 10, 17:57)
#24

nie, nie kakao to warunek. wywalenie srednika pomogło

Ignifil (Nie., 01 Sie. 10, 14:24)
#25

Czemu jak mam w create name = Andrzej to mi wyskakuje taki błąd?:

ERROR in
action number 1
of Create Event
for object object0:

Error in code at line 1:
name = Andrzej

at position 8: Unknown variable Andrzej

P
PsichiX (Nie., 01 Sie. 10, 14:54)
#26

name = "Andrzej";
string wymaga cudzysłowia

wikku9 (Nie., 01 Sie. 10, 14:54)
#27

musisz Andrzej dać w cudzysłowiu.

Ignifil (Nie., 01 Sie. 10, 16:00)
#28

okej dzięki ;)

TheMarcQ (śro., 04 Sie. 10, 19:32)
#29

" Unknown variable Andrzej"
jak nie znasz angielskiego to odsyłam do
translate.google.pl

Najnowsze wersje GameMakera:

Stabilna
2024.13.1.193 • 2024.13.1.242
wydana 47 dni temu
LTS
2022.0.3.85 • 2022.0.3.99
wydana 182 dni temu
Beta
2024.1400.0.815 •
2024.1400.0.815
 0.17.0

wydana  5 dni temu
= IDE, = Runtime, = GMRT
Użytkownicy online
1 użytkownik aktywny:
gości: 1,
(~ostatnie 15 minut)
Discord
45 użytkowników online na discordzie:
Nikas, LeD, Carl-bot, Art22pl, p..., 🧁Cupcake🧁, GibkiKaktus, Grela, Wielki Druid, Draczeq, Kuzyn, GMRussell, Gameduro, OdrzuconyKrakers, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, r..., Threef, Uzjel, Chell, HappyOrange, Moldis, Arrekin, yazaa, Dyno, LadyLush, 🆅🅸🆃🅾74🅼, szmalu, Korodzik, Marco, Danieo, antek, Tidżi, Mtax, 21Lancz, Sporek, l..., Cebul, s..., 42traviss, Krzysiek1250, h..., Shockah, Nero, exigo, m...
Shoutbox
gnysek (13:44, 10.04.25)
Za 3-4 miesiące GM przejdzie na wydania "półroczne", więc korzystanie z wersji beta żeby sprawdzić nowości będzie wskazane :P
Adriann (18:09, 08.04.25)
Odpowiadam, dzisiaj :D
Adriann (20:48, 04.04.25)
A kiedy te UI layery mają wejść do normalnej wersji gma?
gnysek (00:38, 11.03.25)
I jak, zobaczyłeś ? :D Trochę im zjechało na publiczny release, ale były już w ostatnich dniach lutego dostępne jak się wie, jak pobrać kandydatów do bety :P
Kuzyn (21:30, 05.03.25)
uwierzę jak zobaczę :P
gnysek (10:35, 18.02.25)
W ciągu 10 dni mają wyjść w końcu Layery UI :D
Wojo (10:25, 27.12.24)
Jak tworzyłeś* ah ta niecną autokorekta (kiedyś też stworzyłem apki na androida w sumie)
Wojo (10:23, 27.12.24)
O siemka baca, czasami myślę o tobie w kontekście tego jak tworzyłem apki na androida. Swoją drogą czasami zapominam, że forum istnieje bo cały ruch teraz utrzymuje się na discordzie, ale pora to zmienić!
Uzjel (20:17, 10.12.24)
Cały ruch przeniósł się na Discorda.
MagnusArias (17:43, 01.12.24)
O matko... a ja tutaj jestem od ponad 15 lat i czasami zaglądam... biernie bo biernie, ale czasem wpadnę
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?