DoItYourself: Запилятор (Shinilbog)
_
Еще до Нового Года я не планировал создавать некоторые демы, но тут прибежал известный всем DenPopov с горячим желанием сделать НГ гифт.
Идея была простой - запустить анимацию и написать в бегущей строке поздравления.
Анимация уже была в запасе, состояла она из трех кадров:
_
Первый шаг - конверсия кадров. С задачей прекрасно справился новый пакет Img2Spectrum, на сконвертированных картинках остались только разные атрибуты и яркость. Это исправимо.
Дальше нужно было реализовать идею оптимизации кадров и написать программу на PureBasic.
В чем заключается алгоритм? Например, можно определить различия между двумя кадрами.
Первоначальный код выглядел так:
На выходе получился один файл 1.inc - сформированный для sjAsmplus исходный текст. Выглядело оно так:Код:ReadFile(0,"IMG00000.scr") *p1=AllocateMemory(6912) ReadData(0,*p1,6912) CloseFile(0) ReadFile(0,"IMG00001.scr") *p2=AllocateMemory(6912) ReadData(0,*p2,6912) CloseFile(0) CreateFile(1,"1.inc") For b=0 To 255 WriteStringN(1," ld a,"+Str(b)) For a=0 To 6911 c1=PeekA(*p1+a) c2=PeekA(*p2+a) If c1<>c2 And c2=b WriteStringN(1,"ld($"+Hex(a+$4000,#PB_Word)+"),a") EndIf Next a Next b WriteStringN(1," ret") loseFile(1)
Далее, похожую операцию можно проделать над кадрами 0-1, 1-2, 2-0. Почему 2-0? Чтобы зациклить анимацию.Код:ld a,0 ld($40F0),a ld($46CF),a ld($47CF),a ld($4845),a ... ld a,1 ld($48C3),a ld($48F4),a ld($4927),a ... ret
Код вызова был простым:
Значения f1-f3 повторены по 10 раз для удобства, кто-то из нас поленился сделать задержку для вывода экрана. В демо видно, как распределено время вызова:Код:ev1:ld a,0:inc a cp 30:jr nz,no_frame_loop xor a no_frame_loop: ld (ev1+1),a ld l,a,h,0 add hl,hl ld de,banks add hl,de ld a,(hl):inc hl:ld h,(hl),l,a ld (f0+1),hl f0: call $C000 ; где-то в тексте эта таблица: banks: dup 10 dw f1 edup dup 10 dw f2 edup dup 10 dw f3 edup
черный - отрисовка кадра;
синий - скроллер и музыка;
черный –остаток.
Остались еще мелочи, я засучил рукава и с помощью Paint переместил часть рисунка вниз, потому что атрибуты перекрашивались. Последние шаги были правка картинок после просмотра анимации (оригинальные кадры не приводятся, дабы поберечь чувства).
Возможные идеи по изменению алгоритма:
1. Провести сканирование не всего экрана подряд, а полинейно - возможно это позволит избежать сечения лучом;
2. Заменить значени ld a,0/ld a,1 на xor a/inc a - еще один потенциальный выигрыш
Похожий алгоритм применялся к инвитре CSP 2016.
Остается только пожелать читателям: работайте над демо, не зацикливайтесь на анимациях!
Комментарии
Трекбэков
Всего трекбэков 0
Ссылка трекбэка: