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

Dodany: 19 stycznia, 2011 | Kategoria: Game Maker

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ę, należy 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):

1
2
3
4
if 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.

1
2
3
4
if distance_to_object(obj_bohater)<100 and alarm[0] = -1
{
alarm[0] = 10;
}
1
2
3
4
if 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.

1
2
3
4
5
6
7
8
9
if 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.

Tagi: , , , , , , , Brak komentarzy »