Player/Missile Graphics

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 12:47, 21 wrz 2005
KMK (Dyskusja | wkład)
(Wykrywanie kolizji)
← Previous diff
Wersja z dnia 11:31, 1 maj 2021
Mono (Dyskusja | wkład)
(Kolory - nakładanie)
Next diff →
Linia 1: Linia 1:
== Charakterystyka == == 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"). 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)]].+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)]].
== 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 duszków (pocisków) w obszarze wskazywanym przez [[Rejestry ANTIC-a#PMBASE|PMBASE]].+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)]].
 + 
 +[[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#KOLP0PL|KOLP0PL-KOLP3PL ($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 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 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>
-[[Kategoria:Glosariusz]]+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]]

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:

           Bit     7    6    5    4     3      2     1     0
Rejestr koloru    ...nieużywane....     3      2     1     0
           Bit     7    6    5    4     3      2     1     0
Rejestr koloru    ....nieużywane...     3      2     1     0
   Bit     7    6    5    4     3      2     1     0
Duszek    ...nieużywane....     3      2     1     0
   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.

Personal tools