Player/Missile Graphics
From Atariki
Wersja z dnia 06:21, 3 sty 2006 KMK (Dyskusja | wkład) (→Kolory) ← Previous diff |
Wersja z dnia 11:31, 1 maj 2021 Mono (Dyskusja | wkład) (→Kolory - nakładanie) Next diff → |
||
Linia 3: | Linia 3: | ||
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). | 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 duszków i czterech pocisków (lub pięciu duszków - piątego uzyskujemy przez połączenie czterech pocisków). | + | 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ść [[Rejestry ANTIC-a#PMBASE|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ść [[Rejestry ANTIC-a#PMBASE|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 == | == Kolory == | ||
- | Jeden duszek może mieć dowolny, wybrany z palety, kolor - pocisk ma zawsze ten sam kolor co odpowiadający mu duszek (np. jeśli duszek 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 [[Rejestry GTIA#COLPF3|COLPF3 ($D019)]]. Przez odpowiednią ingerencję w rejestr [[Rejestry GTIA#GTIACTL|GTIACTL ($D01B)]] można też spowodować, że nakładające się piksele graczy 0 i 1 oraz 2 i 3 będą miały trzeci kolor - uzyskiwany przez wykonanie logicznego OR na rejestrach kolorów nakładających się obiektów. | + | 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 [[Rejestry GTIA#COLPF3|COLPF3 ($D019)]]. Przez ingerencję w rejestr [[Rejestry GTIA#GTIACTL|GTIACTL ($D01B)]] można też spowodować, że nakładające się piksele obiektów będą miały trzeci kolor uzyskiwany przez wykonanie logicznego OR na wartościach rejestrów kolorów nakładających się obiektów. Nakładanie kolorów zachodzi wyłącznie w parach: |
+ | |||
+ | * gracz 0 lub pocisk 0 + gracz 1 lub pocisk 1 | ||
+ | * gracz 2 lub pocisk 2 + gracz 3 lub pocisk 3 | ||
Kolory ustalamy wpisując odpowiednie wartości do rejestrów [[Rejestry GTIA#COLPM0|COLPM0-COLPM3 ($D012-$D015)]]. | Kolory ustalamy wpisując odpowiednie wartości do rejestrów [[Rejestry GTIA#COLPM0|COLPM0-COLPM3 ($D012-$D015)]]. | ||
Linia 13: | Linia 55: | ||
== Pozycjonowanie == | == Pozycjonowanie == | ||
- | Pozycję poziomą duszków kontroluje się wpisując jego położenie do rejestrów [[Rejestry GTIA#HPOSP0|HPOSP0-HPOSP3 ($D000-$D003)]]. Podobnie zmienia się pozycję poziomą pocisków - należy wpisywać pożądane wartości do rejestrów [[Rejestry GTIA#HPOSM0|HPOSM0-HPOSM3 ($D004-$D007)]]. Są to rejestry tylko do zapisu. | + | Pozycję poziomą graczy kontroluje się wpisując ich położenie do rejestrów [[Rejestry GTIA#HPOSP0|HPOSP0-HPOSP3 ($D000-$D003)]]. Podobnie zmienia się pozycję poziomą pocisków - należy wpisywać pożądane wartości do rejestrów [[Rejestry GTIA#HPOSM0|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 [[Rejestry ANTIC-a#PMBASE|PMBASE ($D407)]]. | ||
- | Niestety nie ma rejestrów określających pozycję pionową - kontroluje się ją zmieniając położenie duszków (pocisków) w obszarze wskazywanym przez [[Rejestry ANTIC-a#PMBASE|PMBASE ($D407)]]. | + | [[ANTIC (układ)|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 [[Rejestry ANTIC-a#PMBASE|PMBASE ($D407)]]. Pozostałe bajty znajdują się "poza ekranem" i nie są nigdy widoczne. |
== Wykrywanie kolizji == | == Wykrywanie kolizji == | ||
- | Komputery z serii 400/800/XL/XE posiadają również sprzętową możliwość sprawdzania kolizji duszków (pocisków) z tłem, jak i z innymi duszkami (pociskami). Służą do tego rejestry tylko do odczytu: | + | 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: |
- | [[Rejestry GTIA#KOLM0PF|KOLM0PF-KOLM3PF ($D000-$D003)]] Kolizja pocisku z tłem. Wartości odczytujemy z poniższego schematu: | + | * [[Rejestry GTIA#KOLM0PF|KOLM0PF-KOLM3PF ($D000-$D003)]] Kolizja pocisku z polem gry. Wartości odczytujemy z poniższego schematu: |
<pre> | <pre> | ||
Linia 28: | Linia 72: | ||
</pre> | </pre> | ||
- | [[Rejestry GTIA#KOLP0PF|KOLP0PF-KOLP1PF ($D004-$D007)]] Kolizja duszka z tłem: | + | * [[Rejestry GTIA#KOLP0PF|KOLP0PF-KOLP3PF ($D004-$D007)]] Kolizja gracza z polem gry: |
<pre> | <pre> | ||
Linia 35: | Linia 79: | ||
</pre> | </pre> | ||
- | [[Rejestry GTIA#KOLM0P|KOLM0P-KOLM3P ($D008-$D00B)]] Kolizja pocisku z duszkiem (nie ma rejestrów służących do wykrywania kolizji pocisku z pociskiem): | + | * [[Rejestry GTIA#KOLM0P|KOLM0P-KOLM3P ($D008-$D00B)]] Kolizja pocisku z graczem (nie ma rejestrów służących do wykrywania kolizji pocisku z pociskiem): |
<pre> | <pre> | ||
Linia 42: | Linia 86: | ||
</pre> | </pre> | ||
- | [[Rejestry GTIA#KOLP0P|KOLP0P-KOLP3P ($D00C-$D00F)]] Kolizja duszka z duszkiem: | + | * [[Rejestry GTIA#KOLP0P|KOLP0P-KOLP3P ($D00C-$D00F)]] Kolizja gracza z graczem: |
<pre> | <pre> | ||
Linia 51: | Linia 95: | ||
== Rozmiar == | == Rozmiar == | ||
- | Matryca duszków ma 8 punktów szerokości, pocisków 2 punkty. Duszki 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 [[Rejestry GTIA#SIZEP0|SIZEP0-SIZEP3]]: | + | 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 [[Rejestry GTIA#SIZEP0|SIZEP0-SIZEP3]]: |
<pre> | <pre> | ||
Linia 61: | Linia 105: | ||
</pre> | </pre> | ||
- | Dla ustalenie szerokości dla wszystkich pocisków używa się rejestru [[Rejestry GTIA#SIZEM|SIZEM ($D00C)]]: | + | Dla ustalenia szerokości dla pocisków używa się rejestru [[Rejestry GTIA#SIZEM|SIZEM ($D00C)]]: |
<pre> | <pre> | ||
Linia 68: | Linia 112: | ||
7 i 6: pocisk 3 0,128 64 192 | 7 i 6: pocisk 3 0,128 64 192 | ||
5 i 4: pocisk 2 0, 32 16 48 | 5 i 4: pocisk 2 0, 32 16 48 | ||
- | 3 i 2: pocisk l 0, 8 4 12 | + | 3 i 2: pocisk 1 0, 8 4 12 |
1 i 0: pocisk 0 0, 2 1 3 | 1 i 0: pocisk 0 0, 2 1 3 | ||
</pre> | </pre> | ||
- | 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 wskazywanym przez rejestr [[Rejestry ANTIC-a#PMBASE|PMBASE $D407]]. Bit skasowany oznacza tu piksel przeźroczysty, bit ustawiony - piksel w kolorze wybranym dla danego obiektu. | + | 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 [[Rejestry ANTIC-a#PMBASE|PMBASE $D407]]. Bit skasowany oznacza tu piksel przezroczysty, bit ustawiony - piksel w kolorze wybranym dla danego duszka. |
[[Kategoria:Programowanie Atari 8-bit]] | [[Kategoria:Programowanie Atari 8-bit]] |
Wersja z dnia 11:31, 1 maj 2021
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 logicznego OR na wartościach rejestrów kolorów nakładających się obiektów. Nakładanie kolorów zachodzi wyłącznie w parach:
- gracz 0 lub pocisk 0 + gracz 1 lub pocisk 1
- gracz 2 lub pocisk 2 + gracz 3 lub pocisk 3
Kolory ustalamy wpisując odpowiednie wartości do rejestrów COLPM0-COLPM3 ($D012-$D015).
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.