Player/Missile Graphics
From Atariki
Spis treści |
Charakterystyka
Player and Missile Graphics - "grafika graczy i pocisków". Właściwość układu GTIA polegająca na nakładaniu na ekran obiektów niezależnych od zwykłej zawartości ("tła" oraz "ramek"). Generowane w ten sposób ruchome obiekty znane są na innych platformach sprzętowych pod nazwą "duszków" (ang. sprites).
W 8-bitowych komputerach Atari możliwe jest uzyskanie czterech niezależnych graczy i czterech pocisków (lub pięciu graczy - piątego uzyskujemy przez połączenie czterech pocisków).
Kształt
Każdy gracz ma szerokość 8 pikseli. Ich kształty definiuje się w osobnych obszarach określonych przez zawartość PMBASE ($D407). Każdemu bitowi w bajcie odpowiada jeden piksel gracza.
Kolejne bajty definiowane w obszarze dowolnego gracza:
0 7 - piksel n ........ ..oooo.. .o....o. o.o..o.o o......o o.oooo.o .o....o. ..oooo.. n+8 ........ : 7 0 - bit bajt
Szerokość pocisku wynosi 2 piksele. Ponieważ wszystkich dostępnych pocisków jest dokładnie 4, to definiuje się je razem poprzez wypełnienie odpowiednich par bitów w obszarze pocisków określanym również przez zawartość PMBASE ($D407):
Kolejne bajty definiowane w obszarze pocisków:
3 2 1 0 - pocisk : : : : 01 01 01 01 - piksel n .. .. .. .. .. oo oo .. .o .. .o o. o. .. oo .o o. .o o. .o o. oo .. .o .o o. .. o. .. oo oo .. n+8 .. .. .. .. : 76 54 32 10 - bit bajt
Każdemu bitowi, podobnie jak w przypadku graczy, odpowiada dokładnie jeden piksel pocisku.
Kolory
Jeden gracz może mieć dowolny, wybrany z palety, kolor - pocisk ma zawsze ten sam kolor co odpowiadający mu gracz (np. jeśli gracz nr 3 ma kolor $0A pocisk ma również kolor $0A). Wyjątkiem jest sytuacja, kiedy łączymy pociski w celu otrzymania piątego gracza - w tym przypadku gracz ten otrzymuje kolor z rejestru COLPF3 ($D019). Przez ingerencję w rejestr GTIACTL ($D01B) można też spowodować, że nakładające się piksele obiektów będą miały trzeci kolor uzyskiwany przez wykonanie bitowego OR na wartościach rejestrów kolorów nakładających się obiektów (tzw. gracze wielokolorowi). Nakładanie kolorów zachodzi wyłącznie w parach:
- gracz 0 lub pocisk 0 + gracz 1 lub pocisk 1 (PM0 + PM1)
- gracz 2 lub pocisk 2 + gracz 3 lub pocisk 3 (PM2 + PM3)
Możliwe jest również uzyskanie dodatkowych kolorów na ekranie przez ustalenie priorytetu 0 dla graczy i pocisków.
Kolory ustalamy wpisując odpowiednie wartości do rejestrów COLPM0-COLPM3 ($D012-$D015).
Priorytety
W rejestrze GTIACTL ($D01B) można określić priorytety wyświetlania poszczególnych sprajtów i elementów grafiki. Do tego celu konstruktorzy komputera przeznaczyli aż 4 bity.
bit | 3210 | kolejność | ||||||||
znaczenie | 0001 | PM0 | PM1 | PM2 | PM3 | PF0 | PF1 | PF2 | PF3 | BAK |
0010 | PM0 | PM1 | PF0 | PF1 | PF2 | PF3 | PM2 | PM3 | BAK | |
0100 | PF0 | PF1 | PF2 | PF3 | PM0 | PM1 | PM2 | PM3 | BAK | |
1000 | PF0 | PF1 | PM0 | PM1 | PM2 | PM3 | PF2 | PF3 | BAK |
Wyboru priorytetu dokonuje się poprzez ustawienie dokładnie jednego bitu. Ustawienie kilku bitów równocześnie powoduje, że w miejscach kolizji priorytetów wyświetlany jest kolor czarny niezależnie od ustawienia rejestru COLBAK.
Kolor ramki COLBAK ($D01A) ma zawsze najniższy priorytet, tak więc niemożliwe jest przykrywanie sprajtów przez ramkę ekranu.
Dodatkowe kolory
Ciekawe efekty powoduje ustawienie priorytetu 0, gdyż w takim wypadku kolory sprajtów zaczynają interferować z kolorami pola gry pozwalając na uzyskanie dodatkowych barw. Odbywa się to analogicznie, jak w przypadku wyświetlania sprajtów wielokolorowych przez dokonanie operacji bitowego OR na wartościach odpowiednich rejestrów kolorów, lecz kolory sprajtów - poza nakładaniem się w parach PM0+PM1 i PM2+PM3 - interferują dodatkowo z kolorami pola gry (PFx):
- PF0 + PM0
- PF0 + PM1
- PF0 + PM0 + PM1
- PF1 + PM0
- PF1 + PM1
- PF1 + PM0 + PM1
- PF2 + PM2
- PF2 + PM3
- PF2 + PM2 + PM3
- PF3 + PM2
- PF3 + PM3
- PF3 + PM2 + PM3
W ten sposób umiejętnie manipulując kształtem, szerokością i położeniami sprajtów można w wierszu uzyskać 23 różne kolory.
Hi-Res
W trybach wysokiej rozdzielczości nałożenie sprajta na pole gry powoduje zmianę koloru tła wszędzie tam gdzie piksel sprajta jest zapalony. W konsekwencji wszystkie piksele grafiki mają kolor pobrany z rejestru sprajta, przy czym jasność piksela zgaszonego (0) brana jest z rejestru koloru sprajta, natomiast jasność piksela zapalonego (1) brana jest z rejestru COLPF1 ($D017).
Ponieważ zarówno kolor tła, jak i piksela pobierany jest z rejestru COLPF2 ($D018), to nieco inaczej wygląda również nakładanie kolorów sprajtów kiedy włączony jest priorytet 0 i zachodzi wyłącznie w przypadkach:
- PF2 + PM2
- PF2 + PM3
- PF2 + PM2 + PM3
- PF3 + PM2
- PF3 + PM3
- PF3 + PM2 + PM3
Pierwsza para sprajtów PM0 i PM1 reaguje wyłącznie między sobą, ponieważ żaden piksel pola gry nigdy nie przybiera koloru pobranego z COLPF0 ($D016) lub COLPF1 ($D017).
Z kolei druga para zawsze interferuje z kolorem COLPF2 ($D018) lub COLPF3 ($D019), a więc kombinacje
- PM2
- PM3
- PM2 + PM3
możliwe są wyłącznie na ramce, gdzie wyświetlany jest COLBAK ($D01A) (co, nawiasem mówiąc, zwiększa pulę kolorów możliwych do uzyskania w linii z 23 do 26).
Pozycjonowanie
Pozycję poziomą graczy kontroluje się wpisując ich położenie do rejestrów HPOSP0-HPOSP3 ($D000-$D003). Podobnie zmienia się pozycję poziomą pocisków - należy wpisywać pożądane wartości do rejestrów HPOSM0-HPOSM3 ($D004-$D007). Są to rejestry tylko do zapisu.
Niestety nie ma rejestrów określających pozycję pionową - kontroluje się ją zmieniając położenie graczy oraz pocisków w obszarze pamięci wskazywanym przez PMBASE ($D407).
ANTIC rysuje na ekranie telewizyjnym 240 linii począwszy od linii 8, a skończywszy na 247. Z tego względu w rozdzielczości jednoliniowej na ekranie widoczna jest treść duszka zdefiniowana bajtami 8..247, a w rozdzielczości dwuliniowej bajtami 4..123 obszaru wskazywanego prze PMBASE ($D407). Pozostałe bajty znajdują się "poza ekranem" i nie są nigdy widoczne.
Wykrywanie kolizji
Istnieje również możliwość sprzętowego wykrywania wzajemnych kolizji duszków z polem gry (ale nie z kolorem tła), jak i z innymi duszkami. Służą do tego rejestry tylko do odczytu:
- KOLM0PF-KOLM3PF ($D000-$D003) Kolizja pocisku z polem gry. Wartości odczytujemy z poniższego schematu:
Bit 7 6 5 4 3 2 1 0 Rejestr koloru ...nieużywane.... 3 2 1 0
- KOLP0PF-KOLP3PF ($D004-$D007) Kolizja gracza z polem gry:
Bit 7 6 5 4 3 2 1 0 Rejestr koloru ....nieużywane... 3 2 1 0
- KOLM0P-KOLM3P ($D008-$D00B) Kolizja pocisku z graczem (nie ma rejestrów służących do wykrywania kolizji pocisku z pociskiem):
Bit 7 6 5 4 3 2 1 0 Duszek ...nieużywane.... 3 2 1 0
- KOLP0P-KOLP3P ($D00C-$D00F) Kolizja gracza z graczem:
Bit 7 6 5 4 3 2 1 0 Duszek ...nieużywane.... 3 2 1 0
Rozmiar
Matryca graczy ma 8 punktów szerokości, pocisków 2 punkty. Gracze oraz pociski mogą być sprzętowo rozszerzane za pomocą przeznaczonych do tego celu rejestrów. Możliwe są: szerokość pojedyncza, podwójna i poczwórna. Uzyskuje się je ustawiając odpowiednie kombinacje bitów w rejestrach SIZEP0-SIZEP3:
Bit 7 6 5 4 3 2 1 0 Szerokość: ...nieużywane... 0 0 pojedyncza (8 cykli koloru) 0 1 podwójna (16 cykli koloru) 1 0 pojedyncza 1 1 poczwórna (32 cykle koloru)
Dla ustalenia szerokości dla pocisków używa się rejestru SIZEM ($D00C):
Bity Szerokość: pojedyncza podwójna poczwórna 7 i 6: pocisk 3 0,128 64 192 5 i 4: pocisk 2 0, 32 16 48 3 i 2: pocisk 1 0, 8 4 12 1 i 0: pocisk 0 0, 2 1 3
Co do wysokości, zarówno gracze jak i pociski mają zawsze wysokość całego ekranu (łącznie z ewentualnymi ramkami) - oczywiście widać przy tym tylko te ich części, które zostały "narysowane" w obszarze pamięci wskazywanym przez rejestr PMBASE $D407. Bit skasowany oznacza tu piksel przezroczysty, bit ustawiony - piksel w kolorze wybranym dla danego duszka.
Linki
- Altirra Hardware Reference Manual ze szczegółowym opisem możliwości sprzętowych układu GTIA
- Wątek na forum Atari Age z opisem priorytetu 0
- Wątek na forum Atari Online z dyskusją nad 22 kolorami w linii
- Artykuł na Atari Online opisujący mechanizmy nakładania kolorów