VBGood网站全文搜索 Google

搜索VBGood全站网页(全文搜索)
首页 - 经验之谈 - 从作一个小游戏开始
发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:11217, 日期:2002-01-23
从作一个小游戏开始


--------------------------------------------------------------------------------

作者:指针   
                               从作一个小游戏开始
                                            作者:指针
     本文从制作一个简单的小游戏开始,通过扩展这游戏,讲解VB多媒体,键盘控制与一些相关技术。这是个类似打飞机的游戏,运行界面见图。
     图1
     
     这个游戏程式包括下列对象:
     
     Table1
     
     1、操作对象Fight的键盘控制:
     VB中的窗口键盘控制可使用Form_KeyUp(松开)与Form_KepDown(窗口按下)事件,其语法是:
     
     Private Sub Form_KeyUp(keycode As Integer, shift As Integer)
     Private Sub Form_KeyDown(keycode As Integer, shift As Integer)
     
     KeyCode参数是返回所按键的ASCII代码。在VB中可使用其预定义的常数来替代这些ASCII代码,如vbKeyLeft即指左箭头键(LEFT ARROW )的ASCII值37。
     Shift参数是在响应SHIFT ,CTRL 和 ALT 键的状态的一个整数,分别对应于值 1、2 和 4,即二进制得1,10,100。如果 SHIFT、CTRL 和 ALT 这三个键都被按下,则 Shift 的值为 7(二进制111)。同理如果 CTRL 和 ALT 这两个键都被按下,则 Shift 的值为 6(二进制110)。可对其进行位屏蔽,即二进制的特定位的‘与’运算来确定相应的键是否按下。如判断CTRL键其语法为Shift AND 2(可用预定义的vbCtrlMask常数替代)是否为真。
     注意,当窗口的KeyPreview 属性被设置为False时,Form_KeyUp、Form_KepDown事件将被忽略。
     Fight对象的移动可通过修改LEFT属性设置对象内部的左边与窗口的左边之间的距离位置,Top属性设置对象的内顶部和窗口的顶边之间的距离来实现。
     具体实现代码:
     
     Option Explicit
     Private Ctrldown As Boolean  ‘CTRL键
     Private Speed As Integer  ‘Fight对象的移动速度
     
     在窗口的load事件中加入
     
     Fire.KeyPreview = True
     Fire.BorderStyle = 3  ‘将窗口设为固定对话框,不包含最大化和最小化按钮,不能改变尺寸。
     
     窗口的Form_keydown事件包括.
     
     Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
     CtrlDown = (Shift And vbCtrlMask)  ‘判断CTRL键,用于加速
     If (Ctrldown) Then
        Speed = 80  ‘高速
     Else
        Speed = 40  ‘低速
     End If
     Select Case KeyCode
     Case vbKeyLeft 注释:左键
        If (Fight.Left - Speed >= 0) Then
           Fight.Left = Fight.Left - Speed
        End If
     Case vbKeyRight ‘右键
        If (Fight.Left + Fight.Width + Speed <= Fire.Width) Then  ‘Fight对象的右边缘不能超越窗口的右边缘
             Fight.Left = Fight.Left + Speed
        End If
     End Select
     End Sub
     
     亦可使用VB针对控件的Object_KeyDown,Object_KeyUp事件,大同小异。注意,这种方式不能有效地识别同时按下多个按键,不能适应游戏的需求。
     
     2、使用Timer时钟控件绘制运动着的图像
     Timer可以有规律地隔一段时间执行一次代码。其间隔的时间由Interval属性设置,是一个整数,单位是毫秒既千分之一秒。执行的代码放置于Timer事件中。
     目标Home的移动的策略不拘一格,本文给出一简单的随机变加速度算法。
     
     Private Sub TimerS_Timer()
     If (2 * Rnd > 1) Then  ‘50%加或减速度,VB中rand总是正值
        homespeed = homespeed + Rnd * 50
     Else
        homespeed = homespeed - Rnd * 50
     End If
     Home.Left = Home.Left + homespeed
     If (Home.Left + Home.Width < 0) Then  注释:如目标右边缘小于窗口左边缘
        Home.Left = Fire.Width  ‘目标在窗口的右边出现
     End If
     If (Home.Left > Fire.Width) Then  ‘如目标左边缘小于窗口右边缘
        Home.Left = -Home.Width  ‘目标在窗口的左边出现
     End If
     End Sub
     
     目标Home的移动的策略还可引入Fight对象的位置和速度的参数,实际上,目标Home与Fight对象的移动可以是二维的,只要修改其Top属性就可实现,此类游戏耐玩的关键在于其移动的策略,读者不妨自行定义一策略看看。
     
     3、子弹的实现
     在窗口的Load事件中加入
     
     Shot.Visible = False  注释:子弹不可见
     HadShot = 0  ‘命中次数
     MaxShot = 3  ‘摧毁目标的命中次数
     
     在窗口的Form_KeyDown事件中加入
     If (HadShot < MaxShot) Then  ‘目标尚没摧毁
     ......
        Case vbKeySpace
           If (Shot.Visible = False) Then 注释:发射子弹,后可加入声音,与减分
              Shot.Left = Fight.Left + (Fight.ScaleWidth - shot.ScaleWidth) / 2  ‘定位于Fight的正中
              Shot.Top = Fight.Top - Shot.Height  ‘定位于Fight的上方
              Shot.Visible = True ‘子弹可见
           End If
     .....
     End If
     End Sub
     
     在TimerS的Timer事件中加入
     
     Private Sub TimerS_Timer()
     If (HadShot < MaxShot) Then
        If (Shot.Visible = True) Then  ‘子弹已发射
           Shot.Top = shot.Top - 100
         End If
         If (Shot.Top <= 0) Then  ‘子弹到达窗口顶端
             Shot.Visible = False
         Else
            If (Shot.Top <= (Home.Top + Home.Height)) And _
               ((Shot.Top + Shot.Height) >= Home.Top) And _
               ((Shot.Left <= Home.Left) + Home.Width) And _
               ((Shot.Left + Shot.Width) >= Home.Left) And _
               (Shot.Visible = True) Then  注释:子弹命中目标
                 Shot.Visible = False
                 HadShot = HadShot + 1 ‘后可加入声音,与加分
            End If
         End If
     .......
     Else
       注释:可加入声音
       Home.Picture= "Home2.gif"  ‘显示摧毁后的图象
     End If
     End Sub
     
     敌目标发射子弹的方式基本相同,此代码还可扩展至若干发子弹,不再熬诉。
     4、加入多媒体特征
     
     可使用Window API函数mciExecute实现多媒体播放功能,语法为,先声明
     
     Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
     
     然后在欲播放时加入下语句即可
     x = mciExecute("play 欲播放的多媒体文件")
     还可使用Multimedia、MediaPlayer MediaPlayer多媒体控件,以Multimedia控件为例:在欲播放时加入下语句
     
     With Multimedia控件名
       .Filename = "欲播放的多媒体文件"
       .command = "Open"
       .command = "Play"
     End With
     
     并在Multimedia控件名的Done事件中加入
     Multimedia控件名.Command = "Close"
     Multimedia控件支持视频播放,可制作动画的启动封面,最简单的可在启动时隐藏其它控件,播放一视频文件,然后再关闭此视频文件,显示隐藏了的控件,有兴趣的话大可尝试一番。
     此外本程式还包括一菜单,下设Play(运行),Option(积分),Exit三功能,比较简单,读者可自行完成。VB并不是制作游戏的最佳工具,制作这个简单的游戏仅仅是为了介绍VB一些基本的技术,希望读者能从扩展这个游戏中得到乐趣。