W załączniku instrukcja w formie pliku PDF (katalog \doc\) oraz przykład użycia (katalog \example\) silnika Shanti-ego pozwalającego na wyświetlenie do 16 duszków 8x16 pikseli w 3 dowolnych kolorach każdy.
Źródła w postaci kodu relokowalnego Mad-Assemblera są w katalogu \src\
Dodatkowo w katalogu \convert\ jest programik którym możemy przygotować klatki duchów dla silnika, domyślnie zawsze generowane jest 8 klatek z pliku MIC (MIC o szerokość 40 bajtów na linię).
Jest to wersja zintegrowana i mieszcząca się w 4KB pamięci, w formie łatwej jak sądzę do wykorzystania. Maksymalnie 16 obiektów, 128 kształtów, zmiana zestawu znaków co wiersz, zmiana jednego z rejestrów GTIA co wiersz.
Nowy etap tworzenia gier stoi przed Wami otworem :)
p.s. Dodatkowo Shanti udostępnił kod silnika z gry "The Last Squadron" w pliku 'src\multi_tls.asm' (możliwe różne wysokości duszków) oraz z jego nowej gry "Bomb Jack" w pliku 'src\multi_bj.asm' (mniejsza zajętość pamięci kosztem szybkości generowania duszków)
pliki 'multi_tls', 'multi_bj' nie są zintegrowane z tą wersją przykładowego silnika
Piękna sprawa, brawo Shanti. Przypomnę przy okazji rozmowę z autorem, który opisuje kulisy tworzenia przez siebie gier (korpobełkot, jak twierdzi Zaxon :D, ale ja tam uważam inaczej, bardzo ciekawa opowieść):
To co, robimy Super Mario? ;) W załączniku źródła SMB, które przerobiłem tak, że można je skompilować MADSem (oczywiście wynikowy XEX się wywala, bo to wciąż dla mapy pamięci NESa). Ale kompilowalny kod to pierwszy krok ;)
Jak widzę nie jestem jedyny, który coś w tym kierunku próbował: ->link<-
Silnik Shanti-ego nie jest wystarczający, aby na nim SMB zrobić (np. obracające się strumienie ognia w dalszej części gry ->link<- ), więc trzeba by albo niektóre elementy gry przerobić, albo silnik duszków rozbudować.
Maw zapewne pyta, w jakiej rozdzielczości PIONOWEJ działa silnik Shantiego. Tebe zapewne zrozumiał, że chodzi o rozdzielczość/tryb graficzny Antica (co jako pytanie jest bez sensu, bo sprajty są od tego niezależne, więc zapewne o to nie chodzi).
Zajrzałem do kodu, silnik obsługuje rozdzielczość pionową TYLKO jednoliniową. Do dwuliniowej trzeba dużo poprawek zrobić. DEMO test.obx jest mylące, bo sprajty wyglądają jakby były w dwuliniowej rozdzielczości, a są w jednoliniowej (są pod adresem 5c00)
tryby graficzne dwu liniowe (Graphics 7) nie powinny być przeszkodą, przerwanie DLI wywołać co 4 takie linie, da nam 8, dla silnika to bez różnicy, on tylko chce zachować ciągłość sprajtów między kolejnymi wywołaniami przerwania, a to powinno odbywać się co 8 linii sprajtowych
Silnik opiera się na "silniku", który powstał podczas tworzenia gry "Last Squadron". Duszki sa tu w rozdzielczości jednoliniowej, a tło w Antic 4. Mamy 5 kolorów do wykorzystanie na tło gry, a duszki mają swoje kolory (3 kolory na obiekt 2+ORA). W każdej linii znakowej możemy wybrać dowolny zestaw znaków i dodatkowo zmienić 1 kolor (dowolny) tła. Silnik wyświetla duszki w rozmiarze 8x16pikseli, co zajmuje 3 linie znakowe, łatwo można go powiększyć dodając nastepne linie(8x24,8x32,8x64). Każdemu duszkowi ustalamy pozycję poziomą i pionową, kształt,kolory(zależnie od potrzeb można zostawić jeden kolor stały i zmieniać szerokość, tak jest w TLS) Nie jest to silnik uniwersalny i na pewno trzeba go modyfikować do własnych potrzeb, zależnie od wybranego trybu tła, wysokości i szerokości ekranu, scrolli pionowych i poziomych. Główny bohater jest rysowany co ramkę pozostałe obiekty zależnie od możliwości(naraz w jedej linii mogą być tylko 2 obiekty) Przykładem wykorzystania tego silnika jest właśnie Gacek. Ekran jest tu również w Antic 4, ale już bez scrolla pionowego. Zastosowałem tu obraz w szerokości 48 bajtów,a ramki zamaskowałem czarnymi znakami. Spowodowane jest to potrzebą uzyskania czarnego koloru pocisków (COLPF3), które są użyte na bohaterze rozgrywki. Zmieniłem też sposób animacji duszków, żeby można było dodawać dowolna ilość klatek animacji (w TLS były to potęgi 2, czyli 2,4,8...). Sama gra ,dzięki wykorzystaniu silnika,powstała w jakieś 2 miesiące, bo w międzyczasie zająłem się tworzeniem silnika 3D i poprawki robiłem przed końcem terminu ABBUC'a.
Nie, tekstura może być dowolna, obecnie ma 64bajty wysokości i 16 bajtów szerokości (32 piksele). Chyba trzeba będzie dodać kilka rozmiarów tekstur bo z większej odległości są mało wyraźne.
Zastosuj trik, który zastosował KK w Dreadzie. Opowiada o tym pod koniec "Making Of". O tu: ->link<- Chociaż może nie podchodzić to pod twój sposób renderowania.
->link<- "Well, I have one "mip map" that is one quarter of the vertical size and is used when the scaling is too small, because you start losing too much information just discarding lines"
mamy vectora udostępnionego ze wszystkimi źródłami, itp... bardziej komplikowany (bardziej 3D), ale i tak największy problem to dorobić w tym jakąś grę...
Shanti's engine can do a great 64k version of Bombjack (named Gacek). So for me there is no longer the need to play the 320k RAM or Corina cart. version.
Question: Would the engine also make it possible to have a 64k or at least 128k Yie Ar Kung Fu version ? If so, there would be no need any longer for the 320k RAM or Corina .CAR versions of YAKF.
@CharlieChaplin Unfortunately, the engine is not suitable for such a game, because there are wide characters there, and atari sprites are only 8px wide.
Uparłem się ostatnio by zlinkować Shanti Sprite Multiplexer z programem napisanym w llvm-mos clang, efekt w załączniku (wrzuciłem też na youtube ale dużo mocniej miga, strzelam że youtube zmienił framerate?)
Powstało w międzyczasie dość ciekawe narzędzie do konwertowania relokowalnych plików obx do formatu ELF obj, poniższe demo zostało zbudowane przy użyciu pliku engine.obx obecnego w archiwum. Ten sam wynikowy plik elf można użyć oczywiście też z rust-mos (można też się pokusić o opublikowanie na crates.io paczki a800xl-sprite-multiplexer, użycie potem biblioteki we własnym projekcie to dodanie jednej linijki do [dependencies] w Cargo.toml)
Podziękowania dla @tebe za świetną dokumentację do formatu obx (choć kilka poprawek pewnie mogę na świeżo zasugerować)