Piszemy GRĘDzień dobry ponownie. Zlitowałem się i nie będę truł. Z dwu powodów: po pierwsze: przyszły listy, a po drugie: ostatnio, podczas pracy nad nowym programem przeprowadziłem pewnego rodzaju testy czasowo-szybkościowe, a otrzymanymi wynikami postanowiłem podzielić się z Wami, gdyż są to dosyć istotne sprawy przy pisaniu gier. Testy te związane są z migotaniem obrazu.Proszę uruchomić program nr 1, aby "własnoocznie" przekonać się o tym, co przed chwilą napisałem. Oj nieładnie, nieładnie to wygląda. Dopiszmy więc po etykiecie LOOP następującą sekwencję: lda rtclock cmp rtclock beq *-2No i co? Ładnie, płynnie i bez zakłóceń. Właśnie o to chodziło. Dopisane instrukcje powodują właśnie synchronizację programu z ANTIC'em. Dlaczego? Otóż zawartość zegara systemowego (RTCLOCK) jest zwiększana podczas każdego przerwania VBI, a to z kolei wywoływane jest podczas powrotu plamki (strumienia elektronów) kreślącej obraz na ekranie z prawego dolnego, do lewego górnego rogu ekranu. Tak więc w momencie zmiany zawartości wspomnianego zegara możemy mieć pewność, że w chwili obecnej nic nie jest malowane na ekranie. Niestety, pojawia się tutaj pewien problem. Kiedy nasz program jest bardzo rozbudowany i poza wyświetlaniem prostego sprite'a wykonuje jeszcze inne operacje na ekranie, np. animację znakową, wyświetlanie innych sprite'ów, wyświetlanie liczników, to może się zdarzyć, a zdarza się w takich przypadkach prawie zawsze, że nasz program nie wyrobi się czasowo, gdyż od zakończenia kreślenia do rozpoczęcia kreślenia nowego obrazu mija bardzo niewiele czasu i sytuacja się odwróci, ANTIC wyprzedzi program. Znowu będzie migało, a to wkurza. Mamy generalnie dwa rozwiązania. Albo synchronizować się w opisany sposób kilkakrotnie w czasie wykonywania głównej pętli, albo synchronizować się w nieco inny sposób. Praktycznie nigdy nie wykorzystuje się do końca możliwości ANTIC'a i wyświetlany obraz nie jest bardzo duży, a nad i pod nim wyświetlana jest zawsze pewna ilość pustych linii. Aby mleć więcej czasu dla programu i aby w czasie swego działania nie "wchodził" on na ekran, można spowodować jego działanie już w momencie zakończenia kreślenia zmienianej części ekranu. Do tego celu należy użyć rejestru VCOUNT ($D40B), który zawiera numer aktualnie kreślonej linii ekranu podzielony przez dwa. Tak więc wystarczy zmienić naszą sekwencję synchronizującą np. na taką: lda #112 cmp vcount bne *-3gdzie 112 jest numerem linii, po narysowaniu której nasz program ma rozpocząć działanie. Liczba ta jest ściśle związana z pionowym rozmiarem ekranu i należy ją ustalić na podstawie DISPLAY LIST'y lub doświadczalnie. Analizując DISPLAY LIST'ę należy policzyć ile jest wyświetlanych linii rastra (np. takich, jak w trybach antica $0E lub $0F) i podzielić ją przez dwa. Aby dobrać ją doświadczalnie można użyć np. programu nr 2. Należy tak dobrać etykietę LINIA, aby jaśniejsza część ramki znajdowała się poniżej roboczej części ekranu. No dobrze, ktoś jednak może zapytać: "a co, jeśli dalej będzie mi brakowało czasu?". Niestety, pozostaje tylko kilkakrotna synchronizacja lub optymalizacja programu pod względem czasowym. Aby porównać obie metody synchronizacji, proszę użyć programów 3 i 4. Po uruchomieniu pierwszego z nich (koniecznie pod QA) naciskamy klawisz i program "przez" BRK powraca do QA. Zerkamy na zawartość rejestrów X i Y i widzimy, ile razy wykonała się pętla programu. Teraz, mnożąc ilość przebiegów przez ilość taktów pętli, otrzymujemy czas (ilość taktów), w którym musi zmieścić się nasz synchronizowany program. Program numer cztery służy tylko do sprawdzenia, ile czasu zyskujemy synchronizując się za pomocą drugiej metody, a nie pierwszej. Do etykiety TIME należy przypisać wartość licznika przebiegów pętli np. uzyskaną przy pomocy trzeciego programu. No to tyle. * PROGRAM NUMER 1 * przyklad braku * synchronizacji * z ANTIC'em opt 21 org $480 shape equ $e100 sprites equ $b800 rtclock equ 20 pmbase equ $d407 dmactl equ 559 gtictl equ 623 hposp0 equ 53248 pmcntl equ 53277 begin equ * ldy #0 tya bgn_1 equ * sta sprites+$200,y iny bpl bgn_1 lda #46 sta dmactl lda #1 sta gtictl lda >sprites sta pmbase lda #l24 sta hposp0 lda #3 sta pmcntl loop equ * jsr clr_spr jsr shw_spr jmp loop clr_spr equ * ldy #0 tya clsp_1 equ * sta sprites+$220,y iny cpy #$40 bcc clsp_1 rts shw_spr equ * ldx rtclock ldy #0 shsp_1 equ * lda shape,x sta sprites+$220,y inx iny cpy #$40 bcc shsp_1 rts opt 7 end * PROGRAM NUMER 2 * szukanie najniz- * szej linii ekranu opt 21 org $480 linia equ 112 vcount equ $d40b colbak equ $d01a loop equ * lda #linia cmp vcount bne *-3 lda #0a sta colbak jmp loop opt 7 end * PROGRAM NUMER 3 * Rozpoczęcie petli * "na dole" ekranu opt 21 org $480 dmactl equ 559 vcount equ $d40b colbak equ $d01a kbcode equ 764 begin equ * lda #33 sta dmactl lda #255 sta kbcode loop equ * lda #ll2 cmp vcount bne *-3 lda #10 sta colbak lda #l6 ldx #0 ldy #0 loo_1 equ * cmp vcount beg loo_2 iny bne loo_1 inx bne loo_1 loo_2 equ * lda kbcode cmp #$ff beg loop brk jmp loop opt 7 end * PROGRAM NUMER 4 * Rozpoczęcie petli * po zakonczeniu * przerwania VBI opt 21 org $480 time equ $340 dmactl equ 559 rtclock equ 20 colbak equ $d01a kbcode equ 764 begin equ * lda #33 sta dmactl lda #255 sta kbcode loop equ * lda rtclock cmp rtclock beq *-2 lda #$ff sta colbak lda #$ff ldx >time inx ldy <time iny loo_1 equ * cmp kbcode bne loo_2 dey bne loo_1 dex bne loo_1 lda #0 sta colbak jmp loop loo_2 equ * brk jmp loop opt 7 end Uwaga, uwaga, uwaga! Informacja dla wszystkich, którzy chcieliby brać udział w tworzeniu gier. Pragnę skompletować zespół ludzi zajmujących się tym profesjonalnie. Proszę o kontakt grafików, muzyków, programistów. Najchętniej widziane własne prace na kasetach lub dyskietkach (grafika, muzyka, programy) lub w przypadku grafików, którzy nie posiadają odpowiedniego oprogramowania, a "czują", że mogliby (mogłyby) podołać zadaniu stworzenia graficznej strony gry (animacja, tło, obrazki tytułowe, itp.) mogą to być odręczne prace na papierze. W wypadku zakwalifikowania do grupy każdy otrzyma odpowiednie oprogramowanie i udział w zyskach ze sprzedaży gry. Zgłoszenia proszę nadsyłać na adres redakcji z dopiskiem "De Jet". Uwaga, uwaga, uwaga! Ankieta z nagrodami. Zamieszczona na stronie 13 ankieta ma na celu podniesienie jakości gier trafiających na polski rynek, a tym samym spełnienie oczekiwań Graczy. Ankieta jest anonimowa, ale wśród osób, które podadzą swoje personalia rozlosowane zostanie 10 gier wyprodukowanych przez LK AVALON. Dodatkowo spośród osób, które nadeślą scenariusz gry, wybrany zostanie autor najlepszego i otrzyma on nagrodę pieniężną w wysokości 500.000 zł. Ankiety wysyłajcie na adres TA, zaznaczając na kopercie rodzaj przesyłki. A teraz, spójrzcie na następną stronę...
|