发表评论(0)作者:不详, 平台:VB6.0+Win98, 阅读:11446, 日期: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一些基本的技术,希望读者能从扩展这个游戏中得到乐趣。
--------------------------------------------------------------------------------
作者:指针
从作一个小游戏开始
作者:指针
本文从制作一个简单的小游戏开始,通过扩展这游戏,讲解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一些基本的技术,希望读者能从扩展这个游戏中得到乐趣。