VisualFreeBasic游戏趣味编程_2.9_小球加速下落

2026-1-21 / 0 评论 / 55 阅读

在现实物理世界中,自由落体的物体会受重力影响加速下落。为了在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。尝试实现小球抛物线运动,如图所示。并实现小球在窗口中四处反弹的效果

评论一下?

OωO
取消