二、获取随机数
微软提供的Rnd函数将返回一个在(0,1)之间的随机数,然而,在我们得到一个随机数之前,建议先发出一个"Randomize Timer"命令,timer函数返回午夜0点以来时间所经历过的秒数,Randomize命令设置了一个随机数产生器的种子,不要研究其背后的深邃的原理,只要明白这个命令可以使我们每一次都可以得到一个不同的随机数就可以了。这也意味着每次星星的图案都不一样。为了进一步说明上面的意思,可以试着使用一个实际的数字代替’Timer’,然后研究一下星星的图案,可以发现每次运行程序星星的图案都是一样的。
让我们现在试着绘制包含一些星星的图案。首先开始一个新的工程,在窗体上分别放置一个图片框和一个命令按钮,在按钮的click事件中添加以下代码:
Private Sub Command1_Click() Randomize Timer Picture1.ScaleMode = vbPixels For starx = 0 To Picture1.ScaleWidth For stary = 0 To Picture1.ScaleHeight If Rnd < 0.005 Then SetPixelV Picture1.hdc, starx, stary, vbYellow End If Next Next End Sub |
运行你的程序,然后单击命令按钮,你将看到一个可爱的星星图案!
现在,我们需要做的最后一件事是为我们的飞船着陆准备一个平面,我们仍将坚持使用VB标准函数,而不使用任何API函数。这个函数的名字是Line,考虑到我们想要画的是一个方框,所以使用它看上去就有点奇怪,但不要介意,微软的开发人员已经重新对它进行了设计。
这个函数的具体用法是:
object.Line [Step] (x1, y1)-[Step] (x2, y2), [color], [B[F]] |
它看上去很复杂,但可以认为它仅画一根从点(x1,y1)到 (x2,y2),且具有颜色的直线,如果声明了"B",将画一个方框,而不是一个直线,如果额外说明了"F",这个方框将被填充。
我们的星空将仅仅是一个令人生厌的平面,但是你可以添加一些额外的功能,代码如下:
Picture1.Line (0, Picture1.ScaleHeight - 30)- (Picture1.ScaleWidth, Picture1.ScaleHeight), _ vbWhite, BF |
虽然结果不是很壮观,但是可以添加到你的星空代码当中,如果你喜欢看到它们。
由于我们要使用
定时器来绘制和移动飞船,因此,通过适当的方式来改变飞船的速度将非常明智。在
VB中没有检测是否有某一个键被按下的命令,所以我们必须依靠API函数:GetAsyncKeyState,如果规定的键没有按下,这个函数将返回0,否则将返回一个非零值。该函数声明如下:
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Private Const VK_DOWN = &H28 |
对于这个函数的vKey参数,代表某一个按键的数值将传递给它,这个数值被称为"
虚拟键盘码",键盘上的每一个键,包括左右方向键,"ctrls"和"alts"键都有一个"虚拟键盘码"。我们将使用向下的方向键作为飞船的
推进器。
下面是摘录的一个小片段代码:
If GetAsyncKeyState(VK_DOWN) <> 0 Then ’ Do thrust stuff Beep End If |
尽管上述代码不长,但它给出了一个基本思路。