Важная информация
RSS лента

3aRulem Печатное слово

DoItYourself: Запилятор (Shinilbog)

Рейтинг: 4.38. Голосов: 8.
_
Еще до Нового Года я не планировал создавать некоторые демы, но тут прибежал известный всем DenPopov с горячим желанием сделать НГ гифт.

Идея была простой - запустить анимацию и написать в бегущей строке поздравления.

Анимация уже была в запасе, состояла она из трех кадров:
_


Первый шаг - конверсия кадров. С задачей прекрасно справился новый пакет Img2Spectrum, на сконвертированных картинках остались только разные атрибуты и яркость. Это исправимо.

Дальше нужно было реализовать идею оптимизации кадров и написать программу на PureBasic.

В чем заключается алгоритм? Например, можно определить различия между двумя кадрами.

Первоначальный код выглядел так:

Код:
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)
На выходе получился один файл 1.inc - сформированный для sjAsmplus исходный текст. Выглядело оно так:

Код:
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
Далее, похожую операцию можно проделать над кадрами 0-1, 1-2, 2-0. Почему 2-0? Чтобы зациклить анимацию.

Код вызова был простым:

Код:
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
Значения f1-f3 повторены по 10 раз для удобства, кто-то из нас поленился сделать задержку для вывода экрана. В демо видно, как распределено время вызова:

черный - отрисовка кадра;
синий - скроллер и музыка;
черный –остаток.

Остались еще мелочи, я засучил рукава и с помощью Paint переместил часть рисунка вниз, потому что атрибуты перекрашивались. Последние шаги были правка картинок после просмотра анимации (оригинальные кадры не приводятся, дабы поберечь чувства).

Возможные идеи по изменению алгоритма:
1. Провести сканирование не всего экрана подряд, а полинейно - возможно это позволит избежать сечения лучом;
2. Заменить значени ld a,0/ld a,1 на xor a/inc a - еще один потенциальный выигрыш

Похожий алгоритм применялся к инвитре CSP 2016.
Остается только пожелать читателям: работайте над демо, не зацикливайтесь на анимациях!

Миниатюры Миниатюры Нажмите на изображение для увеличения. 

Название:	image_doit.png 
Просмотров:	1963 
Размер:	13.3 Кб 
ID:	56805  

Обновлено 14.04.2016 в 18:51 BlastOff

Метки: #16, 3arulem, demoscene Добавить / редактировать метки
Категории
3aRulem #16

Комментарии

Трекбэков