Ok, w załączniku przesyłam pierwszą wersję silnika izometrycznego: execute i źródło (w 64tass). Wymyśliłem działanie silnika bez żadnych pomocy i wgłębiania się w temat więc albo wyważałem otwarte drzwi albo napisałem głupi algorytm ale potraktowałem to jako wyzwanie więc ciiii;). Mimo wszystko działa w miarę szybko. Jest w stanie wyrysować planszę w czasie około 2 ramek więc spokojnie można sobie podzielić rysowanie planszy na dwie ramki po połowie co nie wpłynie na odtwarzanie muzyki, sterowania czy AI.
Od razu zaznaczam, że:
Jestem raczkującym programistą więc chętnie wysłucham wszelkich opinii na temat "niuansów" w tym kodzie choć jest to "kod wyrzygany" - zmieniany sto razy w ferworze pracy nad silnikiem, na tym etapie ma po prostu to działać
. Nie optymalizowałem kodu, nie speedowałem żadnej z części ze względu na to, iż na tym etapie jedynie próbowałem wprowadzić swoją ideę. Wszelką optymalizację wykonam oczywiście na końcu
. Jest tam na przykład jedna brzydka pętla (2x wykonywana) z użyciem zmiennej LINE2 (której nazwę też w sumie muszę zmienić), tego momentu nie unrollowałem na razie.
Gwoli wyjaśnienia:
Bitmapę bitmap.png tworzę na Amidze i konwertuję do znaków ASCII swoim sprawdzonym programem
. Podobnie z tablicami. Bitmapa czytana jest jako 16 kwadratów (każdy po 8 pikseli oczywiście) w poziomie.
Wymyśliłem sobie metodę "sąsiadów" zapisaną w nybble, lewy nybble to aktualne pole a następny nybble to pole sąsiadujące (Amaurote-neighbours.png). Tym sposobem tworzone są znaki dla wszystkich możliwości a potem dana wartość, np: 01 dla szukanego lewego sąsiada to znaki 22 i 23. Zakręcone trochę, ale przyspiesza znacznie wyświetlanie.
Wyświetlana jest linijka po linijce po dwa znaki. I co najważniejsze: dodanie następnych obiektów nie wpłynie na prędkość wyświetlania wcale.
Nie wiem czy dobrą drogą podążam, bo jeżeli pojawi się więcej rodzajów pól i dla każdego narysować będę musiał wszystkie możliwości to może tych znaków zabraknąć. Ale wydaje mi się, że dzięki temu bardzo szybko się to wyświetla, więc jeżeli Amaurote będzie niemożliwe do konwersji w ten sposób, zawsze pozostanie mi silnik dlatego nie liczyłem czy starczy znaków - jak starczy to ok. Innej metody nie jestem w stanie wymyślić.
Obiekty "wystające" ponad ziemię to kolejny etap, wszystko właśnie chciałem wyrysować bez modyfikacji charsetów na gotowym zestawie, więc zastanawiam się jak to rozwiązać dla tak różnorodnej ilości pól. Myślę, że wszystkie muchy, naszego "pająka" mogą być tylko sprite'ami z nakładaną maską zasłaniających elementów.
Więc to na tyle, rozgryzłem izometrię w ten sposób - jeżeli ktoś znalazłby jakieś udogodnienie bądź też zaproponował inne rozwiązanie - byłoby super. Wyzwanie jest spore
.
Co do obsługi można klawiszami kursora przesuwać się po polach na ograniczonym obszarze.
Mam tylko problem w wyświetlaniu pozycji x i y w postaci decymalnej.
W include/print_screen.asm próbowałem z:
ale zawiesza mi przerwania chyba. Po rozwinięciu tego co kryje się pod $BDCD okazało się, że "przeszkadza" JMP $AB1E. Nie drążyłem tematu bo dowiedziałem się o tym prostym przekształcaniu hex2dec godzinę temu i nie chciałem zwlekać z tym kodem więc HEEEELP!!
To chyba wszystko na razie, temat otwarty chyba, zobaczymy. Mam nadzieję, że nie dałem plamy z tym moim kodowaniem
.
Nie wiem do końca jak nałożyć na to sprite'y skoro czarny jest przeźroczystym (nie odseparuje sprite'a od planszy na czarnym tyle) no i jeszcze dochodzą te "ramki" z boków, może najlepiej z czegoś po prostu zrezygnować. Ktoś umiałby zamieścić w kodzie player z muzyką z gry?
BTW. Wersja Amaurote na ZX Spectrum jest nieco bogatsza niż ta na Atari więc warto się na niej skupić
.
No i wszystkiego najlepszego Commodore 64! Rok w rok obchodzimy te same urodziny
.
Edit: poprawiłem te wyświetlanie koordynat w pliku i jeszcze raz wrzuciłem załącznik, żeby nie robić następnej wersji archiwum.