📄 lover.asm
字号:
; 创建要用到的 DC 和位图
;********************************************************************
invoke GetDC,hWinMain
mov @hDc,eax
invoke CreateCompatibleDC,@hDc
mov hDcGround,eax
invoke CreateCompatibleDC,@hDc
mov hDcGroundMask,eax
invoke CreateCompatibleDC,@hDc
mov hDcMoon,eax
invoke CreateCompatibleDC,@hDc
mov hDcMoonMask,eax
invoke CreateCompatibleDC,@hDc
mov hDcPig,eax
invoke CreateCompatibleDC,@hDc
mov hDcPigMask,eax
invoke LoadBitmap,hInstance,BMP_GROUND
mov hBmpGround,eax
invoke LoadBitmap,hInstance,BMP_MOON
mov hBmpMoon,eax
invoke LoadBitmap,hInstance,BMP_PIG
mov hBmpPig,eax
;********************************************************************
; 将位图连接到 DC
;********************************************************************
invoke SelectObject,hDcGround,hBmpGround
invoke SelectObject,hDcMoon,hBmpMoon
invoke SelectObject,hDcPig,hBmpPig
;********************************************************************
; 获取位图的宽度和高度备用
;********************************************************************
invoke GetObject,hBmpGround,sizeof BITMAP,addr @stBmp
push @stBmp.bmWidth
pop dwGroundWidth
push @stBmp.bmHeight
pop dwGroundHeight
invoke GetObject,hBmpPig,sizeof BITMAP,addr @stBmp
push @stBmp.bmWidth
pop dwPigWidth
push @stBmp.bmHeight
pop dwPigHeight
invoke GetObject,hBmpMoon,sizeof BITMAP,addr @stBmp
push @stBmp.bmWidth
pop dwMoonWidth
push @stBmp.bmHeight
pop dwMoonHeight
;********************************************************************
; 建立猪图象的 Mask
;********************************************************************
invoke CreateCompatibleBitmap,@hDc,dwPigWidth,dwPigHeight
mov hBmpPigMask,eax
invoke SelectObject,hDcPigMask,eax
invoke BitBlt,hDcPigMask,0,0,dwPigWidth,dwPigHeight,\
hDcPig,0,0,SRCCOPY
invoke _CreateMask,hDcPigMask,dwPigWidth,dwPigHeight
invoke BitBlt,hDcPig,0,0,dwPigWidth,dwPigHeight,\
hDcPigMask,0,0,SRCAND
invoke BitBlt,hDcPigMask,0,0,dwPigWidth,dwPigHeight,\
hDcPigMask,0,0,DSTINVERT
;********************************************************************
; 建立月亮图象的 Mask
;********************************************************************
invoke CreateCompatibleBitmap,@hDc,dwMoonWidth,dwMoonHeight
mov hBmpMoonMask,eax
invoke SelectObject,hDcMoonMask,eax
invoke BitBlt,hDcMoonMask,0,0,dwMoonWidth,dwMoonHeight,\
hDcMoon,0,0,SRCCOPY
invoke _CreateMask,hDcMoonMask,dwMoonWidth,dwMoonHeight
invoke BitBlt,hDcMoon,0,0,dwMoonWidth,dwMoonHeight,\
hDcMoonMask,0,0,SRCAND
invoke BitBlt,hDcMoonMask,0,0,dwMoonWidth,dwMoonHeight,\
hDcMoonMask,0,0,DSTINVERT
;********************************************************************
; 建立草地图象的 Mask
;********************************************************************
invoke CreateCompatibleBitmap,@hDc,dwGroundWidth,dwGroundHeight
mov hBmpGroundMask,eax
invoke SelectObject,hDcGroundMask,eax
invoke BitBlt,hDcGroundMask,0,0,dwGroundWidth,dwGroundHeight,\
hDcGround,0,0,SRCCOPY
invoke _CreateMask,hDcGroundMask,dwGroundWidth,dwGroundHeight
invoke BitBlt,hDcGround,0,0,dwGroundWidth,dwGroundHeight,\
hDcGroundMask,0,0,SRCAND
invoke BitBlt,hDcGroundMask,0,0,dwGroundWidth,dwGroundHeight,\
hDcGroundMask,0,0,DSTINVERT
;********************************************************************
invoke ReleaseDC,hWinMain,@hDc
call _InitValue
call _CreatePic
invoke SetTimer,hWinMain,TIMER_MOON,100,NULL
ret
_Init endp
;********************************************************************
_InitValue proc
local @stRect:RECT
local @hBmpTmp,@hDcTmp,@dwX,@dwY,@dwWidth,@dwHeight
local @stBmp:BITMAP
;********************************************************************
; 取屏幕尺寸
;********************************************************************
invoke GetClientRect,hWinMain,addr @stRect
mov eax,@stRect.right
sub eax,@stRect.left
mov dwWidth,eax
mov eax,@stRect.bottom
sub eax,@stRect.top
mov dwHeight,eax
;********************************************************************
; 创建背景和图片的位图和 DC
;********************************************************************
invoke GetDC,hWinMain
mov @hDcTmp,eax
invoke CreateCompatibleDC,@hDcTmp
mov hDcBack,eax
invoke CreateCompatibleDC,@hDcTmp
mov hDcPicture,eax
invoke CreateCompatibleBitmap,@hDcTmp,dwWidth,dwHeight
mov hBmpBack,eax
invoke CreateCompatibleBitmap,@hDcTmp,dwWidth,dwHeight
mov hBmpPicture,eax
invoke ReleaseDC,hWinMain,@hDcTmp
invoke SelectObject,hDcBack,hBmpBack
invoke SelectObject,hDcPicture,hBmpPicture
;********************************************************************
; 猪、草地的(Y)坐标
;********************************************************************
mov eax,dwHeight
sub eax,dwGroundHeight
mov dwGroundOffsetY,eax
add eax,DW_PIG_ADJY
sub eax,dwPigHeight
mov dwPigOffsetY,eax
;********************************************************************
; 把背景填黑色
;********************************************************************
xor eax,eax
mov @stRect.top,eax
mov @stRect.left,eax
push dwWidth
pop @stRect.right
push dwHeight
pop @stRect.bottom
invoke GetStockObject,BLACK_BRUSH
invoke FillRect,hDcBack,addr @stRect,eax
;********************************************************************
; 随机分布 Star3 星星
; 中间的 sub eax,@dwWidth 是为了不至于在屏幕上出现只有一半的星星
;********************************************************************
invoke CreateCompatibleDC,hDcBack
mov @hDcTmp,eax
invoke LoadBitmap,hInstance,BMP_STAR3
mov @hBmpTmp,eax
invoke SelectObject,@hDcTmp,@hBmpTmp
invoke GetObject,@hBmpTmp,sizeof BITMAP,addr @stBmp
push @stBmp.bmWidth
pop @dwWidth
push @stBmp.bmHeight
pop @dwHeight
mov ecx,dwStar3
@@:
push ecx
mov eax,dwWidth
sub eax,@dwWidth ;Star3.bmp 宽度
call _Random
mov @dwX,eax
mov eax,dwGroundOffsetY
sub eax,20
call _Random
mov @dwY,eax
invoke BitBlt,hDcBack,@dwX,@dwY,@dwWidth,@dwHeight,\
@hDcTmp,0,0,SRCPAINT
pop ecx
loop @B
invoke DeleteObject,@hDcTmp
invoke DeleteObject,@hBmpTmp
;********************************************************************
; 随机分布 Star2 星星
; 中间的 sub eax,@dwWidth 是为了不至于在屏幕上出现只有一半的星星
;********************************************************************
invoke CreateCompatibleDC,hDcBack
mov @hDcTmp,eax
invoke LoadBitmap,hInstance,BMP_STAR2
mov @hBmpTmp,eax
invoke SelectObject,@hDcTmp,@hBmpTmp
invoke GetObject,@hBmpTmp,sizeof BITMAP,addr @stBmp
push @stBmp.bmWidth
pop @dwWidth
push @stBmp.bmHeight
pop @dwHeight
mov ecx,dwStar2
@@:
push ecx
mov eax,dwWidth
sub eax,@dwWidth ;Star2.bmp 宽度
call _Random
mov @dwX,eax
mov eax,dwGroundOffsetY
sub eax,20
call _Random
mov @dwY,eax
invoke BitBlt,hDcBack,@dwX,@dwY,@dwWidth,@dwHeight,\
@hDcTmp,0,0,SRCPAINT
pop ecx
loop @B
invoke DeleteObject,@hDcTmp
invoke DeleteObject,@hBmpTmp
;********************************************************************
; 随机分布 Star1 星星
; 中间的 sub eax,@dwWidth 是为了不至于在屏幕上出现只有一半的星星
;********************************************************************
invoke CreateCompatibleDC,hDcBack
mov @hDcTmp,eax
invoke LoadBitmap,hInstance,BMP_STAR1
mov @hBmpTmp,eax
invoke SelectObject,@hDcTmp,@hBmpTmp
invoke GetObject,@hBmpTmp,sizeof BITMAP,addr @stBmp
push @stBmp.bmWidth
pop @dwWidth
push @stBmp.bmHeight
pop @dwHeight
mov ecx,dwStar1
@@:
push ecx
mov eax,dwWidth
sub eax,@dwWidth ;Star1.bmp 宽度
call _Random
mov @dwX,eax
mov eax,dwGroundOffsetY
sub eax,60
call _Random
mov @dwY,eax
invoke BitBlt,hDcBack,@dwX,@dwY,@dwWidth,@dwHeight,\
@hDcTmp,0,0,SRCPAINT
pop ecx
loop @B
invoke DeleteObject,@hDcTmp
invoke DeleteObject,@hBmpTmp
;********************************************************************
; 猪的位置 - 随机
;********************************************************************
mov eax,dwWidth
sub eax,dwPigWidth
call _Random
mov dwPigOffsetX,eax
;********************************************************************
; 月亮的位置 - 1/8 to 1/4 高度随机
;********************************************************************
mov eax,dwHeight
shr eax,3
call _Random
mov ecx,eax
mov eax,dwHeight
shr eax,3
add eax,ecx
mov dwMoonOffsetY,eax
ret
_InitValue endp
;********************************************************************
_CreatePic proc
;********************************************************************
; 画星空
;********************************************************************
mov ecx,dwTimerBackMax
mov eax,dwTimerBackNow
inc eax
.if eax >= ecx ;如果移动到尽头则循环
xor eax,eax
.endif
mov dwTimerBackNow,eax
mul dwWidth
div ecx
mov dwBackOffsetX,eax ;按时间比例计算坐标
.if dwBackOffsetX != 0
mov eax,dwWidth
sub eax,dwBackOffsetX
invoke BitBlt,hDcPicture,0,0,dwBackOffsetX,dwHeight,\
hDcBack,eax,0,SRCCOPY
.endif
mov eax,dwWidth
sub eax,dwBackOffsetX
invoke BitBlt,hDcPicture,dwBackOffsetX,0,eax,dwHeight,\
hDcBack,0,0,SRCCOPY
;********************************************************************
; 从负的月亮宽度开始(这样效果是月亮的右边从屏幕左边慢慢出来)
; 根据现在时间和循环时间的比例,在对应的屏幕位置上画月亮
;********************************************************************
mov ecx,dwTimerMoonMax
mov eax,dwTimerMoonNow
inc eax
.if eax >= ecx
xor eax,eax
.endif
mov dwTimerMoonNow,eax
mov edx,dwWidth ;从 -dwMoonWidth 开始
add edx,dwMoonWidth
mul edx
div ecx
sub eax,dwMoonWidth
mov dwMoonOffsetX,eax
invoke BitBlt,hDcPicture,dwMoonOffsetX,dwMoonOffsetY,\
dwMoonWidth,dwMoonHeight,hDcMoonMask,0,0,SRCAND
invoke BitBlt,hDcPicture,dwMoonOffsetX,dwMoonOffsetY,\
dwMoonWidth,dwMoonHeight,hDcMoon,0,0,SRCPAINT
;********************************************************************
; 画草地
; 从坐标 0 开始,循环画到屏幕的右边
;********************************************************************
xor eax,eax
.while eax < dwWidth
push eax
invoke BitBlt,hDcPicture,eax,dwGroundOffsetY,\
dwGroundWidth,dwGroundHeight,hDcGroundMask,0,0,SRCAND
pop eax
push eax
invoke BitBlt,hDcPicture,eax,dwGroundOffsetY,\
dwGroundWidth,dwGroundHeight,hDcGround,0,0,SRCPAINT
pop eax
mov ecx,dwGroundWidth
add eax,ecx
.endw
;********************************************************************
; 画猪
;********************************************************************
invoke BitBlt,hDcPicture,dwPigOffsetX,dwPigOffsetY,\
dwPigWidth,dwPigHeight,hDcPigMask,0,0,SRCAND
invoke BitBlt,hDcPicture,dwPigOffsetX,dwPigOffsetY,\
dwPigWidth,dwPigHeight,hDcPig,0,0,SRCPAINT
ret
_CreatePic endp
;********************************************************************
_Quit proc
invoke KillTimer,hWinMain,TIMER_MOON
invoke DestroyWindow,hWinMain
invoke PostQuitMessage,NULL
invoke DeleteObject,hBmpBack
invoke DeleteObject,hBmpPicture
invoke DeleteObject,hBmpGround
invoke DeleteObject,hBmpGroundMask
invoke DeleteObject,hBmpMoon
invoke DeleteObject,hBmpMoonMask
invoke DeleteObject,hBmpPig
invoke DeleteObject,hBmpPigMask
invoke DeleteDC,hDcBack
invoke DeleteDC,hDcPicture
invoke DeleteDC,hDcGround
invoke DeleteDC,hDcGroundMask
invoke DeleteDC,hDcMoon
invoke DeleteDC,hDcMoonMask
invoke DeleteDC,hDcPig
invoke DeleteDC,hDcPigMask
ret
_Quit endp
;********************************************************************
_GetConfig proc
invoke _GetRegKeyDw,addr szKeyName,addr szKeyStar1
.if eax == -1
mov eax,5
.endif
mov dwStar1,eax
invoke _GetRegKeyDw,addr szKeyName,addr szKeyStar2
.if eax == -1
mov eax,10
.endif
mov dwStar2,eax
invoke _GetRegKeyDw,addr szKeyName,addr szKeyStar3
.if eax == -1
mov eax,20
.endif
mov dwStar3,eax
invoke _GetRegKeyDw,addr szKeyName,addr szKeyTime1
.if eax == -1
mov eax,2
.endif
mov ecx,600
mul ecx
mov dwTimerMoonMax,eax
invoke _GetRegKeyDw,addr szKeyName,addr szKeyTime2
.if eax == -1
mov eax,10
.endif
mov ecx,600
mul ecx
mov dwTimerBackMax,eax
ret
_GetConfig endp
;********************************************************************
_SaveConfig proc
invoke _SetRegKeyDw,addr szKeyName,addr szKeyStar1,dwStar1
invoke _SetRegKeyDw,addr szKeyName,addr szKeyStar2,dwStar2
invoke _SetRegKeyDw,addr szKeyName,addr szKeyStar3,dwStar3
mov eax,dwTimerMoonMax
xor edx,edx
mov ecx,600
div ecx
invoke _SetRegKeyDw,addr szKeyName,addr szKeyTime1,eax
mov eax,dwTimerBackMax
xor edx,edx
mov ecx,600
div ecx
invoke _SetRegKeyDw,addr szKeyName,addr szKeyTime2,eax
ret
_SaveConfig endp
;********************************************************************
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -