电信主站 网通分站
购买流程 付款方式 常见问题 在线提问 续租服务 购物车
用户名: 密 码: 忘记密码?
首 页
域名注册
虚拟主机
双线主机
服务器租用
VPS主机
企业邮局
代理专区
客服中心
虚拟主机行业资讯 虚拟主机评测对比 互联网最新动态 技术学院 站长资讯 在线教程 网站运营
搜索优化 服务器 网络编程 图形图象 站长之家 网页制作 操作系统
冲浪宝典 软件教学 视频通信 办公软件 邮件系统 网络安全 认证考试
您当前位置:西部数码->资讯中心-> 操作系统-> 注册表教程
基于vb6.0射击游戏的实现_visualbasic教程
作者:网友供稿 点击:0
  西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!虚拟主机可在线rar解压,自动数据恢复设置虚拟目录等.虚拟主机免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金!
文章页数:[1] 

基于VB6.0射击游戏的实现

随着计算机技术的进步,计算机游戏也越来越普及,很多喜爱程序开发的读者朋友都向往游戏编程,但往往又觉得游戏编程序很复杂,高深莫测。诚然,象"帝国时代"、"反恐精英"这样的大型游戏需要写很复杂的程序来实现一些令人"头昏"的算法,需要熟悉DirectX开发知识。但是,对于一般的开发人员,完全可以利用所学的知识开发一些小的游戏,达到自娱自乐的目的。


  本文介绍如何在VisualBasic6.0环境下开发射击小游戏,通过实现该小游戏可以帮助一些VisualBasic初学者加深对VisualBasic编程知识的理解,同时它也可以开拓初、中级开发爱好者的编程思路。该射击小游戏程序编译运行后的界面效果如图一所示:


图一、射击游戏界面图

  在射击游戏中,安排了两个角色,相互之间可以开枪进行对射,同时为了丰富游戏的功能,游戏的场景中添加定时移动的仙人掌,为射击的双方角色提供保护功能。当其中一个角色中弹后,游戏终止,同时游戏人物角色的图标变更,表示角色死亡。为了实现上述的游戏,最初要作的是设计程序界面,按照游戏的需求,首先生成一个VB应用程序,在Form1上添加一个开始按钮btnStart,一个名为picDesert的Picture控件,该控件用来做为游戏的场景和其它控件的容器,在该控件上添加六个Image控件,分别用来显示游戏的角色、两个移动的仙人掌、分别向右、向左呼啸射击的子弹以及标志角色死亡的图标,它们的图象分别如下:


游戏角色

仙人掌

呼啸的子弹

角色击中标志

  为了使程序中的仙人掌、游戏角色和射击时发射的子弹可以移动,需要向项目中添加定时器tmrMouseCnt和Timer1,在这两个定时响应函数中完成不同对象的移动功能。在游戏运行后,为了使用户可以通过键盘和鼠标来操作游戏的角色,实现射击的功能,需要添加鼠标消息和键盘消息处理函数。例如,对于角色1来说,可以通过上下键来移动,空格键来射击,对于角色2来说,鼠标左右键控制移动,双击实现射击。在射击过程中,要处理两个细节,一个细节是子弹与仙人掌及角色的区域重叠问题,当子弹与仙人掌重叠时让子弹隐藏起来,与角色重叠时表示击中目标,游戏结束。这里需要判断何时两个区域有重叠,解决这个问题的方法是使用API函数IntersectRect,用它来判断两个区域是否有重叠。另一个细节是子弹射击过程中需要添加"呼啸"的声音和击中目标时添加人物惨叫的声音,来达到逼真的效果,为了实现这个功能,需要向程序中添加语音文件(程序中的语音文件分别为:BANG.WAV和OH!!.WAV),然后通过API函数sndPlaySound来实现。另外,在对象移动的过程中,需要注意移动到边缘位置的情况处理。
程序的具体实现代码如下:
SHOOTOUT.BAS
OptionExplicit
DatatyperequiredbytheIntersectRectfunction
TypetRect
LeftAsLong
TopAsLong
RightAsLong
BottomAsLong
EndType
WindowsAPIrectanglefunctions
DeclareFunctionIntersectRectLib"user32"(lpDestRectAstRect,lpSrc1RectAstRect,lpSrc2RectAstRect)AsLong
Functionsandconstantsusedtoplaysounds.
DeclareFunctionsndPlaySoundLib"winmm.dll"Alias"sndPlaySoundA"(ByVallpszSoundNameAsString,ByValuFlagsAsLong)AsLong
ConstantusedwithsndPlaySoundfunction
GlobalConstSND_ASYNC=&H1
----------------------------------------------------------
SHOOTOUT.FRM
OptionExplicit
KeyCodesforkeyboardaction.
ConstKEY_SPACE=&H20
ConstKEY_UP=&H26
ConstKEY_DOWN=&H28
NumberofTwipstomoveplayeroneachkeyormouseevent.
ConstPlayerIncrement=45
Constantsformouseaction.
ConstNO_BUTTON=0
ConstLBUTTON=1
ConstRBUTTON=2
Booleanthatindicatesifmousebuttonhasbeenpresseddown.
DimMouseButtonDownAsInteger
Numberofbulletseitherplayercanhaveinuseatonetime.
ConstNUM_BULLETS=6
Booleansindicatingifplayer0orplayer1havejustfired.
DimGunFired(0To1)AsInteger

Startthegamebyenablingthemaintimerandhidingthestartbutton.
PrivateSubbtnStart_Click()
Timer1.Enabled=True
btnStart.Visible=False
EndSub

CheckifthetwoImagesintersect,usingtheIntersectRectAPIcall.
PrivateFunctionCollided(imgAAsImage,imgBAsImage)AsInteger
DimAAstRect
DimBAstRect
DimResultRectAstRect
CopyinformationintotRectstructure
A.Left=imgA.Left
A.Top=imgA.Top
B.Left=imgB.Left
B.Top=imgB.Top
CalculatetherightandbottomsofrectanglesneededbytheAPIcall.
A.Right=A.Left imgA.Width-1
A.Bottom=A.Top imgA.Height-1
B.Right=B.Left imgB.Width-1
B.Bottom=B.Top imgB.Height-1
IntersectRectwillonlyreturn0(false)ifthe
tworectanglesdoNOTintersect.
Collided=IntersectRect(ResultRect,A,B)
EndFunction

Double-clickingthemousefiresPlayer1sgun.
PrivateSubForm_DblClick()
DimrcAsInteger
IfNotTimer1.EnabledThenExitSub
GunFired(1)=True
rc=sndPlaySound(App.Path&"\BANG.WAV",SND_ASYNC)
EndSub

ThiseventhandlesPlayer0sgameactionviathekeyboard.
PrivateSubForm_KeyDown(KeyCodeAsInteger,ShiftAsInteger)
DimrcAsInteger
StaticInKeyDownAsInteger
IfNotTimer1.EnabledThenExitSub
IfInKeyDownThenExitSub
InKeyDown=True
DoEvents
SelectCaseKeyCode
CaseKEY_UP
imgPlayer(0).Top=imgPlayer(0).Top-PlayerIncrement
IfimgPlayer(0).Top<0ThenimgPlayer(0).Top=0
CaseKEY_SPACE
GunFired(0)=True
rc=sndPlaySound(App.Path&"\BANG.WAV",SND_ASYNC)
CaseKEY_DOWN
imgPlayer(0).Top=imgPlayer(0).Top PlayerIncrement
IfimgPlayer(0).Top>(picDesert.ScaleHeight-
imgPlayer(0).Height)Then
imgPlayer(0).Top=picDesert.ScaleHeight-
imgPlayer(0).Height
EndIf
EndSelect
InKeyDown=False
EndSub

PrivateSubForm_Load()
DimiAsInteger
Timer1.Interval=22
Timer1.Enabled=False
MouseButtonDown=NO_BUTTON
Fori=1ToNUM_BULLETS-1
LoadimgLBullet(i)
LoadimgRBullet(i)
Next
EndSub

PrivateSubForm_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
MouseButtonDown=Button
EndSub

PrivateSubForm_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)
MouseButtonDown=NO_BUTTON
EndSub

Themaingametimer.
PrivateSubTimer1_Timer()
ConstCactusIncrement=30
ConstBulletIncrement=300
ConstNumCacti=2

DimiAsInteger
DimrcAsInteger
Movetherovingcacti.
Fori=0ToNumCacti-1
imgCactus(i).Top=imgCactus(i).Top-CactusIncrement
IfimgCactus(i).Top<-imgCactus(i).HeightThen
imgCactus(i).Top=picDesert.Height
EndIf
Next
Didplayer0fireabullet?
IfGunFired(0)Then
GunFired(0)=False
Findaspare(invisible)bullet.
Fori=0ToNUM_BULLETS-1
IfNotimgLBullet(i).VisibleThen
imgLBullet(i).Top=imgPlayer(0).Top
imgLBullet(i).Left=imgPlayer(0).Left
(imgPlayer(0).Width/2)
imgLBullet(i).Visible=True
ExitFor
EndIf
Next
EndIf
Didplayer1fireabullet?
IfGunFired(1)Then
GunFired(1)=False
Findaspare(invisible)bullet.
Fori=0ToNUM_BULLETS-1
IfNotimgRBullet(i).VisibleThen
imgRBullet(i).Top=imgPlayer(1).Top
imgRBullet(i).Left=imgPlayer(1).Left-
(imgPlayer(1).Width/2)
imgRBullet(i).Visible=True
ExitFor
EndIf
Next
EndIf
MoveVisibleBullets
Fori=0ToNUM_BULLETS-1
Moveplayer0sbullets.
IfimgLBullet(i).VisibleThen
imgLBullet(i).Left=imgLBullet(i).Left BulletIncrement
IfCollided(imgLBullet(i),imgCactus(0))Then
imgLBullet(i).Visible=False
ElseIfCollided(imgLBullet(i),imgCactus(1))Then
imgLBullet(i).Visible=False
ElseIfimgLBullet(i).Left>picDesert.ScaleWidthThen
imgLBullet(i).Visible=False
ElseIfCollided(imgLBullet(i),imgPlayer(1))Then
imgLBullet(i).Visible=False
imgPlayer(1).Picture=imgRIP.Picture
Timer1.Enabled=False
rc=sndPlaySound(App.Path&"\OH!!.WAV",SND_ASYNC)
EndIf
EndIf
Moveplayer1sbullets.
IfimgRBullet(i).VisibleThen
imgRBullet(i).Left=imgRBullet(i).Left-BulletIncrement
IfCollided(imgRBullet(i),imgCactus(0))Then
imgRBullet(i).Visible=False
ElseIfCollided(imgRBullet(i),imgCactus(1))Then
imgRBullet(i).Visible=False
ElseIfimgRBullet(i).Left<-imgRBullet(i).WidthThen
imgRBullet(i).Visible=False
ElseIfCollided(imgRBullet(i),imgPlayer(0))Then
imgRBullet(i).Visible=False
imgPlayer(0).Picture=imgRIP.Picture
Timer1.Enabled=False
rc=sndPlaySound(App.Path&"\OH!!.WAV",SND_ASYNC)
EndIf
EndIf
Next
EndSub

HandlePlayer1smovement(upanddown).
PrivateSubtmrMouseCntl_Timer()
IfNotTimer1.EnabledThenExitSub
SelectCaseMouseButtonDown
CaseRBUTTON
imgPlayer(1).Top=imgPlayer(1).Top-PlayerIncrement
IfimgPlayer(1).Top<0ThenimgPlayer(1).Top=0
CaseLBUTTON
imgPlayer(1).Top=imgPlayer(1).Top PlayerIncrement
IfimgPlayer(1).Top>(picDesert.ScaleHeight-
imgPlayer(1).Height)Then
imgPlayer(1).Top=picDesert.ScaleHeight-
imgPlayer(1).Height
EndIf
EndSelect
EndSub


  文章的上述内容对射击游戏中的各个实现功能进行了详细的介绍,读者朋友可以根据文章中的程序代码自己动手实验一下。本程序在Windows2000、VisualBasic6.0环境下编译通过,运行正常。

->


文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!
相关主题
文章页数:[1] 
Google
热门文章
·adsl注册表优化大法之9x/me篇_注册表教程
·记录集锁定--多客户环境下vb数据库编程之(4)_visualbasic教程
·基于vb6.0射击游戏的实现_visualbasic教程
·visualbasic编程访问wmi对象_visualbasic教程
·数字电视机顶盒技术综述(上)_视频通信
·windows xp系统注册表十则设置技巧_注册表教程
·windows系统注册表知识完全揭密_注册表教程
·对注册表进行编辑的三种途径_注册表教程
·修改注册表权限加强对木马、病毒的防范_注册表教程
·走出注册表修改的三大误区_注册表教程

最新文章
·从注册表下手 切断一切黑客入侵的路径_注册表教程
·快速还原windows xp 注册表技巧_注册表教程
·改系统注册表 实现windows xp自动登录_注册表教程
·修复win xp无法显示隐藏文件的几个方法_注册表教程
·修改注册表 windows vista系统信息设置随心所欲_注册表教程
·在windows vista下轻松实现使用记事本打开文件_注册表教程
·windows vista上网注册表修改小技巧_注册表教程
·加快运行速度 xp系统注册表与驱动优化_注册表教程
·抢先了解最易被黑客利用的注册表位置_注册表教程
·巧改注册表还你windows桌面一片清净_注册表教程


 
 


版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!

特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
  打印  刷新  关闭
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 虚拟主机 | 资讯中心 | 友情链接 | 网站地图

版权所有 西部数码(www.west263.com)
CopyRight (c) 2002~2006 west263.com all right reserved.
公司地址:四川成都市万和路90号天象大厦4楼 邮编:610031
电话总机:028-86262244 86263048 86263408 86263960 86264018 86267838
售前咨询:总机转201 202 203 204 206 208
售后服务:总机转211 212 213 214
财务咨询:总机转224 223 传真:028-86264041 财务QQ:点击发送消息给对方635483282
售前咨询QQ:点击发送消息给对方2182518 点击发送消息给对方241975952 点击发送消息给对方275026793 点击发送消息给对方408235859
售后服务QQ:点击发送消息给对方17708515 点击发送消息给对方307742704 点击发送消息给对方287976517 点击发送消息给对方363783715
《中华人民共和国增值电信业务经营许可证》编号:川B2-20030065号