Alarmy - jak działają, jak unikać błędów

środa, 17 Czerwca 2009, 14:02
Czas czytania 3 minuty, 14 sekundy
Zgodne z GM: gm5 gm6 gm7 gm8 gms1 gms2
Kurs jak używać alarmów, wraz z opisem najczęściej popełnianych błędów.
Alarm to jeden z ważniejszych eventów (zdarzeń) w GM. Czym są alarmy? To tak naprawdę po prostu zmienne pomocnicze, które oznaczają dla nas upływający czas, dzięki czemu możemy wykonać jakiś kod co pewien przedział czasu.
Przykładowo, wystrzał ze strzelby - naboje nie mogą wyskakiwać bez przerwy, bo przecież chwilę trwa "przeładowanie". Zatem najlepiej aby wylatywały co np. sekundę, lub półtorej. Właśnie do tego przyda się alarm.

Jak działa alarm?

Alarm jak już wspomniałem to po prostu taka pomocnicza zmienna. Domyślnie, alarmów jest 12 (zmienne alarm[0] - alarm[11]). Wartość ustawiona w alarmie oznacza liczbę kroków (eventów step), za które nastąpi ich wywołanie ( w trakcie jednej sekundy event step jest wykonywany dokładnie tyle razy ile wynosi wartość room_speed danej planszy - domyślnie 30 eventów na sekundę, co równa się też 30 klatkom na sekundę obrazu). Gdy dochodzi do zera, wykonuje się kod eventu alarm, a on sam ustawiany jest na -1. Gdy równa się -1 nie jest już zmniejszany.

alarm[X] > 0 - w każdym kolejnym kroku alarm jest zmniejszany o 1 aż do zera
alarm[X] = 0 - następuje wywołanie zdarzenia / eventu AlarmX, alarm[X] ustawiamy na -1, przestajemy go zmniejszać
alarm[X] = -1 - nie dzieje się nic, alarm jest nieaktywny

Zatem, jeżeli chcemy aby jakieś zdarzenie następowało co sekundę, nalezy ustawić alarm[0] na room_speed, lub 30 (jeżeli tyle wynosi room_speed danej planszy).

Najczęściej popełniane błędy

Najczęściej popełniany błąd, to wywołanie alarmów w zdarzeniach (eventach) step, lub kolizji.
Przykładowo, jeżeli obj_bohater jest blisko obj_przeciwnik, to przeciwnik ma strzelać.
Pierwszy kod jaki przychodzi do głowy wygląda tak (kod dla obj_przeciwnik, event step - sprawdzany w każdym kroku):

kodif distance_to_object(obj_bohater)<100
{
alarm[0] = 10;
}

Oczywiście kod jest BŁĘDNY! Dlaczego? Zastanówmy się. Jak wcześniej powiedziałem, w każdym stepie alarm zmniejszany jest o 1 aż dojdzie do 0.
Wykonujemy pierwszy krok. Odejmujemy 1 i nasz alarm[0] = 9. Następnie sprawdzany jest kod podany w step. Bohater stoi nadal blisko przeciwnika, zatem warunek jest spełniony i alarm[0] ustawiamy na 10.
W kolejnym kroku alarm znów sam zmniejsza się o 1, ale my znów ustawiamy go na 10. W ten sposób zatrzymaliśmy alarm w miejscu! Zacznie odliczać się dopiero, gdy bohater odsunie się od przeciwnika - i dopiero wtedy przeciwnik zacznie strzelać. Tego przecież nie chcemy.
Jak wspomniałem, alarm jest nieaktywny gdy jest równy -1. Wykorzystajmy ten fakt do poprawienia naszego kodu. Można to zrobić w dowolny sposób, ja podam dwa.

kodif distance_to_object(obj_bohater)<100 and alarm[0] = -1
{
alarm[0] = 10;
}

kodif distance_to_object(obj_bohater)<100
{
if alarm[0] = -1 then alarm[0] = 10;
}

Oczywiście zakładam, że w zdarzeniu Alarm0 mamy kod tworzenia pocisku.

Mam nadzieję, że wyjaśniłem wystarczająco działanie alarmów.

Własny alarm

Na podstawie wiedzy którą masz, powinieneś być w stanie stworzyć nieskończenie wiele alarmów na własne potrzeby. Przykładowy kod własnego alarmu (w Create obiektu definiujemy zmienną moj_alarm = -1;), umieszczony w zdarzeniu Step.

kodif moj_alarm>0
{
moj_alarm -= 1;
}
else if moj_alarm = 0
{
moj_alarm = -1;
// kod do wykonania naszego alarmu, np. instance_create(x,y,obj_bullet);
}

Ustawienie zmiennej moj_alarm na większą od zera spowoduje wykonanie się kodu za podaną ilość kroków.

Tak właśnie działają alarmy - ale w przypadku wbudowanych zmiennych alarm[0] - alarm[11] powyższy kod Game Maker wykonuje za nas.
Komentarze (łącznie 20, wyświetlam 1 - 15):
baca (śro., 17 Cze. 09, 14:21)
#1

Początkującym może się przydać, a reszcie raczej nie

gnysek (śro., 17 Cze. 09, 14:22)
#2

Artykuły -> Game Maker -> Kursy dla początkujących - czy to Ci coś mówi ?

baca (śro., 17 Cze. 09, 14:47)
#3

Sory nie spojżałem na to

PoxiPol (śro., 17 Cze. 09, 21:18)
#4

Przyznam, ja w cholere pisalem alarmy wlasne na zmiennych. A teraz dopiero rozumiem po co sa. :/ Platyna ma racje, glupieje.

E
Egzekutor (śro., 17 Cze. 09, 21:27)
#5

Poxi wstydź się :P No fajny art. 9/10

Platyna (śro., 17 Cze. 09, 22:17)
#6

Takie małe sprostowanie: Nigdy nie powiedziałem, że on głupieje. Sam to sobie dopowiedział. Poza tym to było dawno i nieprawda :D

I takie skromne pytanko, bo mnie ciekawi w sumie. W którym momencie konkretnie jest wykonywane zmniejszenie wartości alarmu o 1? Przed wszystkimi zdarzeniami? A może po nich? :P
W sumie wiele to nie zmienia, ale czasem może.

Paqoo (śro., 17 Cze. 09, 23:31)
#7

Bardzo ciekawe - nie wiedziałem, że można robić własny alarm ;d

David Dark (Czw., 18 Cze. 09, 00:02)
#8

Tez nie wiedzialem :D Bede musial na to spojrzec :)

b
borubarartur (Czw., 18 Cze. 09, 09:07)
#9

ja też zwykle nie łapałem alarmów choć widziałem że powtarzają się w wielu przykładach.zastępowałem je, jak tu już zostało powiedziane-własnymi alarmami, bo tak naprawdę to alarmy są dla użytkowników GM'a mniej zaawansowanych w GML'u.
to jest tak samo jak z klockami, na początku używasz ich jednak gdy znasz ich odpowiednika w GML'u-zastępujesz go nim, choć przyznam że używanie alarmów napewno jest bardziej wygodne niż pisanie własnego alarmu w skrypcie.co do pytania Platyny o to kiedy wykonywane jest zmniejszenie alarmu- mi osobiście sie wydaje że po wszystkich akcjach choć i przed wszystkimi akcjami wiele nie zmienia.a artykuł naprawdę dobry bo dopiero po nim zrozumiałem jak to ustrojstwo działa

Ghost (Czw., 18 Cze. 09, 13:59)
#10

Własny alarm... Ja wiedziałem, nawet sam na to wpadłem ;p

Platyna (Czw., 18 Cze. 09, 16:59)
#11

A no co tu było wpadać? Toż alarmy są tak oczywiste że nie mogę :P

gnysek (Czw., 18 Cze. 09, 21:08)
#12

Jak wiesz jak działają, to wiesz, jak zrobić je samemu xD

PoxiPol (Czw., 18 Cze. 09, 22:18)
#13

lol, ja wiedzialem jak je zrobic samemu, ale nie wiedzialem jak dzialaja. Woop woop.

geralt100 (Nie., 21 Cze. 09, 21:23)
#14

ja nie łapałem alarmów szczeże mówiąc

Roki (Pon., 22 Cze. 09, 09:45)
#15

A ja załapałem alarmy od razu, ale nie myślałem o własnych.

Najnowsze wersje GameMakera:

Stabilna
2023.11.1.129 • 2023.11.1.160
wydana 69 dni temu
LTS
2022.0.2.51 • 2022.0.2.49
wydana 128 dni temu
Beta
2024.200.0.499 • 2024.200.0.516
wydana  wczoraj
= IDE, = Runtime
Użytkownicy online
3 użytkowników aktywnych:
gości: 1, userów: 2
 pk100,  Adriann
(~ostatnie 15 minut)
Discord
44 użytkownicy online na discordzie:
LadyLush❄, 🧁Cupcake🧁, DungeonFairy🧚, MKP, s..., Alice, Nitro Slav, Carl-bot, Voytec, Wielki Druid, Add92, Kowu, Kuzyn, YoungKrystian, Radek Ignatów, PhysX ᴺⱽᴵᴰᴵᴬ, r..., lethian, HappyOrange, Moldis, Arrekin, MagnusArias, LeD, yazaa, Domeen0, Dyno, Deusald, Korodzik, 𝕳𝖚𝖌𝖔 𝕲𝖔𝖓𝖝𝖆𝖑𝖊𝖝, blackamul, Marco, m..., bagno, Tidżi, Mtax, g..., Alkapivo, moeglich, Nikas, Krzysiek1250, Shockah, Kandif, Cosplyfanka, xVANiLL
Shoutbox
gnysek (10:49, 20.02.24)
Ja czekam na pluginy do IDE, czego YYG nie zrobi, zrobimy sami.
Adriann (11:50, 16.02.24)
Ciekawe jak go przerobią, osobiście liczę na jakąś większą rewolucję a nie tylko usprawnienie bo narazie jest jak jest :d
gnysek (10:32, 08.02.24)
Edytor roomów ma swoje minusy. Ale ma być tworzony nowy wkrótce, chociaż pewnie 6-12 miesięcy zanim trafi do wersji stabilnej jak nic.
p
pablo1517 (08:40, 07.02.24)
No ja odkąd zacząłem w ue4 pracować to niestety z GMLem dawno nie obcowalem
exp (20:13, 30.01.24)
@pablo1517 ja przerzuciłem się z klasycznego GM na Studio cztery lata temu, więc przeskok trochę mniejszy, ale generalnie idea dużo się nie zmieniła. jest trochę upierdliwości i niepotrzebnych według mnie zmian, ale też duże usprawnienia (edytor roomów to raj na ziemi w porównaniu z tym oryginalnym)
Adriann (18:59, 28.01.24)
Takk..strasznie są upierdliwe :D
I am Lord (17:08, 28.01.24)
Mniej czasu się straci tworząc system particli z kodu od zera niż się męczyć z importem ich z edytora, 🤦‍♂️🤦‍♂️
I am Lord (16:56, 28.01.24)
Co jest nie tak z tymi particlami z IDE, masakra jakaś. Ile to trzeba kombinować żeby użyć je prosto z kodu
p
pablo1517 (17:57, 27.01.24)
Czyli GML nie dostał jakiś drastycznych zmian?
gnysek (14:47, 26.01.24)
Czy ja wiem... generalnie zamysł ten sam, tylko IDE nieco inne.
Starsze wpisy znajdziesz w Archiwum.
Ankieta
Ile zarobiłeś do tej pory na grach stworzonych w GM?