vb中方向键与form_keydown事件

yoyorll 2009-04-22 01:47:47
窗体上面有command按钮,当按上下左右键的时候不响应keydown事件
而是按钮的焦点跳转
如何在按下上下左右键的时候按钮不会焦点跳转而且触发form_keydowm事件啊????
...全文
438 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2009-04-28
  • 打赏
  • 举报
回复
http://www.m5home.com/bbs/dispbbs.asp?boardid=28&Id=517

VB键盘拦截代码,使用_LL HOOK
yoyorll 2009-04-26
  • 打赏
  • 举报
回复
拦截键盘的不知道怎么搞哦~
yoyorll 2009-04-26
  • 打赏
  • 举报
回复
嘿嘿~~ 给分咯!
冰火小猫 2009-04-25
  • 打赏
  • 举报
回复
学习中
舉杯邀明月 2009-04-25
  • 打赏
  • 举报
回复
Up............
嗷嗷叫的老马 2009-04-25
  • 打赏
  • 举报
回复
哎呀.

想响应,直接拦截键盘吧,嘿嘿.
slowgrace 2009-04-24
  • 打赏
  • 举报
回复
看来楼主自己把问题解决了。
yoyorll 2009-04-24
  • 打赏
  • 举报
回复
呵呵 如果仅仅只设置KeyPreview的话,当你按方向键的时候,窗体上面的按钮会拦截keyDown,此时不会发生keydown,而是按钮的焦点会发生跳转!
我用设置热键解决了一下,可以实现

'标准模块
'========================================================================================
'功能:系统热键
'用法:
'--------------------------------------------
'Private Sub Form_Load()
'SetHotkey 1, "37", "Add", Form1.hwnd
'SetHotkey 2, "Ctrl,38", "Add", Form1.hwnd
'SetHotkey 3, "Ctrl+Alt,39", "Add", Form1.hwnd
'SetHotkey 4, "Ctrl+Alt+Shift,40", "Add", Form1.hwnd
'End Sub
'Private Sub Form_Unload(Cancel As Integer)
'SetHotkey 1, "", "Del", Form1.hwnd
'SetHotkey 2, "", "Del", Form1.hwnd
'SetHotkey 3, "", "Del", Form1.hwnd
'SetHotkey 4, "", "Del", Form1.hwnd
'End Sub

'--------------------------------------------
'注意:所执行的操作在标志的*处
'==========================================================================================


'
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function RegisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long, ByVal fskey_Modifiers As Long, ByVal vk As Long) As Long
Private Declare Function UnregisterHotKey Lib "user32" (ByVal hwnd As Long, ByVal id As Long) As Long
Const WM_HOTKEY = &H312
Const MOD_ALT = &H1
Const MOD_CONTROL = &H2
Const MOD_SHIFT = &H4
Const GWL_WNDPROC = (-4)
Dim key_preWinProc As Long
Dim key_Modifiers As Long, key_uVirtKey As Long, key_idHotKey As Long
Dim key_IsWinAddress As Boolean
Function keyWndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If Msg = WM_HOTKEY Then
Select Case wParam
Case 1 '向左所执行的操作
MsgBox "左" '****************************************执行操作
Case 2 '向上所执行的操作
MsgBox "上" '****************************************执行操作
Case 3 '向右所执行的操作
MsgBox "右" '****************************************执行操作
Case 4 '想下所执行的操作
MsgBox "下" '****************************************执行操作
End Select
End If
keyWndproc = CallWindowProc(key_preWinProc, hwnd, Msg, wParam, lParam)
End Function

Function SetHotkey(ByVal KeyId As Long, ByVal KeyAss0 As String, ByVal Action As String, ByVal Wnd As Long)
Dim KeyAss1 As Long
Dim KeyAss2 As String
Dim i As Long
i = InStr(1, KeyAss0, ",")
If i = 0 Then
KeyAss1 = Val(KeyAss0)
KeyAss2 = ""
Else
KeyAss1 = Right(KeyAss0, Len(KeyAss0) - i)
KeyAss2 = Left(KeyAss0, i - 1)
End If
key_idHotKey = 0
key_Modifiers = 0
key_uVirtKey = 0
If key_IsWinAddress = False Then
key_preWinProc = GetWindowLong(Wnd, GWL_WNDPROC)
SetWindowLong Wnd, GWL_WNDPROC, AddressOf keyWndproc
End If

key_idHotKey = KeyId
Select Case Action
Case "Add"
If KeyAss2 = "Ctrl" Then key_Modifiers = MOD_CONTROL
If KeyAss2 = "Alt" Then key_Modifiers = MOD_ALT
If KeyAss2 = "Shift" Then key_Modifiers = MOD_SHIFT
If KeyAss2 = "Ctrl+Alt" Then key_Modifiers = MOD_CONTROL + MOD_ALT
If KeyAss2 = "Ctrl+Shift" Then key_Modifiers = MOD_CONTROL + MOD_SHIFT
If KeyAss2 = "Ctrl+Alt+Shift" Then key_Modifiers = MOD_CONTROL + MOD_ALT + MOD_SHIFT
If KeyAss2 = "Shift+Alt" Then key_Modifiers = MOD_SHIFT + MOD_ALT
key_uVirtKey = Val(KeyAss1)
RegisterHotKey Wnd, key_idHotKey, key_Modifiers, key_uVirtKey
key_IsWinAddress = True
Case "Del"
SetWindowLong Wnd, GWL_WNDPROC, key_preWinProc
UnregisterHotKey Wnd, key_uVirtKey
key_IsWinAddress = False
End Select
End Function



'窗体
Private Sub Form_Load()
SetHotkey 1, "37", "Add", Form1.hwnd
SetHotkey 2, "38", "Add", Form1.hwnd
SetHotkey 3, "39", "Add", Form1.hwnd
SetHotkey 4, "40", "Add", Form1.hwnd
End Sub
Private Sub Form_Unload(Cancel As Integer)
SetHotkey 1, "", "Del", Form1.hwnd
SetHotkey 2, "", "Del", Form1.hwnd
SetHotkey 3, "", "Del", Form1.hwnd
SetHotkey 4, "", "Del", Form1.hwnd
End Sub

slowgrace 2009-04-22
  • 打赏
  • 举报
回复
Private Sub Form_Load()
Me.KeyPreview = True
End Sub


对于这个事件,获得焦点的对象将接收到所有的键击事件。窗体只有在它没有控件或它所有可见的控件都失效时才能获得焦点。

如果将窗体的 KeyPreview 属性设置为 Yes,窗体将会接收到所有的键盘事件,甚至包括那些对控件发生的键盘事件。通过设置该属性值,所有键盘事件将首先在窗体上发生,然后在获得焦点的控件上发生。无论哪个控件获得焦点,都可以在窗体中对按下的特定键作出响应。
hancat 2009-04-22
  • 打赏
  • 举报
回复

在vb.net版块又跑这里来了啊.
一样的问题啊
Form_keypreview属性
vb小游戏定义蛇的运动速度枚举值 Private Enum tpsSpeed QUICKLY = 0 SLOWLY = 1 End Enum '定义蛇的运动方向枚举值 Private Enum tpsDirection D_UP = 38 D_DOWN = 40 D_LEFT = 37 D_RIGHT = 39 End Enum '定义运动区域4个禁区的枚举值 Private Enum tpsForbiddenZone FZ_TOP = 30 FZ_BOTTOM = 5330 FZ_LEFT = 30 FZ_RIGHT = 5730 End Enum '定义蛇头及身体初始化数枚举值 Private Enum tpsSnake SNAKEONE = 1 SNAKETWO = 2 SNAKETHREE = 3 SNAKEFOUR = 4 End Enum '定义蛇宽度的常量 Private Const SNAKEWIDTH As Integer = 100 '该过程用于显示游戏信息 Private Sub Form_Load() Me.Show Me.lblTitle = "BS贪食蛇 — (版本 " & App.Major & "." & App.Minor & "." & App.Revision & ")" Me.Caption = Me.lblTitle.Caption frmSplash.Show 1 End Sub '该过程用于使窗体恢复原始大小 Private Sub Form_Resize() If Me.WindowState <> 1 Then Me.Caption = "" Me.Height = 6405 '窗体高度为 6405 缇 Me.Width = 8535 '窗体宽度为 8535 缇 Me.Left = (Screen.Width - Width) \ 2 Me.Top = (Screen.Height - Height) \ 2 End If End Sub '该过程用于重新开始开始游戏 Private Sub cmdGameStart_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Beep msg = MsgBox("您确认要重新开始游戏吗?", 4 + 32, "BS贪食蛇") If msg = 6 Then Call m_subGameInitialize End Sub '该过程用于暂停/运行游戏 Private Sub chkPause_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Me.chkPause.Caption = "暂停游戏(&P)" Then Me.tmrSnakeMove.Enabled = False Me.tmrGameTime.Enabled = False Me.picMoveArea.Enabled = False Me.lblPauseLab.Visible = True Me.chkPause.Caption = "继续游戏(&R)" Else Me.tmrSnakeMove.Enabled = True Me.tmrGameTime.Enabled = True Me.picMoveArea.Enabled = True Me.lblPauseLab.Visible = False Me.chkPause.Caption = "暂停游戏(&P)" End If End Sub '该过程用于显示游戏规则 Private Sub cmdGameRules_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Beep MsgBox " BS贪食蛇:一个规则最简单的趣味游戏,您将用键盘" & Chr(13) & _ "上的4个方向键来控制蛇的运动方向。在运动过程蛇" & Chr(13) & _ "不能后退,蛇的头部也不能接触到运动区域的边线以外" & Chr(13) & _ "和蛇自己的身体,否则就游戏失败。在吃掉随机出现的" & Chr(13) & _ "果子后,蛇的身体会变长,越长难度越大。祝您好运!!", 0 + 64, "游戏规则" End Sub '该过程用于显示游戏开发信息 Private Sub cmdAbout_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Beep MsgBox "BS贪食蛇" & "(V-" & App.Major & "." & App.Minor & "版本)" & Chr(13) & Chr(13) & _ "" & Chr(13) & Chr(13) & _ "由PigheadPrince设计制作" & Chr(13) & _ "CopyRight(C)2002,BestSoft.TCG", 0, "关于本游戏" End Sub '该过程用于退出游戏 Private Sub cmdExit_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) Beep msg = MsgBox("您要退出本游戏吗?", 4 + 32, "BS贪食蛇") Select Case msg Case 6 End Case 7 Me.chkWindowButton(2).Value = 0 Exit Sub End Select End Sub '该过程用于拖动窗体_(点击图标) Private Sub imgWindowTop_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) ReleaseCapture SendMessage Me.hwnd, WM_SYSCOMMAND, SC_MOVE, 0 End Sub '该共用过程用于处理窗体控制按钮组的相关操作_(锁定、最小化、退出) Private Sub chkWindowButton_MouseUp(Index As Integer, Button As Integer, Shift As Integer, X As Single, Y As Single) If Button <> 1 Then Exit Sub Select Case Index Case 0 '锁定窗体 If Me.chkWindowButton(0).Value = 1 Then Me.imgWindowTop.BorderStyle = 0 Me.imgWindowTop.Enabled = False Else Me.imgWindowTop.BorderStyle = 1 Me.imgWindowTop.Enabled = True End If Case 1 '最小化 Me.WindowState = 1 Me.chkWindowButton(1).Value = 0 Me.Caption = "BS贪食蛇 — (V-" & App.Major & "." & App.Minor & "版本)" Case 2 '退出 Beep msg = MsgBox("您要退出本游戏吗?", 4 + 32, "BS贪食蛇") Select Case msg Case 6 End Case 7 Me.chkWindowButton(2).Value = 0 Exit Sub End Select End Select End Sub '该过程用于设置蛇运动速度的快慢 Private Sub hsbGameSpeed_Change() Me.tmrSnakeMove.Interval = Me.hsbGameSpeed.Value End Sub '该过程用于通过键盘的方向键改变蛇的运动方向 Private Sub picMoveArea_KeyDown(KeyCode As Integer, Shift As Integer) Select Case g_intDirection Case D_UP If KeyCode = D_DOWN Then Exit Sub Case D_DOWN If KeyCode = D_UP Then Exit Sub Case D_LEFT If KeyCode = D_RIGHT Then Exit Sub Case D_RIGHT If KeyCode = D_LEFT Then Exit Sub End Select g_intDirection = KeyCode End Sub '该计时循环过程用于计算游戏耗费的秒数并显示 Private Sub tmrGameTime_Timer() g_lngGameTime = g_lngGameTime + 1 Me.lblGameTime.Caption = g_lngGameTime & "秒" End Sub '该计时循环过程用于控制蛇的行动轨迹 Private Sub tmrSnakeMove_Timer() Dim lngSnakeX As Long, lngSnakeY As Long, lngSnakeColor As Long Dim lngPointX As Long, lngPointY As Long, lngPointColor As Long Randomize Me.picMoveArea.SetFocus Me.picMoveArea.Cls '确认蛇头的运动方向并获取新的位置 Select Case g_intDirection Case D_UP '向上运动 g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_CurY - SNAKEWIDTH Case D_DOWN '向下运动 g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_CurY + SNAKEWIDTH Case D_LEFT '向左运动 g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_CurX - SNAKEWIDTH g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY Case D_RIGHT '向右运动 g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_OldX g_udtSnake(SNAKEONE).Snake_CurX = g_udtSnake(SNAKEONE).Snake_CurX + SNAKEWIDTH g_udtSnake(SNAKEONE).Snake_CurY = g_udtSnake(SNAKEONE).Snake_OldY End Select '根据新的位置绘制蛇头 lngSnakeX = g_udtSnake(SNAKEONE).Snake_CurX lngSnakeY = g_udtSnake(SNAKEONE).Snake_CurY lngSnakeColor = g_udtSnake(SNAKEONE).Snake_Color Me.picMoveArea.PSet (lngSnakeX, lngSnakeY), lngSnakeColor '移动蛇身体其他部分的位置 For i = 2 To g_intSnakeLength g_udtSnake(i).Snake_CurX = g_udtSnake(i - 1).Snake_OldX g_udtSnake(i).Snake_CurY = g_udtSnake(i - 1).Snake_OldY lngSnakeX = g_udtSnake(i).Snake_CurX lngSnakeY = g_udtSnake(i).Snake_CurY lngSnakeColor = g_udtSnake(i).Snake_Color Me.picMoveArea.PSet (lngSnakeX, lngSnakeY), lngSnakeColor Next i '更新蛇旧的坐标位置 For j = 1 To g_intSnakeLength g_udtSnake(j).Snake_OldX = g_udtSnake(j).Snake_CurX g_udtSnake(j).Snake_OldY = g_udtSnake(j).Snake_CurY Next j '判断蛇在移动是否到了禁区而导致游戏失败 If m_funMoveForbiddenZone(g_udtSnake(SNAKEONE).Snake_CurX, g_udtSnake(SNAKEONE).Snake_CurY) Then Beep MsgBox "您的蛇移动到了禁区,游戏失败!", 0 + 16, "BS贪食蛇" Me.tmrSnakeMove.Enabled = False Me.tmrGameTime.Enabled = False Me.picMoveArea.Visible = False Exit Sub End If '判断蛇在移动是否碰到了自己的身体而导致游戏失败 If m_funTouchSnakeBody(g_udtSnake(SNAKEONE).Snake_CurX, g_udtSnake(SNAKEONE).Snake_CurY) Then Beep MsgBox "您的蛇在移动碰到了自己的身体,游戏失败!", 0 + 16, "BS贪食蛇" Me.tmrSnakeMove.Enabled = False Me.tmrGameTime.Enabled = False Me.picMoveArea.Visible = False Exit Sub End If '判断蛇是否吃到了果子 If m_funEatPoint(g_udtSnake(SNAKEONE).Snake_CurX, g_udtSnake(SNAKEONE).Snake_CurY) Then '累加玩家的得分并刷新得分显示 g_intPlayerScore = g_intPlayerScore + 1 Me.lblYourScore.Caption = g_intPlayerScore & "分" Call m_subAddSnake '加长蛇的身体 Call m_subGetPoint '获取下一个果子的位置和颜色 Else '绘制果子 lngPointX = g_udtPoint.Point_X lngPointY = g_udtPoint.Point_Y lngPointColor = g_udtPoint.Point_Color Me.picMoveArea.PSet (lngPointX, lngPointY), lngPointColor End If End Sub '该私有子过程用于初始化游戏 Private Sub m_subGameInitialize() Erase g_udtSnake '清空蛇的结构数组 g_intPlayerScore = 0 '清空玩家的得分 g_lngGameTime = 0 '清空游戏耗费的秒数 g_intDirection = D_DOWN '设定蛇的初始运动方向为下 g_intSnakeLength = 4 '设定蛇的初始长度 ReDim g_udtSnake(1 To g_intSnakeLength) '重新定义蛇的长度 '定义蛇头部的数据 With g_udtSnake(SNAKEONE) .Snake_OldX = 530 .Snake_OldY = 530 .Snake_Color = vbBlack End With '定义蛇身第2节的数据 With g_udtSnake(SNAKETWO) .Snake_OldX = 530 .Snake_OldY = 430 .Snake_Color = vbGreen End With '定义蛇身第3节的数据 With g_udtSnake(SNAKETHREE) .Snake_OldX = 530 .Snake_OldY = 330 .Snake_Color = vbYellow End With '定义蛇身第4节的数据 With g_udtSnake(SNAKEFOUR) .Snake_OldX = 530 .Snake_OldY = 230 .Snake_Color = vbRed End With Me.picMoveArea.Visible = True Me.lblYourScore.Caption = g_intPlayerScore & "分" Me.lblGameTime.Caption = g_lngGameTime & "秒" Me.tmrSnakeMove.Interval = Me.hsbGameSpeed.Value Me.tmrSnakeMove.Enabled = True Me.tmrGameTime.Enabled = True Call m_subGetPoint '获取第一个果子的位置和颜色 End Sub '该私有子过程用于返回获取的果子的位置和颜色信息 Private Sub m_subGetPoint() Dim lngRedValue As Long, lngGreenValue As Long, lngBlueValue As Long Dim lngPointX As Long, lngPointY As Long, lngPointColor As Long '随机获取果子的颜色 lngRedValue = Int((255 - 0 + 1) * Rnd + 0) lngGreenValue = Int((255 - 0 + 1) * Rnd + 0) lngBlueValue = Int((255 - 0 + 1) * Rnd + 0) lngPointColor = RGB(lngRedValue, lngGreenValue, lngBlueValue) '随机获取果子的位置 lngPointX = Int((FZ_LEFT - FZ_RIGHT + 1) * Rnd + FZ_RIGHT) lngPointY = Int((FZ_TOP - FZ_BOTTOM + 1) * Rnd + FZ_BOTTOM) Me.PSet (lngPointX, lngPointY), lngPointColor '设置函数返回值 With g_udtPoint .Point_X = lngPointX .Point_Y = lngPointY .Point_Color = lngPointColor End With End Sub '该私有子过程用于加长蛇的身体 Private Sub m_subAddSnake() Dim udtSnakeTemp() As Snake Dim lngSnakeX As Long, lngSnakeY As Long, lngSnakeColor As Long '备份蛇原先身体的数据并使蛇的身体加长 ReDim udtSnakeTemp(1 To g_intSnakeLength) For k = 1 To g_intSnakeLength With udtSnakeTemp(k) .Snake_CurX = g_udtSnake(k).Snake_CurX .Snake_CurY = g_udtSnake(k).Snake_CurY .Snake_OldX = g_udtSnake(k).Snake_OldX .Snake_OldY = g_udtSnake(k).Snake_OldY .Snake_Color = g_udtSnake(k).Snake_Color End With Next k g_intSnakeLength = g_intSnakeLength + 1 ReDim g_udtSnake(g_intSnakeLength) '将备份蛇身体的数据返回到加长的蛇身数组 For l = 1 To g_intSnakeLength - 1 With g_udtSnake(l) .Snake_CurX = udtSnakeTemp(l).Snake_CurX .Snake_CurY = udtSnakeTemp(l).Snake_CurY .Snake_OldX = udtSnakeTemp(l).Snake_OldX .Snake_OldY = udtSnakeTemp(l).Snake_OldY .Snake_Color = udtSnakeTemp(l).Snake_Color End With Next l '写入新加入的身体数据 Select Case g_intDirection Case D_UP With g_udtSnake(g_intSnakeLength) .Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX + SNAKEWIDTH .Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY .Snake_Color = g_udtPoint.Point_Color End With Case D_DOWN With g_udtSnake(g_intSnakeLength) .Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX - SNAKEWIDTH .Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY .Snake_Color = g_udtPoint.Point_Color End With Case D_LEFT With g_udtSnake(g_intSnakeLength) .Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX .Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY + SNAKEWIDTH .Snake_Color = g_udtPoint.Point_Color End With Case D_RIGHT With g_udtSnake(g_intSnakeLength) .Snake_OldX = g_udtSnake(g_intSnakeLength - 1).Snake_CurX .Snake_OldY = g_udtSnake(g_intSnakeLength - 1).Snake_CurY - SNAKEWIDTH .Snake_Color = g_udtPoint.Point_Color End With End Select lngSnakeX = g_udtSnake(g_intSnakeLength).Snake_CurX lngSnakeY = g_udtSnake(g_intSnakeLength).Snake_CurY lngSnakeColor = g_udtSnake(g_intSnakeLength).Snake_Color Me.picMoveArea.PSet (lngSnakeX, lngSnakeY), lngSnakeColor End Sub '该自定义函数用于返回运动的蛇是否到达禁区而导致游戏失败 Private Function m_funMoveForbiddenZone(SnakeX As Long, SnakeY As Long) As Boolean If (SnakeX >= FZ_LEFT And SnakeX <= FZ_RIGHT) And (SnakeY >= FZ_TOP And SnakeY <= FZ_BOTTOM) Then m_funMoveForbiddenZone = False Else m_funMoveForbiddenZone = True End If End Function '该自定义函数用于返回运动的蛇是否碰到自己的身体而导致游戏失败 Private Function m_funTouchSnakeBody(SnakeX As Long, SnakeY As Long) As Boolean For m = 2 To g_intSnakeLength If SnakeX = g_udtSnake(m).Snake_CurX And SnakeY = g_udtSnake(m).Snake_CurY Then m_funTouchSnakeBody = True Exit For Else m_funTouchSnakeBody = False End If Next m End Function '该自定义函数用于返回运动的蛇是否吃到了果子 Private Function m_funEatPoint(SnakeX As Long, SnakeY As Long) As Boolean If Abs(SnakeX - g_udtPoint.Point_X) <= SNAKEWIDTH And Abs(SnakeY - g_udtPoint.Point_Y) <= SNAKEWIDTH Then m_funEatPoint = True Else m_funEatPoint = False End If End Function '(API函数调用过程_用以实现无标题窗体的拖动操作)--------------------------------- 'RleaseCapture函数用以释放鼠标捕获 Public Declare Function ReleaseCapture Lib "user32" () As Long 'SendMessage函数用作向Windows发送移动窗体的消息 Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As _ Long, ByVal wMsg As Long, ByVal wParam As Long, IParam As Any) As Long Public Const WM_SYSCOMMAND = &H112; '声明向Windows发送消息的常量 Public Const SC_MOVE = &HF012; '声明控制移动窗体常量 '(游戏变量声明部分)------------------------------------------------------------- '定义蛇的数据类型结构 Public Type Snake Snake_OldX As Long Snake_OldY As Long Snake_CurX As Long Snake_CurY As Long Snake_Color As Long End Type '定义果子的数据类型结构 Public Type Point Point_X As Long Point_Y As Long Point_Color As Long End Type '定义蛇的动态数组 Public g_udtSnake() As Snake '定义果子 Public g_udtPoint As Point '定义蛇的长度 Public g_intSnakeLength As Integer '定义蛇的颜色 Public g_lngSnakeColor As Long '定义蛇的运动方向 Public g_intDirection As Integer '定义玩家的得分 Public g_intPlayerScore As Integer '定义游戏耗费的秒数 Public g_lngGameTime As Long

1,451

社区成员

发帖
与我相关
我的任务
社区描述
VB 控件
社区管理员
  • 控件
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧