VisualFreeBasic游戏趣味编程_10.5_倒计时与进度条

2026-1-22 / 0 评论 / 53 阅读

输入并运行以下代码,窗口显示出程序运行了多少秒:

Sub 游戏执行过程(hWndForm As hWnd)
   Dim gg As yGDI = hWndForm
   Dim 开始时间 As Double = Now()
   Dim 当前时间 As Double 
   Do '循环执行   
      gg.Cls 
      gg.Font "黑体", 20
      当前时间 = Now()
      gg.DrawString 100,100,"程序运行了" &  DateDiff("s",开始时间,当前时间) & "秒"
      gg.Redraw
      Sleep 20 
   Loop    
End Sub


首先定义两个用于计时的变量

   Dim 开始时间 As Double 
   Dim 当前时间 As Double

程序开始运行时获得当前时刻:

 Dim 开始时间 As Double= Now()

在do循环语句中,再次获得程序运行到此的时刻:

当前时间 = Now()

用 DateDiff 函数计算时间差,即可得到程序一共运行了多少秒:

DateDiff("s",开始时间,当前时间)

进一步修改代码带进度条如下:

Sub 游戏执行过程(hWndForm As hWnd)
   Dim gg         As yGDI   = hWndForm
   Dim 开始时间   As Double = Now()
   Dim 当前时间   As Double
   Dim maxTime    As Long =20 ' 游戏允许的总时长
   Dim remainTime As Long = maxTime ' 游戏剩余时间
   Dim 窗口宽度   As Long = DpiUnScaleI(Form1.ScaleWidth)
   Do '循环执行
      gg.Cls
      gg.Brush BGR(255, 0, 0) 'GDI的颜色值。
      remainTime = maxTime - DateDiff("s", 开始时间, 当前时间)
      If remainTime < 0 Then
         remainTime = 0
      Else
         gg.DrawFrame 0, 0, 窗口宽度/maxTime * remainTime ,20
      End If
      gg.Font "黑体", 20
      当前时间 = Now()
      gg.DrawString 100, 100, "程序运行了" & DateDiff("s", 开始时间, 当前时间) & "秒"
      gg.Redraw
      Sleep 20
   Loop
End Sub


然而发现进度条一秒跳一次,不够丝滑,我们改用代码。

Sub 游戏执行过程(hWndForm As hWnd)
   Dim gg         As yGDI   = hWndForm
   Dim 开始时间   As ULong  = GetTickCount
   Dim 当前时间   As ULong 
   Dim maxTime    As Single  =20 ' 游戏允许的总时长
   Dim remainTime As Single 
   Dim 窗口宽度   As Long = DpiUnScaleI(Form1.ScaleWidth)
   Do '循环执行
      gg.Cls
      gg.Brush BGR(255, 0, 0) 'GDI的颜色值。
      当前时间 = GetTickCount
      remainTime = maxTime - (当前时间-开始时间)/1000
      If remainTime < 0 Then
         remainTime = 0
      Else
         gg.DrawFrame 0, 0, 窗口宽度/maxTime * remainTime ,20
      End If
      gg.Font "黑体", 20
      gg.DrawString 100, 100, "程序运行了" & Int((当前时间-开始时间)/1000) & "秒"
      gg.Redraw
      Sleep 20
   Loop
End Sub

其中 GetTickCount 是系统API,获取系统开机以来的时间,毫秒为单位。有了毫秒级别,进度跳是丝滑了。下面我们把进度跳加入到游戏中。


全局变量

   Dim Shared maxTime    As Single  =20 ' 游戏允许的总时长
   Dim Shared remainTime As ULong '开始时间

其中,变量maxTime记录游戏允许的总时长,remainTime记录游戏开始时间

在start()初始化函数中,加大窗口高度用于显示倒计时进度条,并对时间变量进行初始化:

   remainTime = GetTickCount()

最后在show( )函数中添加代码绘制出倒计时进度条:

   Dim 窗口宽度 As Long = DpiUnScaleI(Form1.ScaleWidth)
   gg.Brush BGR(255, 0, 0) 'GDI的颜色值。
   Dim tt As Single = maxTime - (GetTickCount - remainTime) / 1000
   If tt < 0 Then
      tt = 0
   Else
      gg.DrawFrame 0, 230, 窗口宽度 / maxTime * tt, 20
   End If

评论一下?

OωO
取消