借助游戏的制作思路来制作一款小游戏是一种不错的学习思路,以下是在学习碰撞模型和自定义函数时通过在vb平台复制一款类似于球球大作战的小应用程序的历程:
目标功能:(1)碰撞模型,-物体运动
(2)键盘事件,-控制物体移动
(3)获取颜色,-由吃到的物体决定
(4)获取宽高大小变化,-由吃到的物体决定
首先明白全局变量与局部变量的含义,这一点很简单因此不多解释我们先声明一个全局方向变量`
Dim currentDirection As Integer
我们需要利用键盘来控制小球运动,因此编辑一个键盘事件;这里我们选择keyup/down事件和keypress事件差别不大,通过利用键盘反馈的ascii或keycode来控制方向变量,再由方向变量的输出来决定物体的运动方向:
If KeyCode = vbKeyUp Then
currentDirection = 3
ElseIf KeyCode = vbKeyDown Then
currentDirection = 2
ElseIf KeyCode = vbKeyLeft Then
currentDirection = 1
ElseIf KeyCode = vbKeyRight Then
currentDirection = 0
End If
物体的运动时间我们要写在timer事件中,物体是实时运动的,小球是固定的
Private Sub Timer1_Timer()
Dim speed As Integer
speed = 15 '默认一次移动的位置
If currentDirection = 0 Then
sb1.Left = sb1.Left + speed
ElseIf currentDirection = 1 Then
sb1.Left = sb1.Left - speed
ElseIf currentDirection = 2 Then
sb1.Top = sb1.Top + speed
ElseIf currentDirection = 3 Then
sb1.Top = sb1.Top - speed
End If
到这一步我们已经实现了用键盘控制小球运动的目的
然后我们需要给小球定一个碰撞模型,即如何判定物体吃到了目标小球,我们用他们在窗口中的位置作表来确定是否碰撞,自定义函数既可以从菜单中添加,也可以自己直接在代码栏里打出来;
Function crash(A As Shape, B As Shape) As Boolean '返回true代表撞上
Dim f As Boolean
f = False
'水平方向碰撞
If A.Left + A.Width >= B.Left _
And A.Left <= B.Left + B.Width _
And A.Top <= B.Top + B.Height _
And A.Top + A.Height >= B.Top Then '竖直方向碰撞
f = True
End If
crash = f
end function
现在已经完成了碰撞的判定,我们在自定义函数中设定了一个返回值,这也是我们在这里选择用function而非sub的原因,设置返回值的原因是我们要根据返回值来判定是否物体可以获取小球的颜色和大小,这是起到了承上启下的作用
If crash(sb1, sb2) Then
'获取颜色
sb1.FillColor = sb2.FillColor
'变换位置
Randomize
sb2.Left = Rnd * Form1.ScaleWidth
sb2.Top = Rnd * Form1.ScaleHeight
'变换颜色
sb2.FillColor = RGB(Rnd * 255, Rnd * 255, Rnd * 255)
'获得大小
sb1.Width = sb1.Width + sb2.Width
sb1.Height = sb1.Height + sb2.Height
End If
vb中如果有返回值直接用crash,没有的话用call
小球的运动模型完成了,用上下左右来控制小球运动,还有碰撞模型和相应返回机制