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

📄 winproc.asm

📁 用汇编做的俄罗斯方块游戏
💻 ASM
字号:
WndProc proto :HWND, :UINT, :WPARAM, :LPARAM 

WndProc proc uses edx edi esi hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

    local hdc: HDC 
    local ps: PAINTSTRUCT 
    local rect: RECT 
 	local count: BYTE

	.IF uMsg == WM_DESTROY
		invoke DeleteObject, hBufferBitmap
		invoke DeleteObject, hFillBrush
		invoke DeleteObject, hBackBrush
		invoke DeleteObject, hMoveShapeBrush
		invoke DeleteObject, hStopShapeBrush
		invoke DeleteObject, hShapePen
		invoke KillTimer, hWnd, ID_TIMER 
		invoke PostQuitMessage, NULL
	.ELSEIF uMsg == WM_CREATE
		mov GameStatus, IS_STOP
		invoke SetTimer, hWnd, ID_TIMER, 1, NULL
		invoke LoadAccelerators, hInstance, IDA_MAIN
		mov	hAccelerator, eax
		call SetMenuStatus 
	.ELSEIF uMsg == WM_TIMER
		.IF GameStatus == IS_START
			invoke GetTickCount
			mov edx, 9
			sub edx, gLevel
			shl edx, 6
			sub eax, dwStart
			.IF eax > edx 
				inc NextKind
				and NextKind, 3	
				invoke GetTickCount
				mov dwStart, eax
				invoke PostMessage, hWnd, WM_COMMAND, IDM_DOWN, 0
			.ENDIF
		.ENDIF
	.ELSEIF uMsg == WM_PAINT
        invoke BeginPaint, hWnd, ADDR ps 
        mov hdc, eax 
        invoke GetClientRect, hWnd, ADDR rect
        invoke DrawBlockFrame, hdc, rect
		invoke EndPaint,hWnd, ADDR ps 
	.ELSEIF uMsg == WM_COMMAND 
		mov eax, wParam
		.IF ax == IDM_START
			.IF GameStatus != IS_PAUSE
				mov ShapeX, 6
				mov ShapeY, 1
				invoke GetTickCount
				and eax, 7
				mov SelectShape, al
				inc al
				and al, 7
				mov NextShape, al
				mov SelectKind, 0
				mov NextKind, 0
				mov gLevel, 1
				mov gGrade, 0
				xor edi, edi
				.WHILE edi < 24*2
					mov [BlockBoard+edi], IC_BOARDBORDER
					add edi, 2
				.ENDW
				mov [BlockBoard+edi], IC_BOARDBOTTOM
				mov [BlockBoard+edi+2], IC_BOARDBOTTOM
			.ENDIF 
			mov GameStatus, IS_START
			invoke GetTickCount
			mov dwStart, eax
			call SetMenuStatus
			invoke InvalidateRect, hWnd, NULL, 0
		.ELSEIF ax == IDM_STOP
			mov GameStatus, IS_STOP 
			call SetMenuStatus
		.ELSEIF ax == IDM_PAUSE
			mov GameStatus, IS_PAUSE
			call SetMenuStatus 
		.ELSEIF ax == IDM_LEFT
			.IF GameStatus == IS_START 
				inc ShapeX
				call CheckMovable
				.IF eax == 0
					dec ShapeX
				.ENDIF
				invoke InvalidateRect, hWnd, NULL, 0
			.ENDIF
		.ELSEIF ax == IDM_RIGHT
			.IF ShapeX > 0 && GameStatus == IS_START
				dec ShapeX
				call CheckMovable
				.IF eax == 0
					inc ShapeX
				.ENDIF
				invoke InvalidateRect, hWnd, NULL, 0
			.ENDIF
		.ELSEIF ax == IDM_DOWN
			.IF GameStatus == IS_START 
				inc ShapeY
				call CheckMovable
				.IF eax == 0
					dec ShapeY
					.IF ShapeY <= 4
						mov GameStatus, IS_STOP
						call SetMenuStatus
						invoke MessageBox, hWnd, addr lpGameOver, addr szCaptionMain, MB_OK
					.ELSE
						call StepMoveEnd
					.ENDIF
				.ENDIF
				invoke InvalidateRect, hWnd, NULL, 0
			.ENDIF
		.ELSEIF ax == IDM_TURN
			.IF GameStatus == IS_START
				inc SelectKind
				and SelectKind, 3
				call CheckMovable
				.IF eax == 0
					dec SelectKind
					.IF SIGN?
						mov SelectKind, 3
					.ENDIF
				.ENDIF
				invoke InvalidateRect, hWnd, NULL, 0
			.ENDIF
		.ELSEIF ax == IDM_EXIT
			invoke DestroyWindow, hWnd
		.ELSE 
			invoke DefWindowProc, hWnd, uMsg, wParam, lParam
			ret 
		.ENDIF
	.ELSE 
		invoke DefWindowProc, hWnd, uMsg, wParam, lParam 
		ret
	.ENDIF 

	xor eax, eax 
	ret 

WndProc endp

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -