在现实物理世界中,自由落体的物体会受重力影响加速下落。为了在FB语言中处理数值为小数的重力加速度,我们可以利用一种新的数据类型—— Single(浮点型)。
Sub 游戏执行过程(hWndForm As hWnd)
Dim g As Single
g = 9.8
Print g
End Sub

浮点型的关键词为Single,Dim g As Single定义了一个浮点型的变量g。FB语言中的小数被自动认为是浮点型常量,并可以赋值给浮点型变量。print()函数可以输出浮点型常量或变量。浮点型数值之间也可以进行四则运算。
首先将y、vy改成浮点型变量。小球y坐标初始化为0,y方向的速度vy初始化为0。增加浮点型变量g描述重力加速度,设为0.5。在do循环语句中,首先根据重力加速度g增加速度vy,然后利用vy更新y坐标,碰到地面后速度vy反向。如此重复运行,即实现了小球加速下落、触底反弹的循环动画效果。
Sub 游戏执行过程(hWndForm As hWnd)
Dim gg As yGDI = hWndForm
gg.Brush(&HFF0000)
Dim y As Single = 0
Dim vy As Single = 0
Dim g As Single = 0.5
Do
vy = vy + g
y = y + vy
If y <= 0 Or y >= 240 Then vy = - vy
gg.DrawEllipse(100, y, 20, 20)
gg.Redraw : Sleep(10) : gg.Cls()
If y > 284 Then vy = 0 : y = 0 '这是重新开始
Loop
End Sub
现实世界中的物体会受阻力的影响,运动速度逐渐减小。我们可以在小球每次落地反弹时,速度变成之前的0.95倍。另外让小球最后静止时正好停止在地面上,防止小球穿过地面。
Sub 游戏执行过程(hWndForm As hWnd)
Dim gg As yGDI = hWndForm
gg.Brush(&HFF0000)
Dim y As Single = 0
Dim vy As Single = 0
Dim g As Single = 0.5
Do
vy = vy + g
y = y + vy
If y <= 0 Or y >= 240 Then vy = - 0.95*vy
gg.DrawEllipse(100, y, 20, 20)
gg.Redraw : Sleep(10) : gg.Cls()
If y > 250 Then Exit Do
Loop
gg.DrawEllipse(100, 240, 20, 20)
End Sub
当代码比较多时,可以适当加一些注释。所谓注释,就是一些说明的文字,不参与程序运行,格式一般是 ‘注释文字”。以下为加上注释的完整代码,这样读者可以比较清楚地了解代码的功能、变量的含义等。
Sub 游戏执行过程(hWndForm As hWnd)
Dim gg As yGDI = hWndForm
gg.Brush(&HFF0000) '球的颜色
Dim y As Single = 0 '小球的y坐标
Dim vy As Single = 0 '小球y方向速度
Dim g As Single = 0.5 '小球加速度,y方向
Do
vy = vy + g '利用加速度g更新vy速度
y = y + vy '利用y方向速度vy更新y坐标
If y <= 0 Or y >= 240 Then
'当碰到地面时和反弹到最高时
vy = - 0.95 *vy ' y方向速度改变方向,并受阻力影响,绝对值变小
End If
gg.DrawEllipse(100, y, 20, 20) '画小球
gg.Redraw '刷新显示画面
Sleep(10) '暂停10毫秒
gg.Cls() '清空画面
If y > 250 Then Exit Do '超过范围,不再反弹,退出循环
Loop
gg.DrawEllipse(100, 240, 20, 20) '画一个在地面的小球
End Sub
提示
当代码逐渐复杂时,一般不要把数值写死在代码中,而是用变量替代。这样代码的可读性更好(阅读有意义的变量名称,而不是阅读没有含义的数字),也方便之后修改参数(只需要修改一次变量,而不是修改多次数值)。
练习题2-8:增加变量x表示小球的x坐标,vx表示x方向的速度,vx初始化为1。尝试实现小球抛物线运动,如图所示。并实现小球在窗口中四处反弹的效果

评论一下?