Byłem pewien, że C= okrawając TEDa z funkcji, usunęło również scroll.
Właśnie to miałem na myśli, pisząc o logice – zachowanie się wszystkiego co jest na ekranie.
Podzieliłem to na obiekty aktywne, tzn sprawdzające z czym kolidują albo na co nachodzą (bohater, przeciwnicy, lasery, bomby, strzały, ogień itp.)- ich stan, ilość i współrzędne są zapamiętane w tablicach i bierne – murki, ślady, monety itd., obecne tylko na mapie planszy…
Nie wszystko jeszcze działa, są drobne błędy itp., i pewnie nie ma wszystkiego bo w oryginał grałem tylko parę chwil by zobaczyć jak to ogólnie działa.
Bardziej szczegółowo wygląda to tak:
w pamięci jest:
1KB mapy planszy „40x20” – to plansza „logiczna” - tu sprawdzane są kolizje itp., każda zmiana w tym obszarze jest od razu odwzorowana w poniższej pamięci,
4KB graficznego odwzorowania planszy – „80x40”, każdy element ma 2x2 znaki stąd jest tego 4x tyle.
2 x 1KB ekranu tekstowego w podwójnym buforowaniu – wyświetlane na zmianę,
3 x 2KB na trzy zestawy wzorców znaków. Animowanie każdego z elementów to po prostu cykliczne, co~0,3s, przełączanie zestawów znaków w ten sposób: 1, 2, 3, 2, 1, 2, 3, 2, 1…
W C64 w 256 wzorcach mieszczą się wszystkie obiekty + 26 liter, cyfry i inne drobiazgi, nie to co ataryna…
Płynny przesuw zrobiłem w ten sposób:
co przerwanie przepisuję kawałek z tego 4KB obszaru odwzorowującego mapę logiczną do jednego z buforów. W każdej ramce przepisuję 1/4 obrazu. W ramce 0 przełączam wyświetlanie obrazu na $C000 i przesuwam (odpowiednio do ruchu) wskaźniki: X (co 2) i Y (co 160). Do 3 ramki przepisywany jest cały obraz do $C400, w 4 ramce przełączam wyświetlanie obrazu na $C400, a kolejny przepisuję do $C000 w kolejnych ramkach aż do 7. Jednocześnie w każdej ramce przesuwam obraz odpowiednio w $D011 lub/i D016.
Działa bardzo ładnie, problem jednak w tym, że w C64 nie da się buforować pamięci koloru. Trzeba by ją przepisywać całą pomiędzy ramkami, a na to nie ma już czasu.
Poza tym mapa kolorów musiała by być również odwzorowana w innym obszarze 4KB, dodatkowe przepisywanie itp. - zajęło by to dużo pamięci, dużo czasu...
Wiem, że da się to zrobić bo są gry z płynnym przesuwem we wszystkie strony razem z mapą kolorów, ale tego nie da się wykonać pisząc funkcje w C. (przynajmniej w CC65, który w ogóle nie optymalizuje kodu – to taki trochę lepszy „interpreter basic”).
Dlatego mapa kolorów jest zapełniana jednolicie dla danej planszy.
Cała procedura przesuwu obciąża w ok 30% CPU, więc zostaje jeszcze sporo dla logiki.
Algorytmy logiki z kolei wywoływane są co czwartą ramkę, ale poza przerwaniami, więc mogą trwać znacznie dłużej, dlatego byle jak napisany kod wciąż działa...
Program napisałem w większości w C w stylu mało „akademickim” (na zasadzie: jak działa to nie ruszać
).
Tylko procedury przepisywania ekranu są w asm. Mimo to procesor wyrabia się bez problemu, przerwania i procedury nie nachodzą na siebie.
Jeśli w C+4 pamięć kolorów jest relokowalna, to obowiązkowo trzeba to wykorzystać, by ukrócić to pretensjonalne „na Atari da się lepiej”
TED nie ma sprite-ów – problem może być z dolną krawędzią obrazu nad nieruchomym panelem – widać szarpanie. W C64 zakryłem go po prostu paskiem z czarnych duszków. W C+4 pewnie trzeba będzie wymyślić jakąś inną metodę.
Trochę doszlifuję to co nawymyślałem a wtedy zamieszczę jakiś „preview”.