论坛的首页
勇芳的软件
教程和帮助
VisualFreeBasic编程文档
勇芳系列软件帮助说明教程
留言或交流
登录
搜索
登录
搜索
勇芳
累计撰写
332
篇文章
累计收到
0
条评论
首页
栏目
论坛的首页
勇芳的软件
教程和帮助
VisualFreeBasic编程文档
勇芳系列软件帮助说明教程
留言或交流
登录
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_4.1_绘制扇形
“旋转蛇”错觉图片可由不同颜色的扇形组合而成。 VFB里并没有画扇形,需要自己写一个过程,照抄下面代码即可。 Sub 画扇形(gg As yGDI, 圆心x As Long, 圆心y As Long, 半径 As Long, 开始角度 As Long, 结束角度 As Long, 填充颜色 As Long) Dim As Long 圆x, 圆y, 圆r, 圆b, 开始x, 开始y, 结束x, 结束y Dim pi As Single = 3.1415926 / 180 圆x = 圆心x - 半径 圆y = 圆心y - 半径 圆r = 圆心x + 半径 圆b = 圆心y + 半径 开始x = 圆心x + 半径 *Cos(开始角度 * pi) 开始y = 圆心y + 半径 *Sin(开始角度 * pi) 结束x = 圆心x + 半径 *Cos(结束角度 * pi) 结束y = 圆心y + 半径 *Sin(结束角度 * pi) gg.Brush 填充颜色 Pie gg.m_Dc,DpiScaleI(圆x), DpiScaleI(圆y), DpiScaleI(圆r), DpiScaleI(圆b), DpiScaleI(开始x), DpiScaleI(开始y), DpiScaleI(结束x), DpiScaleI(结束y) End Sub Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm 画扇形(gg,120,120,110, 0,90,BGR(255,26,26)) End Sub 输入并运行代码,即可绘制出所示的图形 提示: 代码中的 DpiScaleI(圆x),... 是为了支持自动响应 系统DPI ,让自己写的软件,不管拿到什么电脑上,都显示效果一样。
2026年-1月-21日
96 阅读
0 评论
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_第4章_“旋转蛇”错觉
在本章我们将讲解如何绘制非常神奇的错觉图片,如图4-1所示,静止的圆盘看起来却有在转动的错觉。 本章首先介绍了扇形函数和RGB颜色模型,解析了一个基本单元的绘制方式;然后介绍了for循环语句和循环的嵌套,解析了多层圆盘的绘制方式;最后介绍了HSV颜色模型,并利用随机函数和按键切换,解析了丰富多变的“旋转蛇”错觉图案的绘制方式。
2026年-1月-21日
150 阅读
0 评论
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_3.7_避免空中起跳
在这一节,我们处理一个游戏中的小bug,避免小球在空中还能继续起跳。 首先,定义变量isBallOnFloor记录小球是否在地面上,并初始化为1,表示开始小球在地面上: Dim isBallOnFloor As Long = 1 '小球是否在地面上,避免重复起跳 当用户按下空格键时,必须同时满足isBallOnFloor为1,才让小球起跳。起跳后,设定isBallOnFloor = 0,表示目前小球不在地面上了: If IsKeyPress(VK_SPACE) And isBallOnFloor =1 Then '按下了空格键" ball_vy = -16 ' 给小球一个向上的初速度 isBallOnFloor = 0 '表示小球不在地面了,不能重复起跳 End If 当小球再次落到地面上后,设定isBallOnFloor = 1,表示目前小球又重新到了地面上,可以起跳了: If (ball_y >= hh - radius) Then '如果小球落到地面上 ball_vy = 0 'y速度为0 ball_y = hh - radius ' 规范其y坐标,避免落到地面下 isBallOnFloor = 1 ' 表示小球在地面上 End If 完整代码,玩家可以根据随机方块的高度、速度,选择合适的起跳时机,让小球躲避方块。 Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Dim As Single ww, hh, gravity '重力加速度 Dim As Single ball_x, ball_y, ball_vy, radius '小球坐标、y方向速度、直径 ww = DpiUnScaleF(Form1.ScaleWidth) '游戏画面宽度 hh = DpiUnScaleF(Form1.ScaleHeight) '游戏画面高度 radius = 20 '小球直径 ball_x = ww / 4 '小球x位置 ball_y = hh - radius '小球y位置 ball_vy = 0 ' 小球初始y速度为0 Dim As Single rect_left_x, rect_top_y, rect_width, rect_height, rect_vx ' 方块障碍物的相关参数 rect_height = 100 ' 方块高度 rect_width = 20 ' 方块宽度 rect_left_x = ww * 3 / 4 ' 方块左边x坐标 rect_top_y = hh - rect_height '方块顶部y坐标 rect_vx = -3 '方块x方向速度 Dim score As Long = 0 '得分 Dim isBallOnFloor As Long = 1 '小球是否在地面上,避免重复起跳 Do If IsKeyPress(VK_SPACE) And isBallOnFloor =1 Then '按下了空格键" ball_vy = -16 ' 给小球一个向上的初速度 isBallOnFloor = 0 '表示小球不在地面了,不能重复起跳 End If ball_vy = ball_vy + gravity ' 根据重力加速度更新小球y方向速度 ball_y = ball_y + ball_vy ' 根据小球y方向速度更新其y坐标 If (ball_y >= hh - radius) Then '如果小球落到地面上 ball_vy = 0 'y速度为0 ball_y = hh - radius ' 规范其y坐标,避免落到地面下 isBallOnFloor = 1 ' 表示小球在地面上 End If If ball_y < 0 Then '小球跳起到顶部,让小球掉下来 ball_y = 0 ball_vy = 2 gravity = 0.5 End If gg.Brush(&HFF0000) '球的颜色 gg.DrawEllipse(100, ball_y, radius, radius) '画小球 rect_left_x = rect_left_x + rect_vx ' 方块向左移 If (rect_left_x <= -20) Then '如果方块跑到最左边 score = score + 1 ' 得分+1 rect_left_x = ww ' 在最右边重新出现 Randomize rect_height = Int(Rnd * (hh / 2 - hh / 4)) + hh / 2 Randomize rect_vx = - (Int(Rnd * 4) + 3) ' 3 到 7 之间 rect_top_y = hh - rect_height '方块顶部y坐标 End If gg.Brush(BGR(204, 0, 0)) '方块的颜色 gg.DrawFrame(rect_left_x, rect_top_y, rect_width, rect_height) '画方块 gg.Font "黑体",14 gg.DrawString 10,10,score '显示得分 gg.Redraw '刷新显示画面 '如果小球碰到方块 If ((rect_left_x <= ball_x + radius) And _ (rect_left_x + rect_width >= ball_x ) And _ (hh - rect_height <= ball_y + radius)) Then score = 0 ' 得分清零 Sleep(200) ' 慢动作效果 Else Sleep(10) '暂停10毫秒 End If gg.Cls() '清空画面 Loop End Sub
2026年-1月-21日
101 阅读
0 评论
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_3.6_得分的计算与显示
定义整型变量记录游戏的得分,并初始化为0: Dim score As Long = 0 '得分 当方块跑到画面最左边时,得分增加1: If (rect_left_x <= -20) Then '如果方块跑到最左边 score = score + 1 ' 得分+1 当方块碰到小球时,得分清零: '如果小球碰到方块 If ((rect_left_x <= ball_x + radius) And _ (rect_left_x + rect_width >= ball_x ) And _ (hh - rect_height <= ball_y + radius)) Then score = 0 ' 得分清零 Sleep(200) ' 慢动作效果 Else Sleep(10) '暂停10毫秒 End If 另外,文字输出功能 gg.DrawString 10,10,score '显示得分 代码写在刷新显示之前 gg.Brush(BGR(204, 0, 0)) '方块的颜色 gg.DrawFrame(rect_left_x, rect_top_y, rect_width, rect_height) '画方块 gg.DrawString 10,10,score '显示得分 gg.Redraw '刷新显示画面 也可以先设置字体和大小 gg.Font "黑体",14 gg.DrawString 10,10,score '显示得分 最后执行效果: 完整代码: Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Dim As Single ww, hh, gravity '重力加速度 Dim As Single ball_x, ball_y, ball_vy, radius '小球坐标、y方向速度、直径 ww = DpiUnScaleF(Form1.ScaleWidth) '游戏画面宽度 hh = DpiUnScaleF(Form1.ScaleHeight) '游戏画面高度 radius = 20 '小球直径 ball_x = ww / 4 '小球x位置 ball_y = hh - radius '小球y位置 ball_vy = 0 ' 小球初始y速度为0 Dim As Single rect_left_x, rect_top_y, rect_width, rect_height, rect_vx ' 方块障碍物的相关参数 rect_height = 100 ' 方块高度 rect_width = 20 ' 方块宽度 rect_left_x = ww * 3 / 4 ' 方块左边x坐标 rect_top_y = hh - rect_height '方块顶部y坐标 rect_vx = -3 '方块x方向速度 Dim score As Long = 0 '得分 Do If IsKeyPress(VK_SPACE) Then '按下了空格键" ball_vy = -16 ' 给小球一个向上的初速度 End If ball_vy = ball_vy + gravity ' 根据重力加速度更新小球y方向速度 ball_y = ball_y + ball_vy ' 根据小球y方向速度更新其y坐标 If (ball_y >= hh - radius) Then '如果小球落到地面上 ball_vy = 0 'y速度为0 ball_y = hh - radius ' 规范其y坐标,避免落到地面下 End If If ball_y < 0 Then '小球跳起到顶部,让小球掉下来 ball_y = 0 ball_vy = 2 gravity = 0.5 End If gg.Brush(&HFF0000) '球的颜色 gg.DrawEllipse(100, ball_y, radius, radius) '画小球 rect_left_x = rect_left_x + rect_vx ' 方块向左移 If (rect_left_x <= -20) Then '如果方块跑到最左边 score = score + 1 ' 得分+1 rect_left_x = ww ' 在最右边重新出现 Randomize rect_height = Int(Rnd * (hh / 2 - hh / 4)) + hh / 2 Randomize rect_vx = - (Int(Rnd * 4) + 3) ' 3 到 7 之间 rect_top_y = hh - rect_height '方块顶部y坐标 End If gg.Brush(BGR(204, 0, 0)) '方块的颜色 gg.DrawFrame(rect_left_x, rect_top_y, rect_width, rect_height) '画方块 gg.Font "黑体",14 gg.DrawString 10,10,score '显示得分 gg.Redraw '刷新显示画面 '如果小球碰到方块 If ((rect_left_x <= ball_x + radius) And _ (rect_left_x + rect_width >= ball_x ) And _ (hh - rect_height <= ball_y + radius)) Then score = 0 ' 得分清零 Sleep(200) ' 慢动作效果 Else Sleep(10) '暂停10毫秒 End If gg.Cls() '清空画面 Loop End Sub
2026年-1月-21日
103 阅读
0 评论
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_3.5_随机方块的速度和高度
为了增加游戏的趣味性,可以添加一定的随机性。首先输入并运行代码 Sub 游戏执行过程(hWndForm As hWnd) Print Rnd Print Rnd Print Rnd End Sub rnd()函数可以生成随机数,程序运行后输出一些随机数: 为了得到设定范围内的随机数(比如:0~100),我们需要乘法。输入并运行代码 Sub 游戏执行过程(hWndForm As hWnd) Print Rnd *100 Print Rnd *100 Print Rnd *100 End Sub 程序运行后输出(是 0 和 100之间,但不包括 0 和 100) 最后会发现,随机数,运行一次软件,第一个,第二个 数 都是一样的,为了每次都不一样,需要初始化 Randomize Sub 游戏执行过程(hWndForm As hWnd) Randomize Print Rnd * 100 Randomize Print Rnd * 100 Randomize Print Rnd *100 End Sub 现在每次都不一样了。 如果不需要小数,需要整数,就增加转换函数:Int Sub 游戏执行过程(hWndForm As hWnd) Randomize Print Int(Rnd * 100) Randomize Print Int(Rnd * 100) Randomize Print Int(Rnd * 100) 运行结果,整数是结果是 0~99 ,就是 Rnd *100 结果是永远不会出现 100 。 当方块重新出现时,添加代码设置其随机高度范围为height/4到height/2,随机速度为-3到-7,添加代码如下: If (rect_left_x <= -20) Then '如果方块跑到最左边 rect_left_x = ww ' 在最右边重新出现 Randomize rect_height = Int(Rnd * (hh / 2 - hh / 4)) + hh / 2 Randomize rect_vx = - (Int(Rnd * 4) + 3) ' 3 到 7 之间 rect_top_y = hh - rect_height '方块顶部y坐标 End If 好了,把代码复制去使用吧。
2026年-1月-21日
103 阅读
0 评论
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_3.4_小球和方块的碰撞判断
图3-5列出了小球和方块发生碰撞的3种边界情况,由图分析可认为小球和方块发生碰撞需同时满足以下3个条件。 (a)rect_left_x <= ball_x + radius(方块最左边在小球最右边的左侧或二者x坐标相同)。 (b)rect_left_x + rect_width >= ball_x - radius(方块最右边在小球最左边的右侧或二者x坐标相同)。 (c)height - rect_height <= ball_y + radius(方块最上边在小球最下边的上侧或二者y坐标相同)。 利用C语言提供的3种逻辑运算符:Not(非)、And(与)、Or(或),我们可以实现多个逻辑条件的组合。输入并运行如下代码: Sub 游戏执行过程(hWndForm As hWnd) Print 2 > 3 Print 5 < 6 Print Not(2 > 3) Print 2 > 3 And 5 < 6 Print 2 > 3 Or 5 < 6 End Sub 程序运行后输出: FB语言中0表示假,-1表示真,因此 print 2>3 输出0,print 5<6 输出-1。 逻辑非运算符 Not 会把真变成假,把假变成真。(2>3)为假,则Not(2>3)为真,print Not(2>3)输出-1。 逻辑与运算符 And 只有当两边的条件都是真时,组合条件才是真。(2>3)为假,(5<6)为真,则(2>3) And (5<6)为假,因此print (2>3) And (5<6) 输出0。 逻辑或运算符 Or 只要两边的条件有一个是真时,组合条件就是真。(5<6)为真,则 (2>3)Or(5<6)为真,因此print (2>3)Or(5<6) 输出-1。 利用逻辑与运算符,在3-3-2基础上添加如下代码,即可实现小球和方块的碰撞判断。当发生碰撞时,利用Sleep( )函数实现类似慢动作的效果: '如果小球碰到方块 If ((rect_left_x <= ball_x + radius) And _ (rect_left_x + rect_width >= ball_x ) And _ (hh - rect_height <= ball_y + radius) ) Then Sleep(200) ' 慢动作效果 Else Sleep(10) '暂停10毫秒 End If 提示 可将过长的FB语言代码分成多行来写,便于规范化与阅读理解。如上面代码 And _ 后面下划线,表示多行。 作业: 以上碰撞代码,应该增加在什么地方?然后运行看效果。
2026年-1月-21日
106 阅读
0 评论
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_3.3_方块的绘制与移动
函数gg.DrawFrame(x,y,w,h)可以绘制矩形,其中(x,y)为矩形左上角的(x,y)坐标,(w,h)为矩形的宽度和高度,单位全部是像素。在3-2的基础上添加以下代码: Dim As Single rect_left_x, rect_top_y, rect_width, rect_height ' 方块障碍物的相关参数 rect_height = 100 ' 方块高度 rect_width = 20 ' 方块宽度 rect_left_x = ww * 3 / 4 ' 方块左边x坐标 rect_top_y = hh - rect_height '方块顶部y坐标 '画方块 gg.DrawFrame(rect_left_x, rect_top_y, rect_width, rect_height) 进一步,添加变量rect_vx记录方块在x方向上的速度,并初始化为-3。在ddo语句中,让方块从右向左移动。当方块到达窗口最左边时,再让其从最右边出现。 完整代码 Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm Dim As Single ww, hh, gravity '重力加速度 Dim As Single ball_x, ball_y, ball_vy, radius '小球坐标、y方向速度、直径 ww = DpiUnScaleF(Form1.ScaleWidth) '游戏画面宽度 hh = DpiUnScaleF(Form1.ScaleHeight) '游戏画面高度 radius = 20 '小球直径 ball_x = ww / 4 '小球x位置 ball_y = hh - radius '小球y位置 ball_vy = 0 ' 小球初始y速度为0 Dim As Single rect_left_x, rect_top_y, rect_width, rect_height,rect_vx ' 方块障碍物的相关参数 rect_height = 100 ' 方块高度 rect_width = 20 ' 方块宽度 rect_left_x = ww * 3 / 4 ' 方块左边x坐标 rect_top_y = hh - rect_height '方块顶部y坐标 rect_vx = -3 '方块x方向速度 Do If IsKeyPress(VK_SPACE) Then '按下了空格键" ball_vy = -16 ' 给小球一个向上的初速度 End If ball_vy = ball_vy + gravity ' 根据重力加速度更新小球y方向速度 ball_y = ball_y + ball_vy ' 根据小球y方向速度更新其y坐标 If (ball_y >= hh - radius) Then '如果小球落到地面上 ball_vy = 0 'y速度为0 ball_y = hh - radius ' 规范其y坐标,避免落到地面下 End If If ball_y < 0 Then '小球跳起到顶部,让小球掉下来 ball_y = 0 ball_vy = 2 gravity = 0.5 End If gg.Brush(&HFF0000) '球的颜色 gg.DrawEllipse(100, ball_y, radius, radius) '画小球 rect_left_x = rect_left_x + rect_vx ' 方块向左移 If (rect_left_x <= -20) Then '如果方块跑到最左边 rect_left_x = ww ' 在最右边重新出现 End If gg.Brush(BGR(204,0,0)) '方块的颜色 gg.DrawFrame(rect_left_x, rect_top_y, rect_width, rect_height) '画方块 gg.Redraw '刷新显示画面 Sleep(10) '暂停10毫秒 gg.Cls() '清空画面 Loop End Sub
2026年-1月-21日
98 阅读
0 评论
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_3.2_按空格键控制小球起跳
结合2-9与3-1,以下代码让小球初始在地面上,按下空格键后起跳,落地后小球静止。在2-9的基础上,把窗口宽度、高度、小球半径等数值均用变量表示,这样代码更易阅读与调整,如3-2所示。 Sub 游戏执行过程(hWndForm As hWnd) Dim gg As yGDI = hWndForm gg.Brush(&HFF0000) '球的颜色 Dim As Single ww, hh, gravity '重力加速度 Dim As Single ball_x, ball_y, ball_vy, radius '小球坐标、y方向速度、直径 ww = DpiUnScaleF(Form1.ScaleWidth) '游戏画面宽度 hh = DpiUnScaleF(Form1.ScaleHeight) '游戏画面高度 radius = 20 '小球直径 ball_x = ww / 4 '小球x位置 ball_y = hh - radius '小球y位置 ball_vy = 0 ' 小球初始y速度为0 Do If IsKeyPress(VK_SPACE) Then '按下了空格键" ball_vy = -16 ' 给小球一个向上的初速度 End If ball_vy = ball_vy + gravity ' 根据重力加速度更新小球y方向速度 ball_y = ball_y + ball_vy ' 根据小球y方向速度更新其y坐标 If (ball_y >= hh - radius) Then '如果小球落到地面上 ball_vy = 0 'y速度为0 ball_y = hh - radius ' 规范其y坐标,避免落到地面下 End If If ball_y < 0 Then '小球跳起到顶部,让小球掉下来 ball_y =0 ball_vy = 2 gravity = 0.5 End If gg.DrawEllipse(100, ball_y, radius, radius) '画小球 gg.Redraw '刷新显示画面 Sleep(10) '暂停10毫秒 gg.Cls() '清空画面 Loop End Sub 程序运行后输出如图所示:
2026年-1月-21日
120 阅读
0 评论
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_3.1_字符
除了整型(Long)、浮点型(Single),C语言还提供了字符型(String)数据类型。输入并运行以下代码: Sub 游戏执行过程(hWndForm As hWnd) Print "文字" Dim c As String c = "中文" Print c End Sub 程序运行后输出: 提示 当输出区内容很多,不利于我们查看打印输出内容,可以点清除按钮,清除内容。 不清除,每次输出的内容都会被保留,最多保留最近1000个 常见的字符包括英文字母、数字、标点符号、空格、回车等。双引号包含的一个字符,如“a”、“B”、“1”、“@” 、“ ”(空格)等都为字符常量。 String 为定义字符型变量的关键词,Dim c As String定义了字符型变量c,c = "中文"对字符型变量进行赋值。 检测按键被按下 Sub 游戏执行过程(hWndForm As hWnd) Do If IsKeyPress(VK_SPACE) Then Print "按下了空格键" Sleep 100 Loop End Sub IsKeyPress 是检查按键是否被按下函数,什么按键对应什么参数,需要查看微软网站。 https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes 运行软件后,按下 空格键 ,看看是否有打印输出
2026年-1月-21日
97 阅读
0 评论
VisualFreeBasic编程文档
2026-1-21
VisualFreeBasic游戏趣味编程_第3章_“别碰方块”游戏”
在本章我们将探讨如何实现一个小球跳跃躲避方块的游戏,如图3-1所示。 本章首先介绍了字符的知识,按空格键控制小球起跳;然后介绍了矩形的绘制,并利用逻辑运算符解析如何实现小球和方块的碰撞判断;接着介绍了整除、取余和类型转换,以及如何利用随机数增加游戏的趣味性;最后分析了得分的计算显示实现方式,解决了小球在空中起跳的问题。
2026年-1月-21日
108 阅读
0 评论
VisualFreeBasic编程文档
12
13
14
15
16