之前代码通过在updateWithoutInput()函数中调用Sleep()函数来降低小蛇的移动速度。然而Sleep()函数运行时,整个程序都会暂停,包括用户输入模块。用户会感觉到卡顿,明明按了键,小蛇却没有反应。
为了解决这一问题,这一节介绍动态变量、静态变量的概念。输入并运行以下代码:
Sub fun()
Dim m As Long
m += 1
Print m
End Sub
Sub 游戏执行过程(hWndForm As hWnd)
fun()
fun()
fun()
End Sub
程序运行后输出:
1
1
1
函数中定义的变量默认为动态变量,程序从变量的作用域开始,为其动态分配内存空间;到变量的作用域结束,动态收回变量的内存空间。
主函数中第一次调用fun()时,动态分配内存空间,m初始化为0,加1,输出,fun()运行结束,程序收回m的内存空间。第二次调用fun(),继续动态分配m的内存空间,m初始化为0,加1,输出1,收回内存空间。第三次调用也输出1。
用关键词static修饰的变量称为静态变量,即程序开始运行时就为其分配内存空间,直到程序运行完收回,修改代码如下:
Sub fun()
Static m As Long
m += 1
Print m
End Sub
程序运行后输出:
1
2
3
程序运行后为m分配内存空间,并初始化为0。主函数中第一次调用fun()时,m加1,输出1,fun()运行结束,程序不收回m的内存空间。第二次调用fun(),m继续加1,输出2。第三次调用输出3。
利用静态变量,将updateWithoutInput( )修改如下:
Sub updateWithoutInput(moveDirection As String) '与输入无关的更新
Static waitIndex As Long = 1 ' 静态局部变量,初始化时为1
waitIndex += 1 '每一帧+1
If waitIndex =10 Then '等于10才执行,这样小蛇每隔10帧移动一次
moveSnake(moveDirection) '调用小蛇移动函数
waitIndex =1 '再变成1
End If
Sleep 10 '暂停若干毫秒
End Sub
其中,waitIndex为静态变量,程序运行后初始化为1。updateWithoutInput()每次运行时,waitIndex加1,每隔10帧,才执行一次小蛇移动函数moveSnake()。这样可在不影响用户按键输入的情况下,降低小蛇的移动速度。
评论一下?