VisualFreeBasic游戏趣味编程_6.6_函数封装多种绘制效果

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

对于圆心坐标(x,y)、半径r的圆,定义4个函数,可以实现不同的绘制效果:

'填充黄色圆绘制
Sub DrawCircles1(gg As yGDI, x As Long, y As Long, r As Long)
   gg.Pen 1, BGR(105, 105, 105) 'GDI的颜色值。
   gg.Brush BGR(204, 204, 0) 'GDI的颜色值。
   gg.DrawEllipse x - r, y - r, r * 2, r * 2
End Sub
'填充随机颜色圆绘制
Sub DrawCircles2(gg As yGDI, x As Long, y As Long, r As Long)
   gg.Pen 1, BGR(255, 255, 255) 'GDI的颜色值。
   Randomize
   Dim h As Long = Rnd *360
   gg.Brush HSBtoRGB_Gdi(HSB(h,60,80,255) ) 'GDI的颜色值。
   gg.DrawEllipse x - r, y - r, r * 2, r * 2
End Sub
'填充随机颜色同心圆绘制
Sub DrawCircles3(gg As yGDI, x As Long, y As Long, r As Long)
   gg.Pen 1, BGR(255, 255, 255) 'GDI的颜色值。
   While r > 0
      Randomize
      Dim h As Long = Rnd * 360
      gg.Brush HSBtoRGB_Gdi(HSB(h, 60, 80, 255)) 'GDI的颜色值。
      gg.DrawEllipse x - r, y - r, r * 2, r * 2
      r -= 5
   Wend 
End Sub
'随机颜色同心圆线条绘制
Sub DrawCircles4(gg As yGDI, x As Long, y As Long, r As Long)
   gg.Brush 
   While r > 0
      Randomize
      Dim h As Long = Rnd * 360
      gg.Pen 1,  HSBtoRGB_Gdi(HSB(h, 90, 80, 255)) 'GDI的颜色值。
      gg.DrawEllipse x - r, y - r, r * 2, r * 2
      r -= 5
   Wend 
End Sub

在主函数中首先生成[1,4]之间的随机数drawMode,然后根据drawMode的值分别调用不同的绘制函数,即可生成对应的绘制效果。

   For i = 0 To 圆的个数 -1
      Dim drawMode As Long = randBetweenMinMax(1, 4) ' 随机生成一种绘制模式
      ' 根据不同绘图模式进行绘制
      If (drawMode = 1) Then
         DrawCircles1(gg,圆心x(i), 圆心y(i), 半径(i))
      ElseIf (drawMode = 2) Then
         DrawCircles2(gg,圆心x(i), 圆心y(i), 半径(i))
      ElseIf (drawMode = 3) Then
         DrawCircles3(gg,圆心x(i), 圆心y(i), 半径(i))
      ElseIf (drawMode = 4) Then
         DrawCircles4(gg,圆心x(i), 圆心y(i), 半径(i))
      End If
   Next

绘制效果如图6-8所示。

完整代码

' 判断两个圆是否相交
Function isTwoCirclesIntersect(x1 As Long, y1 As Long,r1 As Long , x2 As Long, y2 As Long, r2 As Long ) As Long
   If (Dist2Points(x1, y1, x2, y2) < r1 + r2) Then Return 1 Else Return 0
End Function
' 求解两个点之间的距离
Function Dist2Points(x1 As Long, y1 As Long, x2 As Long, y2 As Long) As Long
   Dim result As Long
   result = Sqr((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2))
   Return result
End Function
'生成[min,max]之间的随机整数
Function randBetweenMinMax(小 As Long, 大 As Long) As Long
   Randomize 
   Dim r As Long = int(Rnd * (大 - 小 + 1)) + 小
   Return r
End Function
'填充黄色圆绘制
Sub DrawCircles1(gg As yGDI, x As Long, y As Long, r As Long)
   gg.Pen 1, BGR(105, 105, 105) 'GDI的颜色值。
   gg.Brush BGR(204, 204, 0) 'GDI的颜色值。
   gg.DrawEllipse x - r, y - r, r * 2, r * 2
End Sub
'填充随机颜色圆绘制
Sub DrawCircles2(gg As yGDI, x As Long, y As Long, r As Long)
   gg.Pen 1, BGR(255, 255, 255) 'GDI的颜色值。
   Randomize
   Dim h As Long = Rnd *360
   gg.Brush HSBtoRGB_Gdi(HSB(h,60,80,255) ) 'GDI的颜色值。
   gg.DrawEllipse x - r, y - r, r * 2, r * 2
End Sub
'填充随机颜色同心圆绘制
Sub DrawCircles3(gg As yGDI, x As Long, y As Long, r As Long)
   gg.Pen 1, BGR(255, 255, 255) 'GDI的颜色值。
   While r > 0
      Randomize
      Dim h As Long = Rnd * 360
      gg.Brush HSBtoRGB_Gdi(HSB(h, 60, 80, 255)) 'GDI的颜色值。
      gg.DrawEllipse x - r, y - r, r * 2, r * 2
      r -= 5
   Wend 
End Sub
'随机颜色同心圆线条绘制
Sub DrawCircles4(gg As yGDI, x As Long, y As Long, r As Long)
   gg.Brush 
   While r > 0
      Randomize
      Dim h As Long = Rnd * 360
      gg.Pen 1,  HSBtoRGB_Gdi(HSB(h, 90, 80, 255)) 'GDI的颜色值。
      gg.DrawEllipse x - r, y - r, r * 2, r * 2
      r -= 5
   Wend 
End Sub

Sub 游戏执行过程(hWndForm As hWnd)
   Dim gg           As yGDI = hWndForm
   Dim 圆心x(99)    As Long '数组存储所有圆心的x坐标
   Dim 圆心y(99)    As Long '数组存储所有圆心的y坐标
   Dim 半径(99)     As Long '数组存储所有圆的半径
   Dim 圆的个数     As Long = 0
   Dim 游戏W        As Long = DpiunScaleI(Form1.ScaleWidth) '游戏区的尺寸
   Dim 游戏H        As Long = DpiunScaleI(Form1.ScaleHeight)
   Dim 圆的最小半径 As Long = 5
   Dim 圆的最大半径 As Long = 40
   Dim circleNum    As Long  ' 生成的圆的个数
   Dim As Long x, y, r       ' 新增圆的圆心坐标、半径
   Dim isNewCircleOK As Long '用于判断新生成的圆是否OK
   '生成圆,把数据保存在数组中
   Dim i As Long
   While 圆的个数 < 100 '当圆的个数小于100时,循环运行
      isNewCircleOK = 0 ' 假设开始不OK
      While isNewCircleOK = 0 ' 当新生成的圆不OK时,重复生成新圆进行比较
         x = Int(Rnd *游戏W) '新圆的圆心x坐标
         y = Int(Rnd *游戏H) '新圆的圆心y坐标                '
         r = 圆的最小半径
         For i = 0 To 圆的个数 -1
            If isTwoCirclesIntersect(圆心x(i), 圆心y(i), 半径(i), x, y, r) Then Exit For ' 如果已有圆和新圆相交跳出循环,此时i<圆的个数
         Next
         If (i = 圆的个数) Then ' 如果上面for语句都不跳出,说明i等于circleNum
            isNewCircleOK = 1 ' 这个新生成的圆和已有圆都不相交
         End If
      Wend
      isNewCircleOK = 0 '  继续设为不OK,下面要让这个新圆的半径最大
      While isNewCircleOK = 0 And r < 圆的最大半径 ' 当不OK,并且新圆的半径小于最大半径时
         r += 1
         For i = 0 To 圆的个数 -1
            If isTwoCirclesIntersect(圆心x(i), 圆心y(i), 半径(i), x, y, r) Then
               isNewCircleOK = 1 ' 一旦和一个旧圆相交,这时新圆OK
               Exit For ' 因为新圆半径已经达到最大的情况,这时跳出循环
            End If
         Next
      Wend
      圆心x(圆的个数) = x '把新圆的圆心坐标添加到数组中
      圆心y(圆的个数) = y
      半径(圆的个数)  = r  '把新圆的半径添加到数组中
      圆的个数        += 1 '圆的个数+1
   Wend
   gg.Pen 1, BGR(105, 105, 105) 'GDI的颜色值。
   gg.Brush BGR(204, 204, 0) 'GDI的颜色值。
   For i = 0 To 圆的个数 -1
      Dim drawMode As Long = randBetweenMinMax(1, 4) ' 随机生成一种绘制模式
      ' 根据不同绘图模式进行绘制
      If (drawMode = 1) Then
         DrawCircles1(gg,圆心x(i), 圆心y(i), 半径(i))
      ElseIf (drawMode = 2) Then
         DrawCircles2(gg,圆心x(i), 圆心y(i), 半径(i))
      ElseIf (drawMode = 3) Then
         DrawCircles3(gg,圆心x(i), 圆心y(i), 半径(i))
      ElseIf (drawMode = 4) Then
         DrawCircles4(gg,圆心x(i), 圆心y(i), 半径(i))
      End If
   Next

End Sub

评论一下?

OωO
取消