VisualFreeBasic的编程文档和教程
论坛的首页 勇芳的软件
教程和帮助
  • VisualFreeBasic编程文档
  • 勇芳系列软件帮助说明教程
  • 留言或交流 登录
    登录
    侧边栏壁纸
    博主头像
    勇芳

    • 累计撰写 330 篇文章
    • 累计收到 0 条评论
    • 首页
    • 栏目
      • 论坛的首页
      • 勇芳的软件
      • 教程和帮助
        • VisualFreeBasic编程文档
        • 勇芳系列软件帮助说明教程
      • 留言或交流
      • 登录
    VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_6.4_函数的定义与应用 2026-1-22
      VisualFreeBasic游戏趣味编程_6.4_函数的定义与应用 FB 程序是由函数组成的,每一个FB程序都包含这样的结构: Sub Form1_Shown(hWndForm As hWnd, UserData As Integer) Threaddetach ThreadCreate(Cast(Any Ptr, @游戏执行过程), hWndForm) End Sub Sub 游戏执行过程(hWndForm As hWnd) End Sub 在之前的章节中,我们已经调用了很多函数,比如,print()函数输出变量的值、fillcircle()函数画圆、abs()函数求绝对值等。我们也可以定义自己的函数并调用执行: Sub 游戏执行过程(hWndForm As hWnd) printStars() End Sub Sub printStars() Print "*****" End Sub 以上代码首先定义了函数Sub printStars()。其中,printStars为函数的名字,后面跟上圆括号,Sub 表示函数没有返回值。 End Sub是函数结束,从开始到结束是函数体,这里输出一行5个星号。 函数定义后,在主函数中printStars()调用函数,即执行了函数内部的所有语句。程序运行后输出: 练习题6-2:调用6-4-1.cpp中定义的函数,输出如下效果: 函数定义的括号内,还可以添加接受的参数,修改的代码如下,让用户设定要输出的星号的个数: Sub 游戏执行过程(hWndForm As hWnd) Dim i As Long For i = 1 To 4 printStars(i) Next End Sub Sub printStars(num As Long ) Print String(num, "*") End Sub Sub printStars(num As Long )表示函数接受整型变量num为参数,函数内部输出一行num个星号。调用函数时,括号内写不同的数字,就可以输出对应数字个数的星号。主函数中利用for语句,可以依次输出1~5个星号。程序运行后输出: * ** *** **** 函数也可以接受多个参数,参数间以逗号间隔。 Sub 游戏执行过程(hWndForm As hWnd) printStars("+",3) printStars("@",5) printStars("0",8) End Sub Sub printStars(ch As String , num As Long ) Print String(num, ch) End Sub 以上函数接受两个参数:ch为对应的字符、num为要输出的字符的个数。程序运行后,分别输出3个+、5个@、8个0。程序运行后输出: +++ @@@@@ 00000000 回顾求绝对值函数的用法: Dim x As Long = abs( -3) Print x 以上代码将函数计算结果返回并赋给变量x。同样,我们自定义的函数也可以定义返回值。以下代码定义了函数maxfun(),即返回两个整数中的最大值。 Sub 游戏执行过程(hWndForm As hWnd) Dim result As Long = maxfun(3, 5) Print result End Sub Function maxfun(x As Long ,y As Long ) As Long Dim max As Long = x If x < y Then max = y Return max End Function 程序运行后输出:5 函数定义Function maxfun() As Long中,尾部的As Long表示函数的返回值为整型。函数中首先求出参数x、y的最大值,赋给变量max。利用return max语句将计算结果max返回出来,同时退出maxfun()函数的运行。调用函数时,即可将函数的返回值赋给其他变量。 利用函数的返回值,也可以实现更复杂的功能,比如,以下代码可以求解3个数的最大值: Dim result As Long = maxfun(maxfun(3,5),4) 提示 当我们要解决的问题比较复杂时,可以把问题分块,使得每一块功能相对独立,用一个独立的函数来实现。用好函数可以降低程序设计的复杂性、提高代码的可靠性,避免程序开发的重复劳动,并易于程序维护和功能扩充。 回顾6-3,求解两个点之间的距离是一个常见的功能,所以可以将其封装为函数,方便多次调用: ' 求解两个点之间的距离 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 其中,sqr()为求平方根函数 进一步,定义函数判断图6-4中的两个圆是否相交,其中调用了刚定义的Dist2Points()函数。如果相交则返回1,函数退出;否则返回0。 ' 判断两个圆是否相交 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 生成两个数之间的随机整数也是一个常见的功能,可以封装为函数: '生成[min,max]之间的随机整数 Function randBetweenMinMax(小 As Long, 大 As Long) As Long Randomize Dim r As Long = int(Rnd * (大 - 小 + 1)) + 小 Return r End Function 利用上面定义的3个函数改进6.3节的代码,程序的结构会更加清晰,也更容易理解: ' 判断两个圆是否相交 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 游戏执行过程(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 = DpiScaleI(Form1.ScaleWidth) '游戏区的尺寸 Dim 游戏H As Long = DpiScaleI(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 =randBetweenMinMax(圆的最小半径,圆的最大半径) '新圆的半径 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 圆心x(圆的个数) = x '把新圆的圆心坐标添加到数组中 圆心y(圆的个数) = y 半径(圆的个数) = r '把新圆的半径添加到数组中 圆的个数 += 1 '圆的个数+1 Wend gg.Pen 1, BGR(105, 105, 105) 'GDI的颜色值。 gg.Brush BGR(204, 204, 0) 'GDI的颜色值。 For 圆的个数 = 1 To 100 gg.Cls For i = 0 To 圆的个数 -1 gg.DrawEllipse 圆心x(i) - 半径(i), 圆心y(i) - 半径(i), 半径(i) * 2, 半径(i) * 2 Next gg.DrawString 10, 10, Str(圆的个数) gg.Redraw Sleep 50 Next End Sub 提示 在FFB语言中,函数和变量一样都需要先定义、后使用。
      • 2026年-1月-22日
      • 45 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_6.3_新圆不和已有圆相交 2026-1-22
      VisualFreeBasic游戏趣味编程_6.3_新圆不和已有圆相交 假设有两个圆,其圆心坐标分别为(x1,y1)、(x2,y2),半径分别为r1、r2,如图6-4所示。 记录两个圆心之间距离的平方dist2 = (x1−x2)(x1−x2)+(y1−y2)(y1−y2)。当两个圆正好相切时,圆心距离平方r2 = (r1+r2)(r1+r2)。当dist2<r2时,两个圆相交。 每次随机生成一个新圆后,首先与所有已经生成的圆比较,如果和任何一个圆相交,则重新生成一个新圆;如果新圆和所有已生成的圆都不相交,则循环结束,将此新圆添加到数组中。完整代码参看 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 = DpiScaleI(Form1.ScaleWidth) '游戏区的尺寸 Dim 游戏H As Long = DpiScaleI(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 = Int(Rnd * (圆的最大半径 - 圆的最小半径 + 1)) + 圆的最小半径 '新圆的半径 For i = 0 To 圆的个数 -1 Dim dist2 As Long = (圆心x(i) - x) * (圆心x(i) - x) + (圆心y(i) - y) * (圆心y(i) - y) Dim r2 As Long = (半径(i) + r) * (半径(i) + r) If (dist2 < r2) Then ' 如果已有圆和新圆相交 Exit For '跳出循环,此时i<圆的个数 End If Next If (i = 圆的个数) Then ' 如果上面for语句都不跳出,说明i等于circleNum isNewCircleOK = 1 ' 这个新生成的圆和已有圆都不相交 End If 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 圆的个数 = 1 To 100 gg.Cls For i = 0 To 圆的个数 -1 gg.DrawEllipse 圆心x(i) - 半径(i), 圆心y(i) - 半径(i), 半径(i) * 2, 半径(i) * 2 Next gg.DrawString 10, 10, Str(圆的个数) gg.Redraw Sleep 100 Next End Sub 程序运行后输出如图
      • 2026年-1月-22日
      • 45 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_6.2_每次增加一个随机圆 2026-1-22
      VisualFreeBasic游戏趣味编程_6.2_每次增加一个随机圆 为了显示圆生成的过程,我们修改6-1的代码,实现每隔100毫秒,添加一个随机圆并绘制。完整代码参看 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 = 100 Dim 游戏W As Long = DpiScaleI(Form1.ScaleWidth) '游戏区的尺寸 Dim 游戏H As Long = DpiScaleI(Form1.ScaleHeight) Dim 圆的最小半径 As Long = 5 Dim 圆的最大半径 As Long = 40 '生成圆,把数据保存在数组中 Dim i As Long For i = 0 To 圆的个数 -1 圆心x(i) = Int(Rnd *游戏W) 圆心y(i) = Int(Rnd *游戏H) 半径(i) = Int(Rnd * (圆的最大半径 - 圆的最小半径 + 1)) + 圆的最小半径 Next gg.Pen 1, BGR(105, 105, 105) 'GDI的颜色值。 gg.Brush BGR(204, 204, 0) 'GDI的颜色值。 For 圆的个数 = 1 To 100 gg.Cls For i = 0 To 圆的个数 -1 gg.DrawEllipse 圆心x(i) - 半径(i), 圆心y(i) - 半径(i), 半径(i) * 2, 半径(i) * 2 Next gg.DrawString 10,10,Str(圆的个数) gg.Redraw Sleep 100 Next End Sub
      • 2026年-1月-22日
      • 48 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_6.1_利用数组记录多个随机圆 2026-1-22
      VisualFreeBasic游戏趣味编程_6.1_利用数组记录多个随机圆 本节讲解如何利用数组记录生成100个随机圆 首先定义3个数组存储所有圆的圆心坐标、半径: Dim 圆心x(99) As Long '数组存储所有圆心的x坐标 Dim 圆心y(99) As Long '数组存储所有圆心的y坐标 Dim 半径(99) As Long '数组存储所有圆的半径 设定圆的个数=100,在for循环中随机生成圆心坐标、半径,并存储在数组中: '生成圆,把数据保存在数组中 Dim i As Long For i = 0 To 圆的个数 -1 圆心x(i) = Int(Rnd *游戏W) 圆心y(i) = Int(Rnd *游戏H) 半径(i) = Int(Rnd * (圆的最大半径 - 圆的最小半径 + 1)) + 圆的最小半径 Next 然后对数组的所有元素进行遍历,即可绘制出所有圆的图案: gg.Pen 1, BGR(105, 105, 105) 'GDI的颜色值。 gg.Brush BGR(204,204,0) 'GDI的颜色值。 For i = 0 To 圆的个数 -1 gg.DrawEllipse 圆心x(i) -半径(i), 圆心y(i)-半径(i),半径(i)*2,半径(i)*2 Next 完整代码参看 Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Dim pi As Single = 3.1415926 / 180 Dim 圆心x(99) As Long '数组存储所有圆心的x坐标 Dim 圆心y(99) As Long '数组存储所有圆心的y坐标 Dim 半径(99) As Long '数组存储所有圆的半径 Dim 圆的个数 As Long = 100 Dim 游戏W As Long = DpiScaleI(Form1.ScaleWidth) '游戏区的尺寸 Dim 游戏H As Long = DpiScaleI(Form1.ScaleHeight) Dim 圆的最小半径 As Long = 5 Dim 圆的最大半径 As Long = 40 '生成圆,把数据保存在数组中 Dim i As Long For i = 0 To 圆的个数 -1 圆心x(i) = Int(Rnd *游戏W) 圆心y(i) = Int(Rnd *游戏H) 半径(i) = Int(Rnd * (圆的最大半径 - 圆的最小半径 + 1)) + 圆的最小半径 Next gg.Pen 1, BGR(105, 105, 105) 'GDI的颜色值。 gg.Brush BGR(204,204,0) 'GDI的颜色值。 For i = 0 To 圆的个数 -1 gg.DrawEllipse 圆心x(i) -半径(i), 圆心y(i)-半径(i),半径(i)*2,半径(i)*2 Next End Sub
      • 2026年-1月-22日
      • 57 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_第6章_“见缝插圆”游戏 2026-1-22
      VisualFreeBasic游戏趣味编程_第6章_“见缝插圆”游戏 在本章我们将探讨如何绘制一些漂亮的随机图案,如图6-1所示,随机生成的圆互不相交且尽量填满画布,按空格键可以切换不同的绘制模式。 本章首先分析了如何利用数组实现多个圆的生成和绘制,并使得圆和圆之间不相交;然后介绍了函数的概念、如何应用函数改进代码,以及如何实现添加新圆半径最大化的功能;最后讲解了如何利用函数封装多种绘制模式,并通过键盘按键进行互动。
      • 2026年-1月-22日
      • 67 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_5.7_得分与显示效果改进 2026-1-21
      VisualFreeBasic游戏趣味编程_5.7_得分与显示效果改进 定义整型变量记录游戏的得分,并初始化为0 Dim score As Long ' 得分 当用户按空格键并且游戏没有失败,则得分增加1: score = score + 1 ' 得分+1 最后将score转换为字符串输出: gg.Font "黑体", 14 gg.SetColor BGR(0,178,0) '文字颜色 gg.DrawString 5,90,"得分:" & score '显示得分 填充绘制圆盘,随着针数的增加,圆盘填充颜色越来越鲜艳: gg.Brush HSBtoRGB_Gdi(HSB(0,lineNum,100,255)) 将正在旋转的针的颜色设为蓝色,最新发射的针的颜色设为红色: If i = lineNum -1 Then gg.Pen 3, BGR(204, 0, 0) 添加发射针的动画 If 发射动画 Then gg.DrawLine 100 - 发射动画, 120, 60 + (100 - 发射动画), 120 发射动画 -= 2 最后执行结果,圈在旋转,按空格,针会扎过去。 完整代码 Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Dim pi As Single = 3.1415926 / 180 Dim lineLength As Long = 100 ' 针的长度 Dim As Long xEnd, yEnd ' 针的末端坐标(针起始位置为圆心) Dim lineNum As Long = 0 gg.Brush '不填充色彩 Dim rotateSpeed As Single = 0.5 Dim Angles(999) As Single Dim i As Long Dim score As Long ' 得分 Dim 发射动画 As Long Do gg.Cls gg.Font "黑体", 14 gg.SetColor BGR(0, 178, 0) '文字颜色 gg.DrawString 5, 90, "得分:" & score '显示得分 gg.Pen 3, 0 If 发射动画 Then gg.DrawLine 100 - 发射动画, 120, 60 + (100 - 发射动画), 120 发射动画 -= 2 If 发射动画 = 0 Then For i = 0 To lineNum -1 '如果两根针之间角度接近,认为碰撞,游戏失败 If Abs(Angles(i) -180) <= 0.6 Then rotateSpeed = 0 '旋转速度设为0 Exit For '不用再比较了,循环跳出 End If Next If rotateSpeed = 0 Then Exit Do '游戏结束 score = score + 1 ' 得分+1 Angles(lineNum) = 180 lineNum += 1 End If Else gg.DrawLine 0, 120, 60, 120 If IsKeyPress(VK_SPACE) Then '按下空格键 If lineNum < 1000 Then 发射动画 = 100 End If End If End If If lineNum Then '有针的情况 gg.Pen 3, BGR(0, 128, 255) For i = 0 To lineNum -1 Angles(i) = Angles(i) + rotateSpeed '角度增加 If Angles(i) > 360 Then Angles(i) = 0 xEnd = 200 + lineLength *Cos(Angles(i) * pi) '计算针的末端坐标 yEnd = 120 + lineLength *Sin(Angles(i) * pi) If i = lineNum -1 Then gg.Pen 3, BGR(204, 0, 0) gg.DrawLine 200, 120, xEnd, yEnd Next End If gg.Pen 2, BGR(255, 0, 0) gg.Brush HSBtoRGB_Gdi(HSB(0, lineNum, 100, 255)) gg.DrawEllipse 160, 80, 80, 80 gg.Redraw Sleep 10 Loop End Sub 作业:针扎失败后,可以搞一个爆炸效果动画。
      • 2026年-1月-21日
      • 43 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_5.6_游戏失败判断 2026-1-21
      VisualFreeBasic游戏趣味编程_5.6_游戏失败判断 当新增加的针和已有针发生碰撞时,游戏失败。在此设定当两根针的旋转角度差的绝对值小于0.5度时,认为两根针足够接近,即发生了碰撞,然后退出游戏循环 If IsKeyPress(VK_SPACE) Then '按下空格键 If lineNum < 1000 Then For i = 0 To lineNum -1 '如果两根针之间角度接近,认为碰撞,游戏失败 If Abs(Angles(i) -180) <= 0.6 Then rotateSpeed = 0 '旋转速度设为0 Exit For '不用再比较了,循环跳出 End If Next If rotateSpeed = 0 Then Exit Do '游戏结束 其中,新增加针的旋转角度是 180 度,Abs(Angles(i) -180)是和已有针的旋转角度差。abs( )为求绝对值的函数,即任何一个大于或等于0的数的绝对值是其自身,任何一个小于0的数的绝对值是其自身乘以-1 Sub 游戏执行过程(hWndForm As hWnd) Dim x As Long =-3 Dim y As Single =3.5 Print Abs(x) Print Abs(y) End sub 程序运行后输出: 3 3.5 当Abs(Angles(i) -180)成立时,认为新增加的针和已有针发生碰撞,即将旋转速度rotateSpeed设为0,所有针停止旋转。 此外,由于这时不需要再判断和其他针是否碰撞,因此使用Exit For语句,跳出当前for循环。 Sub 游戏执行过程(hWndForm As hWnd) Dim i As Long For i = 1 To 5 If i = 3 Then Exit For Print i Next End sub 程序运行后输出: 1 2 当i等于3时,运行Exit For语句,跳出for循环,则仅输出1、2两个数字。 还有一个continue;语句,表示跳过当次循环,循环语句继续运行。输入并运行以下代码 Sub 游戏执行过程(hWndForm As hWnd) Dim i As Long For i = 1 To 5 If i = 3 Then Continue For Print i Next End sub 程序运行后输出: 1 2 4 5 当i等于3时,运行continue For 语句,跳过当次for循环,继续运行下一次循环,则输出1、2、4、5这4个数字。 游戏失败后,rotateSpeed=0,然后退出游戏循环 If rotateSpeed = 0 Then Exit Do '游戏结束 全部成品代码 Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Dim pi As Single = 3.1415926 / 180 Dim lineLength As Long = 100 ' 针的长度 Dim As Long xEnd, yEnd ' 针的末端坐标(针起始位置为圆心) Dim lineNum As Long = 0 gg.Brush '不填充色彩 Dim rotateSpeed As Single = 0.5 Dim Angles(999) As Single Dim i As Long Do gg.Cls gg.Pen 3, BGR(0, 0, 0) '线宽为3,这样针看起来更明显 gg.DrawLine 0, 120, 60, 120 If IsKeyPress(VK_SPACE) Then '按下空格键 If lineNum < 1000 Then For i = 0 To lineNum -1 '如果两根针之间角度接近,认为碰撞,游戏失败 If Abs(Angles(i) -180) <= 0.6 Then rotateSpeed = 0 '旋转速度设为0 Exit For '不用再比较了,循环跳出 End If Next If rotateSpeed = 0 Then Exit Do '游戏结束 Angles(lineNum) = 180 lineNum += 1 Sleep 100 End If End If If lineNum Then '有针的情况 For i = 0 To lineNum -1 Angles(i) = Angles(i) + rotateSpeed '角度增加 If Angles(i) > 360 Then Angles(i) = 0 xEnd = 200 + lineLength *Cos(Angles(i) * pi) '计算针的末端坐标 yEnd = 120 + lineLength *Sin(Angles(i) * pi) gg.DrawLine 200, 120, xEnd, yEnd Next End If gg.Pen 2, BGR(255, 0, 0) '设置圆盘线条颜色为红色 gg.DrawEllipse 160, 80, 80, 80 gg.Redraw Sleep 10 Loop End Sub
      • 2026年-1月-21日
      • 54 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_5.5_针的发射与新增 2026-1-21
      VisualFreeBasic游戏趣味编程_5.5_针的发射与新增 首先在画面左边绘制一根针,表示待发射针的位置: gg.DrawLine 0, 120, 100, 120 假设初始状态下没有针在旋转: Dim lineNum As Long = 0 浮点数数组存储所有可能针的旋转角度,假设最多有1000根针 Dim Angles(999) As Single 当用户按下空格键时,针的个数加1,并且新增加的针初始角度为PI。用户不断按下空格键,即可持续生成新的针 If IsKeyPress(VK_SPACE) Then '按下空格键 If lineNum < 1000 Then Angles(lineNum) = 180 lineNum += 1 Sleep 100 End If End If 全部代码 Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Dim pi As Single = 3.1415926 / 180 Dim lineLength As Long = 100 ' 针的长度 Dim As Long xEnd, yEnd ' 针的末端坐标(针起始位置为圆心) Dim lineNum As Long = 0 gg.Brush '不填充色彩 Dim rotateSpeed As Single = 0.5 Dim Angles(999) As Single Dim i As Long Do gg.Cls gg.Pen 3, BGR(0, 0, 0) '线宽为3,这样针看起来更明显 gg.DrawLine 0, 120, 60, 120 If IsKeyPress(VK_SPACE) Then '按下空格键 If lineNum < 1000 Then Angles(lineNum) = 180 lineNum += 1 Sleep 100 End If End If If lineNum Then '有针的情况 For i = 0 To lineNum -1 Angles(i) = Angles(i) + rotateSpeed '角度增加 If Angles(i) > 360 Then Angles(i) = 0 xEnd = 200 + lineLength *Cos(Angles(i) * pi) '计算针的末端坐标 yEnd = 120 + lineLength *Sin(Angles(i) * pi) gg.DrawLine 200, 120, xEnd, yEnd Next End If gg.Pen 2, BGR(255, 0, 0) '设置圆盘线条颜色为红色 gg.DrawEllipse 160, 80, 80, 80 gg.Redraw Sleep 10 Loop End Sub
      • 2026年-1月-21日
      • 40 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_5.4_批量绘制函数 2026-1-21
      VisualFreeBasic游戏趣味编程_5.4_批量绘制函数 当绘制的元素较多时,会出现明显的画面闪烁,这时可以使用批量绘图函数。 以上情况是在使用普通绘图必须要做的事情。 然而我们用的是 yGDI 绘图类(可以查看 VFB代码绘图篇) Dim gg As yGDI 有缓冲,绘图快。不需要考虑这些问题。
      • 2026年-1月-21日
      • 60 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • VisualFreeBasic游戏趣味编程_5.3_利用数组实现多根针的绘制 2026-1-21
      VisualFreeBasic游戏趣味编程_5.3_利用数组实现多根针的绘制 要实现多根针的绘制,需要记录每根针的角度值。这一节将介绍数组的概念,读者可以输入并运行以下代码: Sub 游戏执行过程(hWndForm As hWnd) Dim a(2) As Long a(0) = 1 Print a(0) a(1) = 3 *a(0) Print a(1) a(2) = a(0) + a(1) Print a(2) End sub 程序运行后输出: 其中,Dim a(2) As Long定义了整型数组a,a一共有3个元素——a(0)、a(1)、a(2)。括号中的0、1、2称为数组的下标,从0开始编号,到数组元素个数减1。注意,数组的下标不能超出范围,否则软件会崩溃,这种错误称为数组越界。 数组元素和一般变量类似,比如,可以进行赋值(a(0)=1;),可以输出(print a(0),数组的元素之间也可以进行运算(a(2) = a(0)+a(1) 。 也可以在定义数组时对数组元素赋初始值,并利用for循环语句输出数组的所有元素: Sub 游戏执行过程(hWndForm As hWnd) Dim a(4) As Long= {1,3,5,7,9} Dim i As Long For i = 0 To 4 Print a(i) Next Dim b(4) As Long= {2,4,6} For i = 0 To 4 Print b(i) Next End Sub 程序运行后输出: 1 3 5 7 9 2 4 6 0 0 其中,Dim a(4) As Long= {1,3,5,7,9}表示定义数组a,并用括号里的5个整数对数组的5个元素进行初始化,然后利用for语句输出数组的所有元素值。 Dim b(4) As Long= {2,4,6}表示定义数组b,并用括号里面的3个整数对数组的前3个元素进行初始化,后面的两个元素值自动赋值为0。 除了可以定义整型数组,还可以定义字符型数组、浮点数数组。以下代码为求出浮点数数组中的最大值与最小值: Sub 游戏执行过程(hWndForm As hWnd) Dim a(7) As Single = {21.5, 13.7, 10.5, -7, 19, 20.5, -2.3, 13.2} Dim 最小 As Single = a(0) Dim 最大 As Single = a(0) Dim i As Long For i = 0 To 7 If a(i) < 最小 Then 最小 = a(i) If a(i) > 最大 Then 最大 = a(i) Next Print "最大值:" & 最大 & ",最小值:" & 最小 end sub 程序运行后输出:最大值:21.5,最小值:-7 练习题5-2: 定义浮点数数组存储7个元素——1.2、2.3、3.0、4.8、5.6、6.9、7.8,编程求解数组所有元素的平方和。 回到游戏,假设有20根针: Dim lineNum As Long = 20 定义浮点数数组存储所有针的旋转角度: Dim Angles(19) As Long 首先利用for循环语句,让数组中针的角度均匀分布 Dim i As Long For i = 0 To 19 Angles(i) = i * 18 Next 在do循环语句中,利用for语句让数组中所有针的角度值增加rotateSpeed,即可实现所有针的旋转与显示。完整代码参看 Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Dim pi As Single = 3.1415926 / 180 Dim lineLength As Long = 100 ' 针的长度 Dim As Long xEnd, yEnd ' 针的末端坐标(针起始位置为圆心) Dim lineNum As Long = 20 gg.Brush '不填充色彩 Dim rotateSpeed As Long = 1 Dim Angles(19) As Long Dim i As Long For i = 0 To 19 Angles(i) = i * 18 Next Do gg.Cls gg.Pen 3, BGR(0, 0, 0) '线宽为3,这样针看起来更明显 For i = 0 To 19 Angles(i) = Angles(i) + rotateSpeed '角度增加 If Angles(i) > 360 Then Angles(i) = 0 xEnd = 200 + lineLength *Cos(Angles(i) * pi) '计算针的末端坐标 yEnd = 120 + lineLength *Sin(Angles(i) * pi) gg.DrawLine 200, 120, xEnd, yEnd Next gg.Pen 2, BGR(255, 0, 0) '设置圆盘线条颜色为红色 gg.DrawEllipse 160, 80, 80, 80 gg.Redraw Sleep 10 Loop End Sub 运行效果是在旋转的
      • 2026年-1月-21日
      • 60 阅读
      • 0 评论
      VisualFreeBasic编程文档
    • 10
    • 11
    • 12
    • 13
    • 14
    博主栏壁纸
    博主头像 勇芳

    330 文章数
    0 评论量
    • QQ游戏大厅多开版_旧版_2012到2025版
    • 使用Sandboxie沙盒多开QQ游戏大厅
    • Sandboxie沙盒(隔离软件)
    人生倒计时
    最新评论
    链接
    • 公益·寻亲,让爱回家
    • Visual Basic6 语言和控件手册
    • CWindow类库帮助FreeBasic版
    • FreeBASIC 帮助文档中文版
    • Windows GDI 编程手册
    • Windows GDI+ 编程手册
    • SQLite3数据库API手册
    • WebBrowser控件编程手册
    • Win32API参考手册
    • Windows 编程宝典
    • WinHttp参考资料
    • WMI编程手册
    • VisualFreeBasic编程文档
    舔狗日记
    载入天数...载入时分秒...

    © 2025 勇芳软件工作室 版权所有

    ICP备案图标 浙ICP备11006222号-1 | 公安备案图标 33100402331731号

    powered by emlog 浙ICP备11006222号-1