图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
程序运行后输出如图

评论一下?