Dla mnie to zupełna nowość, więc proszę się nie śmiać :D Mam pytanie, na które odpowiedź zapewne wszyscy znają i z pewnością rozwiązanie zagadki jest banalnie proste... Do rzeczy!
Chcę sobie wyświetlić jakąś grafikę w trybie graficznym SR OVERLAY, czyli np. 320x192 w 256 kolorach. Obrazek mogę narysować sobie w jakimś programie graficznym - np. w MS Paincie. No i teraz najciekawsze. Cytuję z podręcznika programisty VBXE FX v1.26:
"Za każdy piksel w tym trybie odpowiada jeden bajt w pamięci VBXE. Bajt o wartości zero (0) powoduje, że piksel nie jest wyświetlany (jest przeźroczysty - chyba, że ustawiony jest bit no_trans w rejestrze VIDEO_CONTROL). Pozostałe wartości wybierają z aktywnej palety OVERLAY kolor o numerze C = wartość bajtu."
To jest zrozumiałe :)
Powiedzcie mi, za pomocą jakiego narzędzia mogę przygotować takie dane, które będą poprawnie interpretowane przez VBXE? Jak mam zapisać grafikę, którą sobie stworzyłem w programie graficznym, żebym mógł ją wrzucić do pamięci VBXE?
Z góry dziękuję za jakiekolwiek wskazówki, które naprowadzą mnie na rozwiązanie tego problemu.
Jest tam też link do wątku na tym forum, gdzie pytałem o to samo ;)
Grafikę robiłem w Grafx2, palety JASC przez niego generowane konwertowałem pal2bin (stąd ->link<- w załączniku binarka dla Linuksa) a obraz eksportowałem w Gimpie do raw data (chyba płaski RRR,GGG,BBB nie pamiętam już).
Tru. Generalnie zapisuj po prostu nieskompresowany obrazek 8-bit indexed (palette). Żadnych trukolorów i innych hajkolorów bo będziesz miał miliony kolorów i sam będziesz musiał sobie to przerabiać na paletę. Przez sąsiednie forum podesłałem Ci maila - odezwij się do to dostaniesz źródło do "Ni z gruchy, ni z pietruchy" :D
Kiedyś na Amidzie robiło się floydem steinbergiem 16-kolorowe gify wyglądające jak true color w wysokiej rozdzielczości. Tak więc mono ma rację - należy wykorzystać moc gimpa przy przekształcaniu obrazków do indexed.
Eksport jako RawData Indexed zapisuje w dwóch plikach: paleta i obrazek z indeksami kolorów bajt po bajcie. Można to łatwo obsłużyć w czym się chce.
Dzięki Panowie. Widzę jednak, że to nie takie hop-siup. Szkoda, że tyle lat po pojawieniu vbxe nie powstały jakieś programy wspomagające. No cóż, trzeba będzie się temu wszystkiemu, co tu opisaliście przyjrzeć z bliska.
@Pin, można i tak, ale nie chcę ograniczać się do oglądania obrazków... No, ale o tym później.
@Mono, dzięki za maila. Spróbuję to przetrawić ;)
@Greblus, coś tam kiedyś robiłem w Action!, ale obecnie nic z tego nie pojmuję... eee, no może prawie nic
@Bob_er, a nie chcesz się podzielić swoim programem?
Larek, co do samej grafiki, da się to też zrobić w całości w Gimpie, jak pisał Kuba.
Ja to robię tak:
1. Otwieram plik w Gimpie. 2. Obraz -> Skaluj obraz -> np. 320x200 3. Obraz -> Tryb -> Indeksowany (Optymalna paleta 256 kolorów), można sobie ditherowanie włączyć -> Konwertuj. 4. Z menu Okna, Dokowalne okna... -> Paleta kolorów (tu możemy sobie ją zobaczyć i pozmieniać). 5. Okna -> Dokowalne okna... -> Palety. Rozwijamy dziubek Konfiguruje tą kartę -> Menu palet -> Zaimportuj paletę -> Obraz. 6. Prawy przycisk na zaimportowanej palecie -> Export As > Text file.
7. Zapisuje plik i konwertuje do postaci binarnej załączonym skryptem w Pythonie (można też przeparsować plik tekstowy, ale w Action! mi się nie chce ;)). Binarny się łatwiej wczytuje.
8. Obraz eksportuje jako Raw data.
W starszym Gimpie było to chyba lepiej zrobione. Zapewne da się prościej, jak się zna specyfikację bitmapy, czy tam innych formatów indeksowanych z paletą w nagłówku.
W ramach ćwiczenia jeszcze jeden. Wiem, że konwertery BMP->VBXE_XEX istnieją i każdy sobie może wygenerować takie obrazki w dowolnej ilości, więc ten z mojej strony będzie już raczej ostatnim. Teraz wezmę się za grafikę do gry :)
Wstęp: Chcę wyświetlać róże ruchome obiekty na jakimś tle-grafice. Wszystko oczywiście w trybie graficznym vbxe 320x192. Robię to tak: - kopiuję do bufora całe tło - wstawiam na to tło w buforze moje obiekty (docelowo sporo) - jak już mam wszystkie obiekty na miejscu... - ...przenoszę cały obraz narysowany w buforze w miejsce pamięci ekranu - no i pojawia nam się wszystko na ekranie. Oczywiście zaprzęgam do tego blitter vbxe.
Sedno sprawy: Gdybym podobne rzeczy robił na klasycznym Atari, to wszelkie rysownie po ekranie raczej próbowałbym (w miarę możliwości) robić podczas przerwania pionowego, bo wówczas mógłbym uniknąć migotania, które może pojawić się przy rysowaniu bez synchronizacji.
Pytanie: Czy w trybach VBXE i przy wyświetlaniu tych trybów takie działanie, tj. synchronizacja z przerwaniem pionowym, a w zasadzie rysownie podczas przerwania ma sens? A może vbxe ze swoim blitterem rysuje obraz na tyle szybko, że żadnych zakłóceń nie zobaczymy?
Z góry przepraszam, jeśli moje pytanie jest bez sensu ;)
Uniknąć blitowania wyniku na ekran docelowy możesz za pomocą dwubuforowania i zmiany xdlisty. Blitter też ma swoją wydajność (ok 130kb na ramkę), więc jeśli zapuścisz go na rysowanym przez monitor ekranie, to możesz obserwować efkt przegonienia plamki. Jeśli blitter będzie odpalany w tym samym momencie w ramce, to przeganianie plamki może się dziać zawsze w tym samym momencie i przy animacjach w tym punkcie będziesz widział kawałek starej klatki i kawałek nowej. Jeśli blitter nie będzie synchronizowany, to albo efektu nie zobaczysz, albo ze względu na rzadkość i różne miejsca w których występuje będzie praktycznie nieuchwytny dla oka. VIDEO_CONTROL i XDL_ADR odczytywane są przez VBXE po zgłoszeniu synchronizacji pionowej (ramki) więc możes je dowolnie zapisywać bez potrzeby synchronizacji. BL_ADR zdaje się jest przepisywany w momencie uruchomienia blittera. Blitter możesz oczywiście uruchomić w dowolnej chwili.
Edit: A efekt przeganiania plamki możesz obejrzeć w Tomek8-VBXE "demo". No i ile w całej ramce zajmuje blitowanie prawie 60 obiektów o różnych rozmiarach (obiektow i masek).
Edit 2: Jeśli odpalisz blitter zanim obraz, który jest wyświetlany zostanie narysowany to pamka może go nigdy nie dogonić. Pomierz sobie czas malowania blittera i po prostu odpalaj go w odpowiedniej chwili. Pomocny tu będzie VCOUNT.