VisualFreeBasic游戏趣味编程_8.1_结构体

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

图8-1中的绘制单元由一个白色圆圈、一个红色指针组成。记录白色圆圈的信息需要定义3个变量:

 Dim As Long x,y  '小圆圈的圆心坐标
 Dim As Long r ' 小圆圈半径

红色指针起点在圆心,长度为圆半径,其角度只能有0、90、180、270 这4种可能。定义取值范围为[0,3]的整型变量angleNum

Dim As Long angleNum ' 对应的角度种类,只能是0、1、2、3,表示对应的4个角度值

要记录图8-1中的5行5列所有圆圈信息,我们可以采用数组的形式:

 Dim As Long x(24),y(24)  '小圆圈的圆心坐标
 Dim As Long r(24) ' 小圆圈半径
 Dim As Long angleNum(24) ' 对应的角度种类,只能是0、1、2、3,表示对应的4个角度值

数组可以处理大量的同类型数据,其中每一个元素都属于同一种数据类型。而利用结构体,可以将一个物体的不同类型数据集合在一起,形成一个整体,使代码更加直观、简洁:

Type Round '定义结构体,用来表示带角度指示的小圆圈
   As Long x, y '小圆圈的圆心坐标
   As Long r        ' 小圆圈半径
   angleNum As Long ' 对应的角度种类,只能是0、1、2、3,表示对应的4个角度值
End Type 

其中,Type 是定义结构体的关键词,Round是自定义的结构体类型名。 内定义了结构体的成员变量,成员变量的数据类型可以不同。最后 End Type 结束

定义结构体类型Round后,我们就可以用Round来定义变量:

Dim Rounds As Round '定义结构体变量

Round 可以理解为一种Round类型的变量,可以通过如下形式设定round的成员变量:

   Rounds.x = 300 '设定小圆圈的圆心坐标
   Rounds.y =300
   Rounds.r=30  '设定小圆圈的半径 
   Rounds.angleNum = 270 

也可以通过访问round的成员变量,绘制出对应的小圆圈:

Sub show(gg As yGDI) '绘制函数
   gg.Cls BGR(0, 0, 0) '背景为黑色
   Dim Rounds As Round '定义结构体变量
   Rounds.x        = 100 '设定小圆圈的圆心坐标
   Rounds.y        = 100
   Rounds.r        = 30 '设定小圆圈的半径
   Rounds.angleNum = 270
   gg.Pen 1, BGR(255, 255, 255) '设置圆圈颜色为白灰色
   gg.Brush '无填充
   gg.DrawEllipse Rounds.x - Rounds.r, Rounds.y - Rounds.r, Rounds.r * 2, Rounds.r * 2 '画小圆圈
   '用三角函数,画出这根红线
   gg.Pen 1, BGR(255, 51, 51) 'GDI的颜色值。
   gg.DrawLine Rounds.x, Rounds.y, Rounds.x + Rounds.r *Cos(Rounds.angleNum * (3.1415926 / 180)) ,Rounds.y + Rounds.r *Sin(Rounds.angleNum * (3.1415926 / 180))
   gg.Redraw
End Sub

绘制效果

进一步,定义结构体二维数组,存储图8-1中5行5列所有圆圈的信息:

   Rounds(i, j).x        = 100 '设定小圆圈的圆心坐标  
   Rounds(i, j).y        = 200
   Rounds(i, j).r        = 30 '设定小圆圈的半径
   Rounds(i, j).angleNum = 270

利用结构体二维数组和游戏开发框架,实现代码如下

Type Round '定义结构体,用来表示带角度指示的小圆圈
   As Long x, y '小圆圈的圆心坐标
   As Long r        ' 小圆圈半径
   angleNum As Long ' 对应的角度种类,只能是0、90、180、270,表示对应的4个角度值
End Type 
'全局变量定义
Dim Shared Rounds(4, 4) As Round '定义结构体变量

Sub startup(gg As yGDI) '初始化函数
   Dim i As Long
   Dim j As Long
   For i = 0 To 4
      For j = 0 To 4
         Rounds(i, j).x        = j * 45 + 45 '设定小圆圈的圆心坐标
         Rounds(i, j).y        = i * 45 + 45
         Rounds(i, j).r        = 15 '设定小圆圈的半径
         Rounds(i, j).angleNum = 270
      Next
   Next

End Sub

Sub show(gg As yGDI) '绘制函数
   gg.Cls BGR(0, 0, 0) '背景为黑色
   Dim i As Long
   Dim j As Long
   '对所有小圆圈遍历
   For i = 0 To 4
      For j = 0 To 4
         gg.Pen 1, BGR(255, 255, 255) '设置圆圈颜色为白灰色
         gg.Brush '无填充
         gg.DrawEllipse Rounds(i, j).x - Rounds(i, j).r, Rounds(i, j).y - Rounds(i, j).r, Rounds(i, j).r * 2, Rounds(i, j).r * 2 '画小圆圈
         '用三角函数,画出这根红线
         gg.Pen 1, BGR(255, 51, 51) 'GDI的颜色值。
         gg.DrawLine Rounds(i, j).x, Rounds(i, j).y, Rounds(i, j).x + Rounds(i, j).r *Cos(Rounds(i, j).angleNum * (3.1415926 / 180)), _
            Rounds(i, j).y + Rounds(i, j).r *Sin(Rounds(i, j).angleNum * (3.1415926 / 180))
      Next
   Next
   gg.Redraw
End Sub

Sub updateWithoutInput() '与输入无关的更新

   Sleep 10  '暂停若干毫秒
End Sub

Sub updateWithInput() ' 和输入有关的更新

End Sub

Sub 游戏执行过程(hWndForm As hWnd)
   Dim gg As yGDI = hWndForm
   startup(gg) '初始化函数,仅执行一次
   Do
      show(gg) ' 进行绘制
      updateWithInput()    ' 和输入有关的更新
      updateWithoutInput() ' 和输入无关的更新
   Loop
End Sub

程序运行后输出如图

评论一下?

OωO
取消