>Moglbys napisac w jaki sposob wydajnie animujesz duszki? Tzn domyslam sie ze za pomoca buforow, ale 10kB? Kazda klatka animacji to osobny bufor?
Metoda jest prosta, wręcz banalna ale pamięciożerna i niesie pewne ograniczenia.
Postaram się pokrótce opisać.
Komodorowcy mają banki na sprajty. Trzymają w pamięci w odpowiedni sposób w blokach co 64 bajty.
Potem tylko wskazują który sprajt ma skąd pobierać dane z tych bloków.
Pomyślałem a jakby coś takiego zrobić u nas.
I wyszło nawet nieźle. Dla obiektów poruszających się tylko w osi X jest to super rozwiązanie.
A więc:
Bank duszków na Atari (to wiadomo)
0-2ff puste
300-3ff pociski
400-7ff gracze 1-4
tworzymy 8 takich banków
zabiera nam to 16kb pamieci
ale jeśli nie używamy pocisków to adresy 0-3ff mamy wolne (na np fonty czy dane jakieś)
czyli faktycznie zużywamy 8 kb rozrzucone w obszarze 16kb (niestety adresy banków muszą być na granicy 2 kb więc nie da się tego ścieśnić)
Dla uproszczenia przykładu powiedzmy że mamy sprajta o szerokości 16 cykli koloru czyli używamy wszystkich czterech graczy.
Normalnie byśmy przepisali do adresu $400+pozycja Y,$500+pozycjaY,etc
ale możemy zrobić to dla każdego z ośmiu zarezerwowanych na to banków wpisując do każdego gotową fazę animacji
Bank0 - 1faza prawo
Bank1 -2faza prawo
Bank2 -3 faza prawo
Bank3 -4faza prawo
Bank4 -1faza lewo
Bank5 -2faza lewo
Bank6 -3faza lewo
Bank7 -4faza lewo
i możemy prosto animować zmieniając tylko $d407
lda #> tutaj adres banku
sta $d407
po prostu animujemy sprajta
ale co z następnymi?
robimy to samo kopiujemy je do banków w odpowiednie adresy odpowiadajace pozycji Y
i na DLI zmieniamy $d407 na numer fazy animacji jaką potrzebujemy
Ja mam zrobioną tablicę adresów faz, i na niej operuję na VB ustalając jaka faza animacji będzie wyświetlana.
A na DLI pobieram z niej bezpośrednio i przepisuję bank, czyli
DLI1
...
...
lda TabSprite
sta $d407
...
...
rti
DLI2
...
...
lda TabSprite+1
sta $d407
...
...
rti
Ograniczenia:
Jeśli to jest jeden sprajt w lini czyli np 16 pixelowy złożony z czterech graczy to nie ma ograniczeń.
Jeśli są dwa to wtedy pierwszym (grac 0+1) można swobodnie animować ale drugi będzie miał ograniczenia.
Bo np. jeśli pierwszy bedzie szedł w lewo a drugi będzie chciał iść w prawo to nie da rady. :) Fazy się nie zgrają.
Trzeba wtedy do drugiego sprajta (gracz2+3) wrzucić animację która będzie niezależna od kierunku.
Mogą to być monety, gwiazdki (jak w Crowland), latające kule, itp
Można też użyć pocisków ale znika nam extra 2kb. Za to można zrobić z nich w połączeniu z graczem (0 i 1) sprajty jak na komodzie 12 pixelowe.