Эффект пламени на Ассемблере
Эффект пламени на Ассемблере
Классический эффект горящего пламени используется в различных интро и демонстрашках еще со времен MS-DOS, а может быть и раньше. Алгоритм достаточно простой, но при этом выглядит очень красиво. Суть его заключается в следующем. Сперва создается палитра, в ней должны быть только оттенки белого, желтого, красного и черный цвет. Далее создается массив, который соответствует размеру изображения и содержит значения цветов его пикселов. По нижней строчке записываются в случайном порядке пикселы или пропуски, после этого по таймеру запускается основной цикл обработки.
Вот пример заполнения палитры. Меняя значения цветов, можно сделать, например, пламя в оттенках синего или извернуться еще как-нибудь.
Code (Assembler) : Убрать нумерацию
- ; Заполнить палитру
- mov edi,palette
- mov ecx,64
- @@:
- mov eax,64
- sub eax,ecx
- shl eax,2
- stosd
- loop @b
- mov ecx,64
- @@:
- mov eax,64
- sub eax,ecx
- shl eax,10
- mov al,0xFF
- stosd
- loop @b
- mov ecx,64
- @@:
- mov eax,64
- sub eax,ecx
- shl eax,10
- bswap eax
- mov ax,0xFFFF
- stosd
- loop @b
- mov ecx,65
- mov eax,0x00FFFFFF
- rep stosd
Code (Assembler) : Убрать нумерацию
- ; Заполнить нижнюю линию изображения
- stdcall WIRandom,1,(WINDOW_WIDTH-1)
- inc eax
- xor edx,edx
- mov ecx,WINDOW_WIDTH
- xchg eax,ecx
- div ecx
- mov ecx,eax
- mov esi,WINDOW_WIDTH*(WINDOW_HEIGHT-1)
- add esi,eax
- .loc_fill:
- stdcall WIRandom,1,100
- mov bl,255
- cmp eax,11
- jbe @f
- mov bl,0
- cmp eax,19
- jbe @f
- mov bl,[px_data-1+esi]
- cmp eax,59
- jbe @f
- mov bl,[px_data+1+esi]
- @@:
- mov [px_data+esi],bl
- inc esi
- inc ecx
- cmp ecx,(WINDOW_WIDTH-1)
- jb .loc_fill
- ; Смиксовать ближайшие точки
- mov esi,WINDOW_WIDTH*(WINDOW_HEIGHT-1)-1
- .loc_mix:
- movzx eax,byte [px_data+esi]
- add al,[px_data+esi+WINDOW_WIDTH]
- adc ah,0
- add al,[px_data+esi+WINDOW_WIDTH+1]
- adc ah,0
- add al,[px_data+esi+WINDOW_WIDTH-1]
- adc ah,0
- dec eax
- jns @f
- xor eax,eax
- @@:
- shr eax,2
- mov [px_data+esi],al
- dec esi
- jnz .loc_mix
Code (Assembler) : Убрать нумерацию
- invoke BeginPaint,[hwnddlg],ps
- mov [hDC],eax
- invoke CreateCompatibleDC,[hDC]
- mov [hCompDC],eax
- invoke CreateCompatibleBitmap,[hDC],WINDOW_WIDTH,WINDOW_HEIGHT
- mov [hBitmap],eax
- invoke SelectObject,[hCompDC],[hBitmap]
- mov [hOldBitmap],eax
- ; Перенести точки на холст
- mov esi,WINDOW_WIDTH*WINDOW_HEIGHT
- @@:
- movzx ebx,byte[px_data+esi]
- shl ebx,2
- xor edx,edx
- mov eax,esi
- mov ecx,WINDOW_WIDTH
- div ecx
- invoke SetPixel,[hCompDC],edx,eax,[palette+ebx]
- dec esi
- jnz @b
- invoke BitBlt,[hDC],0,0,WINDOW_WIDTH,WINDOW_HEIGHT-2,\
- [hCompDC],0,0,SRCCOPY
- ; Прибраться за собой
- invoke SelectObject,[hCompDC],[hOldBitmap]
- invoke DeleteObject,[hBitmap]
- invoke DeleteDC,[hCompDC]
- invoke EndPaint,[hwnddlg],ps
Code (Assembler) : Убрать нумерацию
- proc FireText
- locals
- hzCompDC dd ?
- hzBitmap dd ?
- hzDC dd ?
- zps PAINTSTRUCT
- endl
- ; Нанести надпись
- invoke CreateCompatibleDC,NULL
- mov [hzCompDC],eax
- invoke CreateCompatibleBitmap,[hzCompDC],WINDOW_WIDTH,WINDOW_HEIGHT
- mov [hzBitmap],eax
- invoke SelectObject,[hzCompDC],[hzBitmap]
- invoke FillRect,[hzCompDC],rc,0
- ; Шрифт
- invoke SelectObject,[hzCompDC],[hFont]
- invoke SetTextColor,[hzCompDC],0x0000FF00
- invoke DrawText,[hzCompDC],[pointer],-1,rc,\
- DT_VCENTER+DT_CENTER+DT_NOPREFIX+DT_SINGLELINE
- ; Перенести точки на холст
- mov esi,WINDOW_WIDTH*WINDOW_HEIGHT
- @@:
- xor edx,edx
- mov eax,esi
- mov ecx,WINDOW_WIDTH
- div ecx
- invoke GetPixel,[hzCompDC],edx,eax
- dec esi
- jz @f
- cmp eax,0x00
- jne @b
- mov byte[px_data+1+esi],255
- jmp @b
- @@:
- invoke DeleteObject,[hzBitmap]
- invoke DeleteDC,[hzCompDC]
- ret
- endp
Просмотров: 521 | Комментариев: 7
Метки: Assembler
Комментарии
Отзывы посетителей сайта о статье
CpuBench
(27.07.2024 в 23:10):
Эффект воды был, как горит огонь теперь есть, осталось сделать эффект как работают люди и можно смотреть вечно вместо ютуба.
ManHunter
(16.07.2024 в 22:05):
Никаких эффектов, только совокупность палитры из оттенков четырех базовых цветов и микс сопредельных точек. В результате и получается такое размытие.
Евгений
(16.07.2024 в 22:03):
С горящими буквами получилось интересно,такого не встречал, круто. Скажите на всю область пламени (кроме узкой полоски снизу) применён какой-то эффект размытия, пламя заблюрено, или мне кажется?
denis(ufa)
(16.07.2024 в 18:45):
Огонь! Плохо что очень ресурсо-затратно.
ManHunter
(16.07.2024 в 12:16):
Григорий, насколько я помню, это рипы из кейгенов, которые когда-то собирал Cyberdoom. А тут хорошо, что они собраны в одном месте. Спасибо.
Григорий
(16.07.2024 в 11:47):
Процессор норм так просаживает... :D Хотя может это только у меня так, на win 11
Кстати ManHunter вот куча забавных эффектов. Может вас заинтересует.
Ссылка https://github.com/Xyl2k/MASM3...ical-effects
Кстати ManHunter вот куча забавных эффектов. Может вас заинтересует.
Ссылка https://github.com/Xyl2k/MASM3...ical-effects
Grey
(16.07.2024 в 10:44):
Офигенно
Добавить комментарий
Заполните форму для добавления комментария