Seans spirytystyczny - wywoływanie duchów na Atari XL/XE (2)
Syzygy #3
W poprzednim odcinku udało się nam zmaterializować na ekranie duszki. Możemy je też dowolnie przemieszczać.
Osiągnięty efekt jest niewątpliwie ciekawy wizualnie, lecz zupełnie nieprzydatny. Zanim napiszemy wspaniałą, niewątpliwie grę, musimy się nauczyć wykrywać kolizje pomiędzy graczami i polem gry. Przy wykorzystaniu grafiki graczy i pocisków jest to wyjątkowo proste. Istnieje cały szereg rejestrów sygnalizujących wystąpienie kolizji. Każdy duszek posiada dwa takie rejestry. W jednym przechowywane są informacje o wystąpieniu zderzeń z polem gry, a w drugim o kolizjach z innymi graczami. Identyczne rejestry posiadają pociski, jednak chwilowo nie będą nam one potrzebne. Wszystkie te rejestry mogą być tylko odczytywane. Wykorzystane są w nich bity 0-3, pozostałe są zawsze nieustawione (równe zero).
Rejestry KOLPnPF (n - numer duszka) sygnalizują zderzenie duszka z polem gry. Oto ich adresy:
KOLP0PF (53252 - $D004) kolizje duszka nr 0 z polem
gry KOLP1PF (53253 - $D005) kolizje duszka nr 1
z polem gry KOLP2PF (53254 - $D006) kolizje duszka
nr 2 z polem gry KOLP3PF (53255 - $D007)
kolizje duszka nr 3 z polem gry
Ustawienie bitu 0-3 w tych rejestrach oznacza zderzenie gracza z polem gry o kolorze z rejestru odpowiadającemu numerowi ustawionego bitu, np. ustawienie bitu nr 1 wskazuje zderzenie gracza z polem gry o kolorze z rejestru COLPF1. By łatwiej zrozumieć, o jaki kolor chodzi, wystarczy wiedzieć, że zawartość rejestrów COLPF0 do COLPF3 jest ustalana za pomocą instrukcji Basica SETCOLOR 0 do 3.
Rejestry KOLPnP (n - numer duszka) sygnalizują zderzenie duszka z innymi duszkami. Ich adresy:
KOLP0P (53260 - $D00C) kolizje duszka nr 0 z innymi
duszkami KOLP1P (53261 - $D00D) kolizje duszka nr 1
z innymi duszkami KOLP2P (53262 - $D00E) kolizje
duszka nr 2 z innymi duszkami KOLP3P (53263 -
$D00F) kolizje duszka nr 3 z innymi duszkami
Ustawienie bitu 0-3 tych rejestrów sygnalizuje kolizję duszka z innym duszkiem, o numerze odpowiadającym numerowi ustawionego bitu, np. ustawienie bitu nr 1 sygnalizuje kolizję z duszkiem nr 1 oczywiście.
Wykrywanie kolizji polega na okresowym sprawdzaniu zawartości podanych rejestrów. Ustawiony bit nie jest kasowany nawet wtedy, gdy obiekty już się nie stykają. Rejestry można skasować (wszystkie jednocześnie) przez wpisanie dowolnej wartości do rejestru HITCLR (53278 - $D01E).
Terminologia dla nieco zdezorientowanych:
Rejestr
Komórka pamięci o określonym adresie, przechowująca dane dla
prawidłowej pracy systemu operacyjnego lub każdego innego programu.
Pole gry
Punkty na planszy, mające inny kolor, niż tło.
Bit ustawiony to 1, skasowany - 0. Wyliczanie zawartości rejestru
w zależności od ustawienia bitów:
numer bitu:
3
2
1
0
wartość bitu:
8
4
2
1
czyli zawartość rejestru, odczytana np. instrukcją PEEK, równa 2 oznacza, że ustawiony jest bit nr 1. Zawartość rejestru równa 3 oznacza, że ustawione są dwa bity, nr 0 i nr 1, ich wartości się sumują.
Wszystkie wiadomości o ustawionych bitach, numerach kolorów, czy duszków są dla tych bardziej zorientowanych (i ambitnych). Najczęściej wystarczy sprawdzać rejestry, czy nie zmieniły wartości z zerowej na jakąkolwiek inną, co już sygnalizuje kolizję.
PRIORYTETY
Podczas przesuwania się duszków na ekranie, należy określić, który z nich będzie widoczny w momencie spotkania. Dotyczy to też spotkań duszków z polem gry, narysowanym kolorami 0-3. Jest to tzw. priorytet wyświetlania duszków. Jest on kontrolowany przez zmianę zawartości rejestru GTIACTLS (623 - $026F).
kolejność wyświetlania
rejestru zawartość
duszki 0-3, kolor 0-3, tło
1
duszki 0-1, kolor 0-3, duszki 2-3, tło
2
kolor 0-3, duszki 0-3, tło
4
kolor 0-1, duszki 0-3, kolor 2-3, tło
8
Inne wartości rejestru spowodują nieprzewidywalne ustawienie priorytetu. Rejestr GTIACTLS może przyjmować wartości różne od podanych wyżej, nas będzie interesować jedynie zwiększenie go o 32. Wtedy przy spotkaniu duszków 0 i 1 lub 2 i 3 ich kolory będą się nakładać. Taka para przemieszczana razem da efekt duszka trójkolorowego.