Эффект пламени

Тема в разделе "WASM.X64", создана пользователем Mikl___, 19 дек 2016.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.741
    Пламя поднимается снизу экрана и постепенно гаснет. Формула:
    Код (C):
    1.     buffer[x][y+1]=(screen[x-1][y+1]+screen[x-1][y]+
    2.                     screen[x-1][y-1]+screen[x][y+1]+
    3.                     screen[x][y-1]+screen[x+1][y+1]+
    4.                     screen[x+1][y]+screen[x+1][y-1])/8;
    Для того, чтобы пламя красиво гасло, установим палитру так:
    Номер цвета:0[​IMG]64[​IMG] 128[​IMG]192[​IMG]255
    Цвет:черныйкрасный желтыйярко-желтыйбелый
    Пример:
    Код (C):
    1. for(short k=0;k<=63;k++)
    2.   {
    3.     setrgbpalette(k,k,0,0);
    4.     setrgbpalette(k+64,63,k,0);
    5.     setrgbpalette(k+128,63,63,k);
    6.     setrgbpalette(k+192,63,63,63);
    7.   }
    Если вам кажется, что пламя слишком медленно гаснет, то формулу можно переписать вот так:
    Код (C):
    1.     short color=(screen[x-1][y+1]+screen[x-1][y]+
    2.                  screen[x-1][y-1]+screen[x][y+1]+
    3.                  screen[x][y-1]+screen[x+1][y+1]+
    4.                  screen[x+1][y]+screen[x+1][y-1])/8;
    5.     if(color>number) color-=number; else color=0;
    6.     buffer[x][y+1]=color;
    Значение number выберите по своему вкусу, чем оно больше, тем быстрее будет гаснуть пламя. Да, и самое главное, чтобы пламя "горело", его надо постоянно "подпитывать": в самую нижнюю строчку в начале каждого кадра записывать пиксели со случайным цветом. Добавится вот такая строка:
    Код (C):
    1. for(x=0;x<320;x+=4)
    2.   {
    3.     char color=rand()%256;
    4.     screen[x][199]=c;
    5.     screen[x+1][199]=c;
    6.     screen[x+2][199]=c;
    7.     screen[x+3][199]=c;
    8.   }
    Забивая сразу четыре пикселя случайным цветом, мы получаем более красивое пламя. Естественно, эту и несколько следующих строк на экран мы не выводим. Почему? Догадайтесь сами!Опять же, для ускорения можно использовать вариант блюра с четырьмя усредняемыми пикселями, немного его изменив:
    Код (C):
    1.   screen[x][y]=(screen[x-1][y-1]+screen[x][y-1]+
    2.                 screen[x][y-1]+screen[x+1][y-2])/4;
    Вот еще одна быстрая формула:
    Код (C):
    1. for(short y=0;y<197;y+=2)
    2.   for(short x=1;x<319;x++)
    3.   {
    4.     short high=screen[x-1][y-2]+screen[x][y-2]+screen[x+1][y-2];
    5.     char low=screen[x][y-4];
    6.     char pixel=(high+low)/4;
    7.     screen[x][y]=pixel;
    8.     screen[x][y-1]=(pixel+low)/2
    9.   }
    Взято на http://democoder.ru/article/5, текст программы немного переделан
    исходный текст и ехе-файл здесь
    [​IMG]
     
    Последнее редактирование: 19 дек 2016
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.741
    Код (ASM):
    1. include win64a.inc
    2. include gdi32.inc
    3. includelib gdi32.lib
    4. IMAGE_BASE equ 400000h
    5. cdIdTimer equ 1
    6. PALETTE STRUCT
    7.         blue BYTE ?
    8.         green BYTE ?
    9. red BYTE ?
    10. alpha BYTE ?
    11. PALETTE ENDS
    12. .code
    13. Random proc
    14. push rbx
    15. push rcx
    16. push rdx
    17. mov ebx, eax
    18. mov eax, vdSeed
    19. xor edx, edx
    20. mov ecx,127773
    21. div ecx
    22. mov ecx, eax
    23. mov eax,16807
    24. mul edx
    25. mov edx, ecx
    26. mov ecx, eax
    27. mov eax,2836
    28. mul edx
    29. sub ecx, eax
    30. xor edx, edx
    31. mov eax, ecx
    32. mov vdSeed, ecx
    33. div ebx;base
    34. mov eax, edx
    35. pop rdx
    36. pop rcx
    37. pop rbx
    38. retn
    39. Random endp
    40. Llamas proc
    41. mov rax, cdYSize
    42. dec eax
    43. mul cdXSize
    44. dec eax
    45. add rax, qword_4030A0
    46. mov ebx, eax
    47. xor ecx,ecx
    48. loc_401055: mov rsi, cdXSize
    49. cmp ecx, dword_4030C0
    50. ja @BLlamas
    51. inc ecx
    52. @BLlamas: xor eax,eax
    53. mov al, [rbx]
    54. push rbx
    55. push rcx
    56. @@: add rbx, cdXSize
    57. add al, [rbx]
    58. adc ah, 0
    59. add al, [rbx+1]
    60. adc ah, 0
    61. add al, [rbx-1]
    62. adc ah, 0
    63. loop @b
    64. pop rcx
    65. pop rbx
    66. sub eax, 2
    67. jns @f
    68. xor eax, eax
    69. @@: mov edi, eax
    70. mov eax, 3
    71. mul ecx
    72. inc eax
    73. xchg eax, edi
    74. div edi
    75. mov [rbx], al
    76. dec ebx
    77. cmp rbx, qword_4030A0
    78. jz @f
    79. dec esi
    80. jz loc_401055
    81. jmp @BLlamas
    82. @@: retn
    83. Llamas endp
    84. setBottomLine proc
    85. mov eax,cdXXSize
    86. call Random
    87. inc eax
    88. mov rcx,cdXSize
    89. xchg eax, ecx
    90. xor edx,edx
    91. div ecx
    92. mov ecx, eax
    93. mov rsi,cdYSize
    94. dec esi
    95. imul rsi,cdXSize
    96. add esi,ecx
    97. add rsi,qword_4030A0
    98. @BucleBottom: mov eax,100
    99. call Random
    100. cmp eax,11
    101. jbe loc_4010FD
    102. cmp eax,19
    103. jbe loc_401101
    104. cmp eax,59
    105. jbe loc_401105
    106. mov bl,[rsi+1]
    107. jmp @BBFin
    108. loc_4010FD: mov bl,0FFh
    109. jmp @BBFin
    110. loc_401101: mov bl,0
    111. jmp @BBFin
    112. loc_401105: mov bl,[rsi-1]
    113. @BBFin: mov [rsi],bl
    114. inc esi
    115. inc ecx
    116. cmp rcx,cdXSize
    117. jb @BucleBottom
    118. retn
    119. setBottomLine endp
    120. proc_3 proc
    121. push rbp
    122. mov ebp, esp
    123. sub esp,20h
    124. mov rdx,cdXSize
    125. imul rdx,cdYSize          ; dwBytes
    126. mov ecx,42h ; uFlags
    127. call GlobalAlloc
    128. mov hMem,rax
    129. mov ecx,eax ; hMem
    130. call GlobalLock
    131. mov qword_4030A0,rax
    132. leave
    133. retn
    134. proc_3 endp
    135. CreaPaleta proc
    136. mov ecx,4*3Fh
    137. @@: mov miPaleta.red[rcx], cl
    138. mov miPaleta.green[rcx], 0
    139. mov miPaleta.blue[rcx], 0
    140. mov miPaleta.alpha[rcx], 0
    141. mov miPaleta.red[rcx+100h], 0FFh
    142. mov miPaleta.green[rcx+100h], cl
    143. mov miPaleta.blue[rcx+100h], 0
    144. mov miPaleta.alpha[rcx+100h], 0
    145. mov miPaleta.red[rcx+200h], 0FFh
    146. mov miPaleta.green[rcx+200h], 0FFh
    147. mov miPaleta.blue[rcx+200h], cl
    148. mov miPaleta.alpha[rcx+200h], 0
    149.                 mov dword ptr miPaleta[rcx+300h],0FFFFFFh
    150. sub ecx, 4
    151. jns @b
    152. retn
    153. CreaPaleta endp
    154. DrawPixel proc
    155. push rbx
    156. push rcx
    157. push rdx
    158. push rdi
    159. mov rcx,cdXSize
    160. imul rcx,cdYSize
    161. mov edi, pDIBFire
    162. mov rsi,qword_4030A0
    163. @@: movzx ebx,byte ptr [rsi]
    164. mov eax,dword ptr miPaleta[rbx*4]
    165. stosd
    166. inc esi
    167. loop @b
    168. pop rdi
    169. pop rdx
    170. pop rcx
    171. pop rbx
    172. retn
    173. DrawPixel endp
    174. WndProc proc hWnd:QWORD,Msg:QWORD,wParam:QWORD,lParam:QWORD
    175. local ps:PAINTSTRUCT
    176. push rbp
    177. mov ebp, esp
    178. sub esp,(50h+sizeof PAINTSTRUCT+15)and(-16)
    179. mov hWnd,rcx
    180. mov wParam,r8
    181. mov lParam,r9
    182. cmp edx, WM_DESTROY
    183. jz wmDESTROY
    184.                 cmp edx, WM_PAINT
    185. jz wmPAINT
    186.                 cmp edx, WM_SIZE
    187. jz wmSIZE
    188.                 cmp edx, WM_TIMER
    189. jz wmTIMER
    190. leave
    191.                 jmp DefWindowProc
    192. ; ---------------------------------------------------------------------------
    193. wmDESTROY:: mov ecx,1 ; bShow
    194. call ShowCursor
    195. mov rdx,hOldBmp ; h
    196. mov rcx,bufDIBDC ; hdc
    197. call SelectObject
    198. mov rcx,bufDIBDC ; hdc
    199. call DeleteDC
    200. mov rcx,hDIBFire ; ho
    201. call DeleteObject
    202. mov rcx,qword_4030A0 ; hMem
    203. call GlobalUnlock
    204. mov rcx,hMem ; hMem
    205. call GlobalFree
    206. mov rcx,hWnd
    207. call DestroyWindow
    208. xor ecx,ecx ; nExitCode
    209. call ExitProcess
    210. ; ---------------------------------------------------------------------------
    211. wmSIZE:         cmp wParam, 2
    212. jnz wmBYE
    213. xor ecx,ecx ; bShow
    214. call ShowCursor
    215. movzx eax,word ptr lParam
    216. mov cdXSize,rax
    217. mov BitmapInfo.bmiHeader.biWidth, eax
    218. shr eax, 1
    219. mov dword_4030B4, eax
    220. movzx eax,word ptr lParam+2
    221. mov cdYSize,rax
    222. mov BitmapInfo.bmiHeader.biHeight, eax
    223. neg BitmapInfo.bmiHeader.biHeight
    224. shr eax, 1
    225. mov dword_4030B8, eax
    226. mov ebx,100
    227. xor edx, edx
    228. div ebx
    229. mov dword_4030C0, eax
    230. mov rax,cdXSize
    231. mov cdXXSize,eax
    232. sub cdXXSize, 14h
    233. call GetTickCount
    234. mov vdSeed, eax
    235. mov rcx,hWnd
    236. call GetDC
    237. mov hdc,rax
    238. mov ecx,eax; hdc
    239. call CreateCompatibleDC
    240. mov bufDIBDC,rax
    241.                 xor r8d,r8d ;DIB_RGB_COLORS=0
    242. mov [rsp+28h],r8; offset
    243. mov [rsp+20h],r8; hSection
    244. mov r9d,offset pDIBFire ; ppvBits
    245. mov edx,offset BitmapInfo ; lpbmi
    246. mov rcx,hdc ; hdc
    247. call CreateDIBSection
    248. mov hDIBFire,rax
    249. mov edx,eax ; h
    250. mov rcx,bufDIBDC ; hdc
    251. call SelectObject
    252. mov hOldBmp,rax
    253. mov rdx,hdc ; hDC
    254. mov rcx,hWnd
    255. call ReleaseDC
    256. call CreaPaleta
    257. call proc_3
    258. call setBottomLine
    259. call Llamas
    260. mov flag, 0
    261. xor r9d,r9d ; lpTimerFunc
    262. mov r8d,40 ; uElapse
    263. mov edx,cdIdTimer ; nIDEvent
    264. mov rcx,hWnd
    265. call SetTimer
    266. jmp wmBYE
    267. ; ---------------------------------------------------------------------------
    268. wmTIMER:        cmp flag, 1
    269. jnz wmBYE
    270. mov flag, 0
    271. call setBottomLine
    272. call Llamas
    273. xor r8d,r8d ; bErase
    274. xor edx,edx ; lpRect
    275. mov rcx,hWnd
    276. call InvalidateRect
    277. jmp wmBYE
    278. ; ---------------------------------------------------------------------------
    279. wmPAINT:        lea edx,ps
    280. mov rcx,hWnd
    281. call BeginPaint
    282. mov hdc,rax
    283. call DrawPixel
    284. mov qword ptr [rsp+40h],SRCCOPY; rop
    285.                 xor edx,edx ; x
    286. mov [rsp+38h],rdx ; y1
    287. mov [rsp+30h],rdx ; x1
    288. mov rax,bufDIBDC ; hdcSrc
    289.                 mov [rsp+28h],rax
    290. mov rax,cdYSize
    291. mov [rsp+20h],rax
    292. mov r9,cdXSize ; cx
    293. xor r8d,r8d ; cy
    294. mov rcx,hdc ; hdc
    295. call BitBlt
    296. lea edx,ps
    297. mov rcx,hWnd
    298. call EndPaint
    299. mov flag, 1
    300. wmBYE: leave
    301. retn
    302. WndProc endp
    303. WinMain proc
    304. local msg:MSG
    305. push rbp
    306. mov ebp, esp
    307. sub esp,sizeof MSG
    308. xor ebx,ebx
    309. mov esi,IMAGE_BASE
    310. mov edi,offset ClassName ; "DesktopEnWnd"
    311. push rbx ;hIconSm
    312. push rdi ;lpszClassName
    313. push rbx ;lpszMenuName
    314. push COLOR_WINDOWTEXT; hbrBackground
    315. push rbx ;hCursor
    316. push rbx         ;hIcon
    317. push rsi ;hInstance
    318. push rbx         ;cbClsExtra & cbWndExtra
    319. db 68h
    320. dd WndProc       ;lpfnWndProc
    321. push sizeof WNDCLASSEX ;cbSize & style
    322. mov ecx,esp ;addr WNDCLASSEX
    323. call RegisterClassEx
    324. push rbx
    325. push rsi ;rsi=400000h
    326. push rbx
    327. push rbx
    328. push rbx
    329. push rbx
    330. push rbx
    331. push rbx
    332. mov r9d,WS_VISIBLE
    333. mov r8,rdi ;offset ClassName
    334. mov edx,edi ;offset ClassName
    335. xor ecx,ecx
    336. sub esp,20h ; dwExStyle
    337. call CreateWindowEx
    338. mov edx,SW_MAXIMIZE ; nCmdShow
    339. mov ecx,eax ; hWnd
    340. call ShowWindow
    341. @@:     lea ecx,msg
    342. xor edx,edx
    343. xor r8d,r8d
    344. xor r9d,r9d
    345. call GetMessage
    346. cmp msg.wParam,VK_ESCAPE;user press 'Esc'?
    347. je wmDESTROY
    348. lea ecx,msg
    349. call DispatchMessage
    350. jmp @b
    351. WinMain endp
    352. .data
    353. ClassName db 'DesktopEnWnd',0
    354. BitmapInfo BITMAPINFO <<28h,14Ah,0FFFFFF2Eh,1,20h,0,0,0,0,0,0>,<0>>
    355. hdc dq ?
    356. hMem dq ?
    357. qword_4030A0 dq ?
    358. dword_4030A4 dd ?
    359. cdXSize dq ?
    360. cdYSize dq ?
    361. cdXXSize dd ?
    362. dword_4030B4 dd ?
    363. dword_4030B8 dd ?
    364. dword_4030C0 dd ?
    365. flag db ?
    366. vdSeed dd ?
    367. bufDIBDC dq ?
    368. pDIBFire dd ?
    369. hDIBFire dq ?
    370. hOldBmp dq ?
    371. miPaleta PALETTE 100h dup (<>)
    372. end
     

    Вложения:

    • flame.png
      flame.png
      Размер файла:
      204,3 КБ
      Просмотров:
      1.144
    • WinFirex64.zip
      Размер файла:
      4,6 КБ
      Просмотров:
      544