vb.net:用VB.NET实现你的游戏梦想

  游戏开发是许多梦想看着游戏中那华丽画面有多少人会感叹如果自己能做就好了 

  然而开发游戏需要对DirectX原来除了C没有其他语言可以胜任这份工作虽然DirectX7.0SDK加入了对VB支持但是VB毕竟能力有限无法胜任这份严峻工作游戏可以说是最吃资源VB速度无法完成即使做出个游戏也被人说做不入流这样来VB员无法实现自己梦想了

  .net推出了VB.net性能已经可以和VC媲美用微软说法内核是只不过是语法差异VB员大喜这样再也不会被C员说成是傻瓜员了你们能做我们样可以

  好了现在切入正题现在我们来做个简单游戏

  首先先要对游戏有个整体构架才行VB.net中对类设定比较可爱功能也非常强大不用用起不太对不起微软了

  DirectX首先先要安装DirectX7.0以上版本SDK开发包然后新建个项目选择Windwos应用

  然后选择引用DirectX思路方法是选择引用->COM->DirectX7 for VisualBasic Type Library

  好了至此你已经引用了DirectX7.0

  首先为了方便使用我们DirectX7.0,所以我们声明

  Imports DxVBLib

  然后我们定义个DirectX7.0对象

  Public DirectX As New DirectX7

  声明个DirectDraw对象用于2D游戏绘图

  Public DDraw As DirectDraw7
DDraw = DirectX.DirectDrawCreate("")


  然后要设置DirectDraw协作层

  Call DDraw.SetCooperativeLevel(Me.Handle.ToInt32, CONST_DDSCLFLAGS.DDSCL_FULLSCREEN Or CONST_DDSCLFLAGS.DDSCL_ALLOWMODEX Or CONST_DDSCLFLAGS.DDSCL_EXCLUSIVE)

  其中用到常数有

  CONST_DDSCLFLAGS.DDSCL_FULLSCREEN表示全屏模式
CONST_DDSCLFLAGS.DDSCL_ALLOWMODEX表示允许使用ModeX
CONST_DDSCLFLAGS.DDSCL_EXCLUSIVE表示独占模式


  在DirectX编程中会用到大量常数这里教你个窍门技巧在使用地方打空格VB.net会列出可以使用所有常数非常好用

  然后设置DirectDraw得显示模式

  Call DDraw.SetDisplayMode(800, 600, 16, 0, CONST_DDSDMFLAGS.DDSDM_DEFAULT)

  800600表示屏幕尺寸16表示16位真彩

  然后定义缓存Cache用于存储图片

  Dim ddsPrimary As DirectDrawSurface7 '设置主面
Dim ddsBackBuffer As DirectDrawSurface7 '设置缓冲面
Public ddsMap As DirectDrawSurface7'设置地图
Public ddsHero As DirectDrawSurface7'设置人物
'定义设置表面
Dim ddsd As DDSURFACEDESC2 '表面
'为屏幕建立个后备缓冲区
ddsd1.lFlags = CONST_DDSURFACEDESCFLAGS.DDSD_CAPS Or CONST_DDSURFACEDESCFLAGS.DDSD_BACKBUFFERCOUNT
ddsd1.ddsCaps.lCaps = CONST_DDSURFACECAPSFLAGS.DDSCAPS_PRIMARYSURFACE Or CONST_DDSURFACECAPSFLAGS.DDSCAPS_FLIP Or CONST_DDSURFACECAPSFLAGS.DDSCAPS_COMPLEX
ddsd1.lBackBufferCount = 1
ddsPrimary = DDraw.CreateSurface(ddsd1)
'设置后备缓冲区
Dim caps As DDSCAPS2
caps.lCaps = CONST_DDSURFACECAPSFLAGS.DDSCAPS_BACKBUFFER
ddsBackBuffer = ddsPrimary.GetAttachedSurface(caps)
ddsBackBuffer.GetSurfaceDesc(ddsd4)
'载入画面
ddsd2.lFlags = CONST_DDSURFACEDESCFLAGS.DDSD_CAPS Or CONST_DDSURFACEDESCFLAGS.DDSD_HEIGHT Or CONST_DDSURFACEDESCFLAGS.DDSD_WIDTH
ddsd2.ddsCaps.lCaps = CONST_DDSURFACECAPSFLAGS.DDSCAPS_OFFSCREENPLAIN
ddsd2.lWidth = ddsd4.lWidth
ddsd2.lHeight = ddsd4.lHeight
'读取地图
ddsMap = DDraw.CreateSurfaceFromFile("Map\001.bmp", ddsd2)
'载入精灵
ddsd3.lFlags = CONST_DDSURFACEDESCFLAGS.DDSD_CAPS
ddsd3.lHeight = CONST_DDSURFACEDESCFLAGS.DDSD_ALL
ddsd3.ddsCaps.lCaps = CONST_DDSURFACECAPSFLAGS.DDSCAPS_OFFSCREENPLAIN
'读取人物
ddsHero = DDraw.CreateSurfaceFromFile("BMP\H00.bmp", ddsd3)
'把人物从背景中抠出来用Key设置背景色
Dim key As DDCOLORKEY
'这里背景色为黑色
key.low = 0
key.high = 0
ddsHero.SetColorKey(CONST_DDCKEYFLAGS.DDCKEY_SRCBLT, key)
'在后备缓存Cache中绘制地图
Dim rMap As RECT
ddsBackBuffer.BltFast(0, 0, Map.ddsMap, rMap, CONST_DDBLTFASTFLAGS.DDBLTFAST_WAIT)
'在后备缓存Cache中绘制人物
Dim rPlayer As RECT
Dim ddrval As Boolean
'rPlayer表示从图片中截取那块从哪到哪如果你打开很多游戏位图看看话你会发现个人物多种动态往往放在张位图中截取其中区别块显示出来就形成了动画
'表示从(0,0)这个位置开始取
rPlayer.Top = 0
rPlayer.Left = 0
'表示取到(32,32)这个位置
rPlayer.Right = 32
rPlayer.Bottom = 32
'其中0,0表示绘制位置
ddrval = ddsBackBuffer.BltFast(0, 0, ddsHero, rPlayer, CONST_DDBLTFASTFLAGS.DDBLTFAST_SRCCOLORKEY Or CONST_DDBLTFASTFLAGS.DDBLTFAST_WAIT)
'好了后备缓存Cache已经绘制完成了可以翻转过来了其实写屏思路方法就是不停翻转主面和缓存Cache面
ddsPrimary.Flip(Nothing, CONST_DDFLIPFLAGS.DDFLIP_WAIT)


  制作2D游戏基本知识就这些了我们现在来说下游戏构架我们以个简单回合制RPG游戏为例

  我建议把所有DirectX接口全部封装起来这样操作起来方便很多

  游戏中需要英雄类、物品类、怪物类、地图类

  首先先说英雄类包含内容有HP、MP、技能、身上装备、所会武功、人物坐标

  其中比如所会技能此技能等级做成个自定义类型思路方法是

  Public Structure myGest
Public GestID As Int16 '武功编号
Public GestLV As Int16 '武功等级
End Structure


  比如最多会十种就可以定义为Public Guest(9) As myGest

  同样道理人物坐标也

  Public Structure myXY
Public iX As Int16 'X轴坐标
Public iY As Int16 'Y轴坐标
Public iAsp as Int16 '头朝方向
End Structure


  当然还有其他些属性这里就不列举了

  物品类

  比如物品分种类每种物品功能区别比如头盔就不能装备在身上当然也不能吃这里我们用到个枚举类型定义思路方法是

  Public Enum myResClass '物品分类
Head '头装备
Body '身上装备
Hand '手上装备
Eat '食品
Other '其他
End Enum
Public ResClass As myResClass '物品类型
End Class


  其它当然还有很多属性如名称重量性能等等

  怪物类

  类似于英雄类有也相似属性

  地图类

  这里我们把显示得地图单独拿出来作为个类张地图并不是每个地方都可以走从位图中可是很难识别出那些是阻挡物并且地图上还有些NPC可以和其对话等等切都要从地图文件中读取



  地图文件象张 2维表和你地图位图相对应比如人物向上移动TOP-=5然后判断现在所在点在 2维表中是否可以行走是否有阻挡如果阻挡取消操作人物不做移动

  然后设定整体流程为了操作不会因按键点击速度而影响移动速度所以我们用时间来控制设置个TimerControl控件然后根据当前状态区别而设定操作区别比如操作开始界面、移动模块、对话模块、战斗模块、交易模块、主菜单模块当前状态用iNowState变量存储

  Select Case iNowState
Case 0
'开始界面
Case 1
'移动模块
Case 2
'对话模块
Case 3
'战斗模块
Case 4
'交易模块
Case 5
'主菜单
End Select
用eInput来存储键盘事件定义如下:
Public eInput As .Windows.Forms.Keys = Keys.None
'读取存储键盘信息
Protected Overrides Sub _disibledevent= e.KeyCode
end sub




Tags:  vb.netexcel vb.net数组 vb.net教程 vb.net

延伸阅读

最新评论

发表评论