⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lover.asm

📁 一段汇编写的动画
💻 ASM
📖 第 1 页 / 共 2 页
字号:
; 创建要用到的 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 + -