?? waveobject.asm
字號:
pushad
mov ebx,_lpWaveObject
assume ebx:ptr WAVE_OBJECT
;********************************************************************
; 計算范圍
;********************************************************************
mov edx,_dwSize
shr edx,1
mov eax,_dwX
mov esi,_dwY
mov ecx,eax
mov edi,esi
add eax,edx ; x + size
sub ecx,edx ; x - size
push edx
.if [ebx].dwFlag & F_WO_ELLIPSE
shr edx,1
.endif
add esi,edx ; y + size
sub edi,edx ; y - size
pop edx
shl edx,1
.if ! edx
inc edx
.endif
mov _dwSize,edx
;********************************************************************
; 判斷范圍的合法性
;********************************************************************
inc eax
cmp eax,[ebx].dwBmpWidth
jge _Ret
cmp ecx,1
jl _Ret
inc esi
cmp esi,[ebx].dwBmpHeight
jge _Ret
cmp edi,1
jl _Ret
dec eax
dec esi
;********************************************************************
; 將范圍內的點的能量置為 _dwWeight
;********************************************************************
mov @dwMaxX,eax
mov @dwMaxY,esi
.while ecx <= @dwMaxX
push edi
.while edi <= @dwMaxY
mov eax,ecx
sub eax,_dwX
imul eax
push eax
mov eax,edi
sub eax,_dwY
imul eax
pop edx
add eax,edx
push eax
mov eax,_dwSize
imul eax
pop edx
.if edx <= eax
mov eax,edi
mul [ebx].dwBmpWidth
add eax,ecx
shl eax,2
add eax,[ebx].lpWave1
push _dwWeight
pop [eax]
.endif
inc edi
.endw
pop edi
inc ecx
.endw
or [ebx].dwFlag,F_WO_ACTIVE
;********************************************************************
_Ret:
assume ebx:nothing
popad
ret
_WaveDropStone endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 計算擴散數據、渲染位圖、更新窗口、處理特效的定時器過程
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WaveTimerProc proc _hWnd,_uMsg,_idEvent,_dwTime
pushad
mov ebx,_idEvent
assume ebx:ptr WAVE_OBJECT
invoke _WaveSpread,ebx
invoke _WaveRender,ebx
.if [ebx].dwFlag & F_WO_NEED_UPDATE
invoke GetDC,[ebx].hWnd
invoke _WaveUpdateFrame,ebx,eax,FALSE
invoke ReleaseDC,[ebx].hWnd,eax
.endif
;********************************************************************
; 特效處理
;********************************************************************
test [ebx].dwFlag,F_WO_EFFECT
jz _Ret
mov eax,[ebx].dwEffectType
;********************************************************************
; Type = 1 雨點,Param1=速度(0最快,越大越慢),Param2=雨點大小,Param3=能量
;********************************************************************
.if eax == 1
mov eax,[ebx].dwEffectParam1
or eax,eax
jz @F
invoke _WaveRandom,ebx,eax
.if ! eax
@@:
mov eax,[ebx].dwBmpWidth
dec eax
dec eax
invoke _WaveRandom,ebx,eax
inc eax
mov ecx,eax
mov eax,[ebx].dwBmpHeight
dec eax
dec eax
invoke _WaveRandom,ebx,eax
inc eax
mov edx,eax
invoke _WaveRandom,ebx,[ebx].dwEffectParam2
inc eax
mov esi,eax
invoke _WaveRandom,ebx,[ebx].dwEffectParam3
add eax,50
invoke _WaveDropStone,ebx,ecx,edx,esi,eax
.endif
;********************************************************************
; Type = 2 行船,Param1=速度(0最快,越大越快),Param2=大小,Param3=能量
;********************************************************************
.elseif eax == 2
inc [ebx].dwEff2Flip
test [ebx].dwEff2Flip,1
jnz _Ret
mov ecx,[ebx].dwEff2X
mov edx,[ebx].dwEff2Y
add ecx,[ebx].dwEff2XAdd
add edx,[ebx].dwEff2YAdd
cmp ecx,1
jge @F
sub ecx,1
neg ecx
neg [ebx].dwEff2XAdd
@@:
cmp edx,1
jge @F
sub edx,1
neg edx
neg [ebx].dwEff2YAdd
@@:
mov eax,[ebx].dwBmpWidth
dec eax
cmp ecx,eax
jl @F
sub ecx,eax
xchg eax,ecx
sub ecx,eax
neg [ebx].dwEff2XAdd
@@:
mov eax,[ebx].dwBmpHeight
dec eax
cmp edx,eax
jl @F
sub edx,eax
xchg eax,edx
sub edx,eax
neg [ebx].dwEff2YAdd
@@:
mov [ebx].dwEff2X,ecx
mov [ebx].dwEff2Y,edx
invoke _WaveDropStone,ebx,ecx,edx,[ebx].dwEffectParam2,[ebx].dwEffectParam3
;********************************************************************
; Type = 3 波浪,Param1=密度,Param2=大小,Param3=能量
;********************************************************************
.elseif eax == 3
xor edi,edi
.while edi <= [ebx].dwEffectParam1
mov eax,[ebx].dwBmpWidth
dec eax
dec eax
invoke _WaveRandom,ebx,eax
inc eax
mov ecx,eax
mov eax,[ebx].dwBmpHeight
dec eax
dec eax
invoke _WaveRandom,ebx,eax
inc eax
mov edx,eax
invoke _WaveRandom,ebx,[ebx].dwEffectParam2
inc eax
mov esi,eax
invoke _WaveRandom,ebx,[ebx].dwEffectParam3
invoke _WaveDropStone,ebx,ecx,edx,esi,eax
inc edi
.endw
.endif
_Ret:
assume ebx:nothing
popad
ret
_WaveTimerProc endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 釋放對象
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WaveFree proc _lpWaveObject
pushad
mov ebx,_lpWaveObject
assume ebx:ptr WAVE_OBJECT
;********************************************************************
.if [ebx].hDcRender
invoke DeleteDC,[ebx].hDcRender
.endif
.if [ebx].hBmpRender
invoke DeleteObject,[ebx].hBmpRender
.endif
.if [ebx].lpDIBitsSource
invoke GlobalFree,[ebx].lpDIBitsSource
.endif
.if [ebx].lpDIBitsRender
invoke GlobalFree,[ebx].lpDIBitsRender
.endif
.if [ebx].lpWave1
invoke GlobalFree,[ebx].lpWave1
.endif
.if [ebx].lpWave2
invoke GlobalFree,[ebx].lpWave2
.endif
invoke KillTimer,[ebx].hWnd,ebx
invoke RtlZeroMemory,ebx,sizeof WAVE_OBJECT
;********************************************************************
assume ebx:nothing
popad
ret
_WaveFree endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 初始化對象
; 參數:_lpWaveObject = 指向 WAVE_OBJECT的指針
; 返回:eax = 0 成功、= 1 失敗
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WaveInit proc _lpWaveObject,_hWnd,_hBmp,_dwSpeed,_dwType
local @stBmp:BITMAP,@dwReturn
pushad
xor eax,eax
mov @dwReturn,eax
mov ebx,_lpWaveObject
assume ebx:ptr WAVE_OBJECT
invoke RtlZeroMemory,ebx,sizeof WAVE_OBJECT
.if _dwType
or [ebx].dwFlag,F_WO_ELLIPSE
.endif
;********************************************************************
; 獲取位圖尺寸
;********************************************************************
push _hWnd
pop [ebx].hWnd
invoke GetTickCount
mov [ebx].dwRandom,eax
invoke GetObject,_hBmp,sizeof BITMAP,addr @stBmp
.if ! eax
@@:
inc @dwReturn
jmp _Ret
.endif
mov eax,@stBmp.bmHeight
mov [ebx].dwBmpHeight,eax
cmp eax,3
jle @B
mov eax,@stBmp.bmWidth
mov [ebx].dwBmpWidth,eax
cmp eax,3
jle @B
push eax
shl eax,2
mov [ebx].dwWaveByteWidth,eax
pop eax
lea eax,[eax+eax*2]
add eax,3
and eax,not 0011b
mov [ebx].dwDIByteWidth,eax
;********************************************************************
; 創建用于渲染的位圖
;********************************************************************
invoke GetDC,_hWnd
mov esi,eax
invoke CreateCompatibleDC,esi
mov [ebx].hDcRender,eax
invoke CreateCompatibleBitmap,esi,[ebx].dwBmpWidth,[ebx].dwBmpHeight
mov [ebx].hBmpRender,eax
invoke SelectObject,[ebx].hDcRender,eax
;********************************************************************
; 分配波能緩沖區
;********************************************************************
mov eax,[ebx].dwWaveByteWidth
mul [ebx].dwBmpHeight
mov edi,eax
invoke GlobalAlloc,GPTR,edi
mov [ebx].lpWave1,eax
invoke GlobalAlloc,GPTR,edi
mov [ebx].lpWave2,eax
;********************************************************************
; 分配像素緩沖區
;********************************************************************
mov eax,[ebx].dwDIByteWidth
mul [ebx].dwBmpHeight
mov edi,eax
invoke GlobalAlloc,GPTR,edi
mov [ebx].lpDIBitsSource,eax
invoke GlobalAlloc,GPTR,edi
mov [ebx].lpDIBitsRender,eax
;********************************************************************
; 獲取原始像素數據
;********************************************************************
mov [ebx].stBmpInfo.bmiHeader.biSize,sizeof BITMAPINFOHEADER
push [ebx].dwBmpWidth
pop [ebx].stBmpInfo.bmiHeader.biWidth
mov eax,[ebx].dwBmpHeight
neg eax
mov [ebx].stBmpInfo.bmiHeader.biHeight,eax
inc [ebx].stBmpInfo.bmiHeader.biPlanes
mov [ebx].stBmpInfo.bmiHeader.biBitCount,24
mov [ebx].stBmpInfo.bmiHeader.biCompression,BI_RGB
mov [ebx].stBmpInfo.bmiHeader.biSizeImage,0
invoke CreateCompatibleDC,esi
push eax
invoke SelectObject,eax,_hBmp
invoke ReleaseDC,_hWnd,esi
pop eax
mov esi,eax
invoke GetDIBits,esi,_hBmp,0,[ebx].dwBmpHeight,[ebx].lpDIBitsSource,\
addr [ebx].stBmpInfo,DIB_RGB_COLORS
invoke GetDIBits,esi,_hBmp,0,[ebx].dwBmpHeight,[ebx].lpDIBitsRender,\
addr [ebx].stBmpInfo,DIB_RGB_COLORS
invoke DeleteDC,esi
.if ![ebx].lpWave1 || ![ebx].lpWave2 || ![ebx].lpDIBitsSource ||\
![ebx].lpDIBitsRender || ![ebx].hDcRender
invoke _WaveFree,ebx
inc @dwReturn
.endif
invoke SetTimer,_hWnd,ebx,_dwSpeed,addr _WaveTimerProc
or [ebx].dwFlag,F_WO_ACTIVE or F_WO_NEED_UPDATE
invoke _WaveRender,ebx
invoke GetDC,[ebx].hWnd
invoke _WaveUpdateFrame,ebx,eax,TRUE
invoke ReleaseDC,[ebx].hWnd,eax
;********************************************************************
_Ret:
assume ebx:nothing
popad
mov eax,@dwReturn
ret
_WaveInit endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; 一些特效
; 輸入:_dwType = 0 關閉特效
; _dwType <> 0 開啟特效,參數具體見上面
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_WaveEffect proc uses ebx eax _lpWaveObject,\
_dwType,_dwParam1,_dwParam2,_dwParam3
local @dwMaxX,@dwMaxY
mov ebx,_lpWaveObject
assume ebx:ptr WAVE_OBJECT
;********************************************************************
mov eax,_dwType
.if eax == 0
;********************************************************************
; 關閉特效
;********************************************************************
and [ebx].dwFlag,not F_WO_EFFECT
mov [ebx].dwEffectType,eax
.elseif eax == 2
;********************************************************************
; 行船特效
;********************************************************************
mov eax,_dwParam1
mov [ebx].dwEff2XAdd,eax
mov [ebx].dwEff2YAdd,eax
mov eax,[ebx].dwBmpWidth
dec eax
dec eax
invoke _WaveRandom,ebx,eax
inc eax
mov [ebx].dwEff2X,eax
mov eax,[ebx].dwBmpHeight
dec eax
dec eax
invoke _WaveRandom,ebx,eax
inc eax
mov [ebx].dwEff2Y,eax
jmp @F
.else
;********************************************************************
; 默認
;********************************************************************
@@:
push _dwType
pop [ebx].dwEffectType
push _dwParam1
pop [ebx].dwEffectParam1
push _dwParam2
pop [ebx].dwEffectParam2
push _dwParam3
pop [ebx].dwEffectParam3
or [ebx].dwFlag,F_WO_EFFECT
.endif
;********************************************************************
assume ebx:nothing
ret
_WaveEffect endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;
;
;
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
endif
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -