Najczęściej popełniane błędy

Niekończący się warunek.

Pierwszym najczęściej popełnianym błędem jaki od razu przychodzi mi na myśl, jest ustawianie alarmów. Załóżmy, że w zdarzeniu Step wpiszemy taki kod:

if score > 200 then alarm[0] = 2 * room_speed;

Na pierwszy rzut oka kod wydaje się ok – jeżeli mamy ponad 200 punktów, ustawiamy alarm na 2 sekundy. Zwróćmy jednak uwagę na to, że nasz kod wykonuje się jako Step – a więc bez przerwy, a jeżeli mamy ponad 200 punktów (czyli także 201, 202, 500 czy 1000), to warunek jest zawsze prawdziwy. Oznacza to, że kod wykonuje się bez przerwy, czego rezultatem jest to, że alarm[0] zawsze wynosi 2*room_speed i nigdy nie zaczyna się odliczać (bo zanim zacznie się odliczać, znów ustawiono go na najwyższą wartość). Da się to jednak prosto obejść:

if score > 200 and alarm[0] > -1 then alarm[0] = 2 * room_speed;

Teraz alarm wykona się tylko w jednym przypadku: gdy nasz wynik wynosi co najmniej 200 punktów, oraz alarm[0] posiada wartość -1. Dlaczego -1? Alarmy działają tak, że jeżeli są większe od 0, odejmowane jest od nich 1 tyle razy na sekundę ile wynosi room_speed. Gdy są równe 0, wykonywane jest ich zdarzenie (np. Alarm0). Ale gdyby nadal pozostały z wartością 0, to kolejny raz mielibyśmy niekończący się warunek, dla tego są ustawiane na -1. Ponieważ alarm maleje tylko gdy jest większy od 0, to mając wartość -1 nic się nie zmienia. Warto zapamiętać ten sposób, ponieważ przy tworzeniu gry -1 może nam posłużyć wiele razy za informację, że dana wartość jest nieustawiona – zazwyczaj wszystko osiąga dodanie wartości.

Jest jednak i jedna wada tego zapisu – gdy alarm dojdzie już do naszego upragnionego 0 i osiąga wartość -1, warunek znów jest prawdziwy. Wtedy trzeba by dodać dodatkową zmienną, która pozwala na wykonanie alarmu tylko raz, ale wtedy warunek alarm[0]>-1 przestaje mieć z kolei rację bytu. Natomiast powyższy przykład przydaje się często gdy tworzymy w grze bronie, aby naboje wypadały z lufy co określoną ilość czasu (np. z karabinu jest to co kilka dziesiątych sekundy, z pistoletu co sekundę, a z shotguna nawet co kilka).

Kolejnym częstym błędem, bardzo podobnym do tego wyżej jest:

if distance_to_object( baza_wroga ) < 100 then instance_create( x , y , przeciwnik );

Również tym razem wszystko wydaje się proste. Gdy zbliżamy się do bazy wroga, tworzony jest nowy przeciwnik. Jednak analizując przykład widać, że tak długo jak stoimy blisko bazy wroga, tworzeni są nowi przeciwnicy, a gdy damy kod w Step – otrzymujemy ich kilkudziesięciu na sekundę, przez co po kilku minutach gra zawiesi się od nadmiaru obiektów. Również tutaj warto dodać jakiś dodatkowy warunek, ograniczający tworzenie się tych obiektów. Załóżmy, że tworzymy jednego przeciwnika na 2 sekundy, pod warunkiem, że jest ich nie więcej niż pięciu. Wtedy nasz kod wygląda tak:

//Create
czy_moge = true;

//step
if distance_to_object( baza_wroga ) < 100 and czy_moge = true then
{
instance_create( x , y , przeciwnik );
alarm[0] = 2 * room_speed;
czy_moge = false;
}


//alarm0
czy_moge = true;

Można jednak zrobić to też dużo szybciej:
//Create
alarm[0]=1;

//alarm0
if distance_to_object( baza_wroga ) < 100 and instance_number( przeciwnik ) > 5 then instance_create( x , y , przeciwnik );
alarm[0] = 2 * room_speed;

Warto zwrócić tutaj uwagę, że czasem inne spojrzenie na ten sam problem oszczędza sporo kodu, chociaż rezultat jest ten sam.

Dodaj komentarz