PDA

Просмотр полной версии : Сhanky-flame



Dart Alver
05.01.2018, 16:20
Мне тут вспомнился как-то эффект chanky-flame. Не то чтобы он мне нужен, просто любопытно. :v2_dizzy_roll:
В каком-то журнале читал статью от Steelzer/CRZ с эффектом в нижней трети экрана. Исходники правда были с обшипками, но не суть.
Cтало интересно, как сделать пламя на весь экран. И вот тут засада, медленно до ужаса )) Насколько смог поизвращался, рендом в таблицу вынес, методом тыка алгоритм покоцал, стало чуть быстрее, но все равно на пределе терпимости. ( Нет получалось и с нормальной скоростью и более-менее нормальным видом, но уже анимацией, кадров так 30-40 )
Интересует кто нибудь делал полноэкранное пламя, секреты не раскроете ? ;)



device zxspectrum128

; code by Dart Alver and previous code by (c) Steelzer/CRZ


Chn_Boof equ #C000 ; Здесь будет буфер чанкового изображения

CH_set equ #7800 ; Здесь будут данные изображения самих чанков

ORG #8000 ; Начало кода программы
START:

ld hl, #4000 ; очистка экрана
ld de, #4001
ld bc, 6144
ld (hl),l
ldir

ld (hl),#02 ; цвет экрана
ld bc,767
ldir


call Chanky_init ; создаём набор чанков для быстрого доступа

xor a ; чёрный бордюр
out (#fe),a

LD HL, Chn_Boof ;инициализация
LD DE, Chn_Boof+1 ;буфера
LD (HL),L ;буфер выбирается так что L=0
LD BC,3072
LDIR


FLAMESTART:
exx
ld de,#4000 ; экран
ld b,32
ld c,#F0
exx
FLAME:
LD HL, Chn_Boof+63 ;смещение вверх и вправо
.sm:
LD DE,Chn_Boof
LD BC,#0006 ;#600=1536

BEGIN:

ld a,(de)
cp (hl)
jp nz, 2F
1
xor a
2
add a,(hl)
rra

inc hl
add a,(hl)
rra
ld (de),a
inc de

ex af,af'

ld a,(de)
cp (hl)
jp nz, 2F
1
xor a
2
add a, (hl)
rra

inc hl
add a,(hl)
rra
ld (de),a
inc de

exx
and c
rrca : rrca : rrca: rrca
ld l,a
ex af,af'
and c
or l

LD L,A ;
LD H,#1E ; для получения старшего байта адреса чанков
ADD HL,HL ;
ADD HL,HL ;
LD A,(HL) ;
LD (DE),A ;
INC L ;
INC D ;
LD A,(HL) ;
LD (DE),A ;
INC L ;
INC D ;
LD A,(HL) ;
LD (DE),A ;
INC L ;
INC D ;
LD A,(HL) ;
LD (DE),A
dec d
dec d
dec d
1 inc e

djnz V1
ld b,32
ld a,4
add a,d
ld d,a
and 7
ld a,e
jp nz, .v
or a
jp z,V1
LD A,D
SUB 8
LD D,A
jp V1
ld a,e
.v sub b
ld e,a

V1
exx

djnz BEGIN
dec c
jp nz,BEGIN



ld de,Chn_Boof+3072

ld bc,64
ld hl,Random
.rndADDR EQU $-2
ldir
ld a,h
or a
jp nz,1F
ld hl,Random
1 ld (.rndADDR),hl


jp FLAMESTART





Chanky_init:
ld de,Chanky
ld ix, #7800
ld c,16
.loop1:
ld b,16
.loop2:
push bc
push ix
ld a,16
sub c
add a,a
add a,a
ld l,a
ld h,0
add hl, de

ld b,4
1
ld a,(hl)
and #f0
inc hl
ld (ix),a
inc ix
djnz 1B

pop ix
pop bc
push bc


ld a,16
sub b
add a,a
add a,a
ld l,a
ld h,0
add hl, de

ld b,4
2
ld a,(hl)
and #0f
inc hl
or (ix)
ld (ix),a
inc ix
djnz 2B

pop bc
djnz .loop2
dec c
jr nz,.loop1


LD DE,Random ; заполнялка RANDOM'ом из почти ПЗУ ;)
.RND ; от последовательности сильно зависит внешний вид
LD A,R
AND %00111111
LD H,A
LD A,R
LD L,A
LD A,R
XOR (HL)
rra
or l
or h
1 sub 7
LD (DE),A
INC HL
dec hl
INC DE
ld a,d
or a
jr nz,.RND

ret



Chanky: ; исходные коды для формирования набора чанков

db %00000000, %00000000,%00000000,%00000000 ;0
db %00000000, %00100010,%00000000,%00000000 ;1
db %00000000, %00100010,%00000000,%10001000 ;2
db %00000000, %00100010,%00000000,%10101010 ;3

db %00000000, %10101010,%00000000,%10101010 ;4
db %00010001, %10101010,%00000000,%10101010 ;5
db %01000100, %10101010,%00010001,%10101010 ;6
db %01010101, %10101010,%00010001,%10101010 ;7

db %01010101, %10101010,%01010101,%10101010 ;8
db %01010101, %11101110,%01010101,%10101010 ;9
db %01010101, %11101110,%01010101,%10111011 ;10
db %01010101, %10101110,%01110111,%10111011 ;11

db %01110111, %11101110,%01110111,%10111011 ;12
db %01110111, %11101110,%11111111,%10111011 ;13
db %01110111, %11101110,%11111111,%11111111 ;14
db %11111111, %11111111,%11111111,%11111111 ;15



Random EQU #C000+3072+128 ; здесь будет последовательность случайных чисел для формирования пламени

savesna "full_flame.sna",START ; создаём .sna файл

; LABELSLIST "C:/us0.38.2/user.l" ; раскомментить и прописать свой адрес для дебаггинга меток в Unreal Speccy



SNA файл (https://yadi.sk/d/sDHDkx6h3RDCht)
ASM файл (https://yadi.sk/d/LWZpL8rE3RDBoH)

Shiny
05.01.2018, 16:37
Если бы я и делал, то по-другому.

Dart Alver
05.01.2018, 16:45
Да и я понимаю что надо по другому, просто мысли кончились.

Shiny
05.01.2018, 16:55
Вывод чанок получится быстрее, если не обрабатывать как LLLLRRRR. Не помню, где подсмотрел, в GOA 4k или нет, но вышло так. Единственный "недостаток" - чанки выводится через строчку.

jerri
05.01.2018, 18:54
Dart Alver, быстро делается только атрибутное пламя
чанки вообще медленное явление

а так все просто
чем меньше обрабатываешь информации тем лучше

у чанок 4х4 64*48
у атрибутов 4х8 64*24
у атрибутов 8х8 32*24

тут надо определится что именно надо
скорость или чанки

Dart Alver
05.01.2018, 21:27
Dart Alver, быстро делается только атрибутное пламя
Х.з. атрибутное выглядит хуже. Можно конечно попробовать чанки 8x8, ну или только так :
Animate ASM+RND (https://yadi.sk/d/15Wg-pSg3RDYbH)
Animate SNA (https://yadi.sk/d/ggjpFbkn3RDXzZ)
Секунд 20 расчёт анимации, потом просмотр. Тут ещё есть моменты для оптимизации, да и вместо пропуска начальных кадров можно тупо сохранить состояние.

Shiny
05.01.2018, 22:25
длинный прекалк, да и видно, что дергаются фазы


LD A,(HL) ;
LD (DE),A ;
INC HL ;
INC D ;
LD A,(HL) ;


Если я правильно понял, то INC L быстрее чем INC HL. К тому же PUSH/POP медленно, лучше бы избавиться.

- - - Добавлено - - -


Можно конечно попробовать чанки 8x8, ну или только так :

Не решение, конечно, да и вышла засада: я готовил два буфера данных, при отрисовке сравнивал значения. Если данные совпадают, то не нужно рисовать повторно чанки.

Dart Alver
05.01.2018, 22:44
длинный прекалк, да и видно, что дергаются фазы
Ну подбиралось то методом тыка, так что да, есть, но все же лучше чем тормозилка.


Если я правильно понял, то INC L быстрее чем INC HL. К тому же PUSH/POP медленно, лучше бы избавиться.
Да я тут не оптимизировал это довольно старый код, можно менять на inc l, там проскочит, и вместо pash/pop dec d 3 раза.


я готовил два буфера данных, при отрисовке сравнивал значения. Если данные совпадают, то не нужно рисовать повторно чанки.
Я пробовал было два буфера в варианте с чанками без анимации - обслуга второго буфера съела больше времени чем экономия прорисовки.

NEO SPECTRUMAN
05.01.2018, 23:34
при отрисовке сравнивал значения. Если данные совпадают, то не нужно рисовать повторно чанки.
только при сравнении со вторым буфером
легко можно просрать весь выигрыш от пропуска

это прокатывает когда в чанках происходит минимальное количество изменений.

возможно это будет эффективно работать в каких нибудь 16с режимах
когда один отрисованный чанк на экране занимает достаточно много видеопамяти

но я так и не дошел для проверки этого...

Shiny
06.01.2018, 07:53
легко можно просрать весь выигрыш от пропуска

это прокатывает когда в чанках происходит минимальное количество изменений.

вроде как прокатило в двух эффектах при значениях 0-255

- - - Добавлено - - -

Другой вывод чанок. Наверное, быстрее.

Dart Alver
28.09.2025, 22:42
Подниму тему.

Чтото меня наткнулся на заброшенки, решил ещё поэкспериментить.
Когдато давно хотел Bloodwych поковырять, думал интру к нему с пламенем, скроллом текста ну и разумеется музыкой.

От нормального скролла текста пришлось отказаться, но атрибутный попытался впихнуть - подвесил на прерывание. Присобачил старую конверченную абы как музыку ))
Повозился... алгоритмы покоцал, чанки подправил. Полный экран не, а 2/3 кое-как нагнул.

Короче я сделаль :D правда только заготовку черновую :v2_dizzy_tired2:
В принципе даже понравилось, хотя хотелось бы пошустрее, а то иногда неясно огонь это или вода. )) Турбина пламя хорошо раздувает, а так безветрие однако ))

Снапка с сырцами в аттаче. Может кому пригодится, или кто улучшит чем...

Shiny
29.09.2025, 10:39
Я правильно понял - цвета задаются нибблами байта? Это медленно.

Dart Alver
29.09.2025, 19:52
Я правильно понял - цвета задаются нибблами байта? Это медленно.

Не понял вопроса ?
Цвета атрибутного скролла задаются установкой атрибутов по 7-ми правым атрибутным местам позиции текстового окна. (Считается что шрифт 5x6, 7-я линия только для тени)
Вначале сдвигаются атрибуты влево, а затем выставляются 7 правых.
Используются цвет фона, цвет тени, цвет для верхней части "пикселей", цвет для нижней части "пикселей". Естественно цвет фона совпадает с основным цветом окна костра.

Скроллинг на позицию тормозится задержкой, выводится каждый 4-й фрейм. Мне это показалось оптимально. Убрать задержку - хрен поймёшь что пролетает, только глаза на лоб лезут. ))

- - - Добавлено - - -

Или имеются в виду чанки ?
Ну так чанки они и есть 4 полубайта для экрана. Выводятся компилированными парами 256 штук по 4 байта. Вывод строки чанков : 1-й парный блок печатается сверху вниз, 2-й снизу вверх и так 16 раз. ( Хмм... Может попробовать ещё развернуть цикл для строки ? )

- - - Добавлено - - -

А градации чанков в буфере хранятся по байту на чанк, и глубина там при обработке буфера больше 16, а при выводе лишнее обрезается и подгоняется. Подгон под более-менее видимость пламени шёл научным тыком, поэтому алгоритм урезан и закостылен непонятным образом :D

Shiny
29.09.2025, 20:17
Да, имелись в виду чанки.
Я использовал другой способ
https://www.pouet.net/prod.php?which=85009

Dart Alver
29.09.2025, 22:15
Я использовал другой способ
https://www.pouet.net/prod.php?which=85009
В этом разобраться - мне долго голову чесать. :v2_conf2:
Что понял, так что используются 2х байтные чанки, все блоки из 2-х чанков (вроде-бы 2-х) формируются в процедуры вывода на 8 байт, адреса которых потом скидываются в буфер экрана, который исполняется через возврат стеком по ret.
Но вот как исполняется обработка буфера не понял. Схему с форматом чанка в %1xxxx000 тоже не уразумел.
У была мысль попробовать сделать вывод через ретурны (правда думалось по другому типу), но не сообразился с обработкой буфера, а держать два буфера, всё преимущество теряется. ))

Shiny
30.09.2025, 10:36
Чанки 4х4 тормозные вообще. Задорный эффект Fire тут:
http://g0blinish.ucoz.ru/demo/SF2cBMZ.rar

Dart Alver
01.10.2025, 00:56
Чанки 4х4 тормозные вообще.
Тормозные. Но прикольные же )) В принципе даже та скорость по мне не так уж и плохо смотрится, хоть и малость тормознуто.


Задорный эффект Fire тут:
http://g0blinish.ucoz.ru/demo/SF2cBMZ.rar
Бодренько. Красиво. Последний эффект типа 8 x сколькото-там в одном чанке. Наверно какой-то бензин горит.))

Чуть ещё поколдовал. Не причесывая, раскрыл ряд циклов, убрал несколько команд, попрыгал с бубном вокруг rnd. Вроде визуально стало быстрее. Меня устраивает такой костёр. Турбина на 7 Мгц в эмуле теперь уже кажется через-чур шустрой.

Shiny
01.10.2025, 08:28
Чуть ещё поколдовал. Не причесывая, раскрыл ряд циклов, убрал несколько команд, попрыгал с бубном вокруг rnd. Вроде визуально стало быстрее. Меня устраивает такой костёр. Турбина на 7 Мгц в эмуле теперь уже кажется через-чур шустрой.

С галерки негодуют, что нет .trd

Dart Alver
02.10.2025, 22:57
С галерки негодуют, что нет .trd
Так это ...

Когдато ДАВНО хотел Bloodwych поковырять
планы были -
https://pic.maxiol.com/thumbs2/1729889939.3557005051.fangameru.png (https://pic.maxiol.com/?v=1729889939.3557005051.fangameru.png&dp=2)
trd - не было. ))

Нашёл последнее что делал - прикручивал мыша к старому релизу , но до релиза не довёл что-то некогда была, а потом уже плюнул. Там даже заставки не было, ошибка в названии, вылет на новой игре (не сделал перечитку) ...
Возможно когда не сильно будет хотеться спать, может буду чтото ковырять, но это неточно, в сутках так мало времени и большую часть его хочется спать )) , а есть ведь и другие интересные мне вещи :D

Shiny
05.10.2025, 16:30
тогда trd для Virtual TR-DOS, а интрушку - для ААА.

Dart Alver
11.10.2025, 01:26
Последнее наверно причёсывание. Никаких оптимизаций, просто обработка. Код чуть-чуть в самораспаковку (архиватором не жал - не было такой цели), докинул trd -загрузчик, заменил картинку и музыку что использовал для отладки на гендерно гейминно-нейтральные (дабы успокоить неоправданные возбуждения), и вообще удалил готовые образы. Теперь это просто текстовый код для маленького интро эффекта.
Кто хочет, тот сам собирает .sna или .trd , меняет что и как ему что нужно, код, картинку, музыку (для примера 2 ухораздирающих в клочья недоделка есть :v2_dizzy_gamer: ) и пишет свои варианты текстов (ихтамнет), в общем я развлёкся, кому интересно может тоже поразвлекаться :v2_dizzy_coder:

Shiny
11.10.2025, 06:00
intro_flame.asm - Шрёдингер писал?

Dart Alver
11.10.2025, 09:51
intro_flame.asm - Шрёдингер писал?
Упс... :v2_confu: Нет конечно, Шрёдингер спектрумист разве ? Это был его кот ! Но он копирайтов не оставил и тут же спрятался в свою коробку и никто не знает жив он или нет :rolleyes:
Но я чуть поправил описание и ... , как выяснилось кодировку текста в ReadMe.txt на одинаковую с *.asm

Shiny
11.10.2025, 10:26
Другое дело(: На будущее : неплохо бы обзавестись исходниками плеерами музонов, чтобы не привязаться к конкретному адресу.