然而开发游戏需要对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
最新评论