转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
VB编写DirectX简明教程         ★★★★

VB编写DirectX简明教程

作者:闵涛 文章来源:闵涛的学习笔记 点击数:5141 更新时间:2009/4/23 18:58:56

 

 

VB编写DirectX简明教程

随这计算机软硬件的发展,计算机不在只是一个简单的计算工具而成为了一个可以玩游戏、进行多媒体操作的多功能平台。为了编写高性能的游戏和应用程序,我们需要绕过操作系统提供的API直接操作硬件以充分利用硬件的加速效果,但是由于现在的计算机配件数以万计,那么我们在编写程序时需要为每一类编写代码。这样就大大的浪费了资源。现在有了DirectX,这个问题就解决了,硬件厂家只要根据DirectX要求编写驱动程序,而程序员只要同单一的DirectX库打交道而基本不用顾及具体的硬件,这样不但大大的简化了编程而且也提高了程序性能。
由于微软的影响力,DirectX库已经成为了游戏开发的标准之一。过去要进行DirectX开发只能使用复杂的C++,不过自从DirectX7发布以来,微软同时也发布了DirectX的VB开发库,这样我们业可以使用VB来开发基于DirectX的游戏和应用程序了。
完整的DirectX7 SDK库有139M大,其中包括了VB、VC开发库,在线开发文档,范例程序以及一些实用程序。只有至少安装了开发库中的VB部分以后,才可以来开发DirectX程序。
安装好DirectX开发库之后,打开VB,点击菜单的 Project | References 项打开References对话框,可以发现在列表中多了一项:DirectX 7 For Visual Basic Type library,点击该项,就可以把DirectX库加入到VB工程中。下面文章中编写每一个范例前都要首先进行上面的操作将DirectX 7 For Visual Basic Type library加入到VB工程中。
DirectX7开发库是基于对象的,其中最基本的对象是DirectX7对象,只有在程序中首先建立了DirectX7对象之后才可以在该对象的基础上建立其它对象。DirectX基本对象包含以下几类:
DirectDraw类 独立于设备的平面绘图对象,支持以全屏方式或者窗口方式绘图。DirectDraw支持对显存的直接操作。一旦定义DirectDraw对象并锁定,就可以象操作一个数组一样的操作显存中的内容了。
Direct3D类 DirectX三维绘图接口,包括立即模式(Immediate Mode)和保留模式,是绝大部分的三维DirectX游戏的基础。Direct3D类对象独立于设备。
DirectSound类 DirectX中的Wave音频对象,独立于设备,支持混音、硬件加速、直接设备访问、声音捕捉和回放。
DirectMusic类 音乐数据文件操作对象,支持DLS(downloadable sounds)标准,支持运行时编辑。
DirectInput类 独立于设备的游戏控制器对象,支持鼠标、键盘、游戏杆,并且支持力反馈游戏杆。
DirectPlay类 为支持多任游戏而设计的对象,支持不同的计算机通过网络、Internet或者Modem进行互连。支持建立游戏服务器,用户可以登陆到服务器上并纪录用户信息。可以协调速度不同的计算机之间的信息传递(例如一个使用专线和一个使用低速Modem的计算机之间)。

一、 DirectDraw
DirectDraw类是DirectX中绘图的基础,它包含以下的对象:
·	DirectDraw7 
·	DirectDrawClipper 
·	DirectDrawEnumModes 
·	DirectDrawPalette 
·	DirectDrawSurface7 

DirectDraw7是基本的DirectDraw类对象,它是建立其它对象的基础,DirectDraw7对象要通过DirectX7对象的DirectDrawCreate方法来建立。例如下面的语句就可以建立一个DirectDraw对象:
Dim objDx As New DirectX7
Dim objDraw As DirectDraw7

Set objDx = New DirectX7
DirectDrawClipper对象可以建立一个屏幕的剪裁区域的列表。该对象的一个通常的应用是设置屏幕或者窗口区域,例如在你的游戏中有一个人物移动到了屏幕的边缘,你不希望他一下消失掉而是要平滑的移出,如果没有DirectDrawClipper对象的话这将后台的图像复制到前台会出现错误,因为人物图像的一部分已经移动到了绘图平面的外面,而有了DirectDrawClipper对象,DirectDraw就知道人物图像区域的那些部分是可见的而那些部分应该被剪裁掉。利用DirectDraw7的CreateClipper方法可以建立一个DirectDraw7下的DirectDrawClipper对象
通过DirectDrawEnumModes对象可以获得当前系统支持的显示模式。DirectDraw7的GetDisplayModesEnum方法可以建立一个DirectDrawEnumModes对象。
DirectDrawPalette对象是DirectDraw下的绘图调色板对象,它很类似于Windows下的调色板。DirectDraw7的CreatePalette方法可以建立一个DirectDrawPalette对象。
DirectDrawSurface7是DirectDraw下的最重要的对象,它有点类似Windows下窗口的hDC,我们所进行的所有图形、文本操作都是在这个对象上进行的。这个对象描述了一块线型的显存区域,你可以通过DirectDrawSurface7对象直接操作这片区域。如果你还记得在Dos下的QB4.5编写图形程序的话,DirectDrawSurface7对象就同它有一些类似。通过DirectDraw7的CreateSurface方法,你可以建立一个单一绘图平面、复合绘图平面或者三维绘图平面对象。而利用DirectDraw7的CreateSurfaceFromFile方法、CreateSurfaceFromResource方法可以建立一个包含位图的 DirectDrawSurface7对象。DirectDrawSurface7对象是DirectDraw类对象中最难掌握的对象。

下面我们将通过建立一个简单的DirectDraw程序并通过充实程序来学习DirectDraw的基本原理和应用。首先来建立一个简单的DirectDraw程序,建立一个新的工程,将Direct7说明库加入到工程中,然后在Form1中加入两个CommandButton和一个ListBox控件,在Form1中加入以下代码:
Option Explicit
Dim objDx As New DirectX7
Dim objDraw As DirectDraw7
Dim objEnumModes As DirectDrawEnumModes

Sub Cleanup()   ''''Cleanup函数回复屏幕并且清除DirectX对象
    Call objDraw.RestoreDisplayMode
    Call objDraw.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL)
    Set objDraw = Nothing
    Set objDx = Nothing
    End
End Sub

Private Sub Command1_Click()
    CleanUp
End Sub

Private Sub Form_Load()
    Command1.Caption = "结束"
    Command2.Caption = "设置显示模式"
    
    On Error GoTo ErrHandler:

    Dim ddsd As DDSURFACEDESC2
    Dim I As Long, lgCount As Long

    Set objDx = New DirectX7
    ''''建立 DirectDraw 对象
    Set objDraw = objDx.DirectDrawCreate("")

    ''''将DirectDraw对象支持的显示模式设置到DirectDrawEnumModes对象中
    Set objEnumModes = objDraw.GetDisplayModesEnum(DDEDM_DEFAULT, ddsd)

    ''''将数据设置到ListBox中
    lgCount = objEnumModes.GetCount()
    For I = 1 To lgCount
        objEnumModes.GetItem I, ddsd
        List1.AddItem CStr(ddsd.lWidth) & "x" & CStr(ddsd.lHeight) & "x" _
            & CStr(ddsd.ddpfPixelFormat.lRGBBitCount)
    Next I

ErrHandler:
		Select Case Err.Number
        Case 0 ''''''''没有错误
    	    Case Else
        	    Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpContext, _
            	Err.HelpContext
            Call Cleanup
    	End Select
End Sub
Private Sub Form_Unload(Cancel As Integer)
    Cleanup
End Sub

程序的运行结果如下图:


上面的范例首先演示了如何建立一个简单的DirectDraw对象并获得该对象支持的显示模式。下面我们要将在原来程序的基础上添加一些模块以实现更多的功能。
首先在上面的程序中加入一个函数SetNewDisplayMode,函数代码如下:
Private Function SetNewDisplayMode()
    On Error GoTo ErrHandler

    Dim ddsd As DDSURFACEDESC2
    Dim i As Long

    i = List1.ListIndex
    If i = -1 Then
        MsgBox "请在列表中选择一种显示模式", vbOKOnly, "错误"
        Exit Function
    End If

    objEnumModes.GetItem (i + 1), ddsd

    ''''''''设置协作模式
    objDraw.SetCooperativeLevel Me.hWnd, DDSCL_FULLSCREEN Or _
DDSCL_ALLOWMODEX Or DDSCL_EXCLUSIVE

    ''''''''设置显示模式
    objDraw.SetDisplayMode ddsd.lWidth,ddsd.lHeight, _
ddsd.ddpfPixelFormat.lRGBBitCount, _
         0, DDSDM_DEFAULT

    Me.Refresh

ErrHandler:
    Select Case Err.Number
        Case 0 ''''''''No Errors
        Case Else
        Err.Raise Err.Number, Err.Source, Err.Description, Err.HelpContext, _
            Err.HelpContext
        Call Cleanup
    End Select
End Function
在Command2的Click事件中加入以下代码:
Dim  i
    
    	For i = 0 To Form1.Controls.Count - 1
        	Form1.Controls(i).Visible = False
    	Next i
    
SetNewDisplayMode


再次运行程序,点击列表中的任意一个显示模式,然后点击"设置显示模式"按钮,可以看到屏幕的显示模式被设置成了你在列表中选择的模式。
上面介绍的是如何设置显示模式,下面介绍如何利用DirectSurface对象来进行图形绘制以及如何利用前台绘图平面同后台绘图平面相配合工作。这个程序要实现的目的是:在屏幕上显示一幅背景位图,然后有一个角色在屏幕上移动。为了实现上面的目的,我们需要建立四个绘图平面,一个主平面,就是程序运行时可以看到的平面;一个后台缓冲平面,用于进行图像操作;一个位图平面,用于显示背景位图;一个角色位图平面,用于显示角色位图。在程序运行时首先将背景位图贴到后台缓冲平面,然后将角色位图平面贴到后台缓冲平面,在后台缓冲平面输出一些提示文字,最后将后台缓冲平面的内容贴到主平面上。
为完成下面的程序,首先要在你的工程文件的目录下建立一个名字为Demo.bmp的位图文件最为背景和一个名字为 Sprite.bmp 的位图作为角色位图。在Form1中加入一个ListBox控件和两个CommandButton控件。加入Directx7说明库,然后在Form1的代码窗口中添加以下的代码:
Option Explicit

Dim objDx As New DirectX7
Dim objDraw As DirectDraw7
Dim objEnumModes As DirectDrawEnumModes

Dim MainSurf As DirectDrawSurface7
Dim BackSurf As DirectDrawSurface7
Dim BmpSurf As DirectDrawSurface7
Dim SpriteSurf As DirectDrawSurface7

Dim ddsd As DDSURFACEDESC2
Dim ddsd1 As DDSURFACEDESC2
Dim ddsd2 As DDSURFACEDESC2
Dim ddsd3 As DDSURFACEDESC2
Dim ddsd4 As DDSURFACEDESC2
Dim ddsd5 As DDSURFACEDESC2

Dim bRun As Boolean
Dim lastTime As Long
Dim fps As Long
Dim lfps As Long
Dim FrameCount As Long
Dim Clipper As DirectDrawClipper
Dim x As DDPIXELFORMAT
Dim sx, sy As Integer
Dim Pict() As Byte

Sub InitSurf()
    On Error GoTo ErrHandler

    ''''设置主绘图平面的属性
    ddsd1.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
    ddsd1.lBackBufferCount = 1
    ddsd1.ddsCaps.lCaps = DDSCAPS_COMPLEX Or DDSCAPS_FLIP Or DDSCAPS_PRIMARYSURFACE
    ''''设置缓冲绘图平面的属性
    ddsd2.ddsCaps.lCaps = DDSCAPS_BACKBUFFER
        
    ''''根据ddsd1建立主绘图平面
    Set MainSurf = objDraw.CreateSurface(ddsd1)
    ''''将BackSurf设置为MainSurf的附加平面
    Set BackSurf = MainSurf.GetAttachedSurface(ddsd2.ddsCaps)
    ''''设置背景绘图平面的字体和颜色
    BackSurf.SetForeColor RGB(255, 255, 255)
    Form1.Font.Name = "宋体"
    BackSurf.SetFont Form1.Font
    
    ''''获得缓冲绘图平面的属性并设置到ddsd4中
    BackSurf.GetSurfaceDesc ddsd4
    ''''设置图形绘图平面的属性
    ddsd3.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH
    ddsd3.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
    ddsd3.lWidth = ddsd4.lWidth
    ddsd3.lHeight = ddsd4.lHeight
    ''''建立图形绘图平面
    Set BmpSurf = objDraw.CreateSurfaceFromFile(App.Path + "\demo.bmp", ddsd3)
  
    ''''设定角色位图平面的属性
    ddsd5.lFlags = DDSD_CAPS
    ddsd5.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
    ''''建立角色位图平面
    Set SpriteSurf = objDraw.CreateSurfaceFromFile(App.Path + "\sprite.bmp", ddsd5)
    
    Dim key As DDCOLORKEY
    ''''设定透明色(在这里设定为0,黑色)
    key.low = 0
    key.high = 0
    SpriteSurf.SetColorKey DDCKEY_SRCBLT, key
    sx = 20: sy = 20
    
    lastTime = objDx.TickCount
    
    While True
        DoEvents
        Blt
    Wend
ErrHandler:
    Select Case Err.Number
        Case 0 ''''''''No Errors
        Case Else   ''''错误退出
            Call Cleanup
    End Select
End Sub
Sub Blt()
    Dim mrectScreen As RECT
    Dim sTimePass As Single
    Dim sFramePerS As Single
    
    ''''以黑色清除并填充后台绘图平面
    BackSurf.BltColorFill mrectScreen, 0
    
    ''''获得背景位图平面的矩形区域的尺寸
    mrectScreen.Right = ddsd2.lWidth
    mrectScreen.Bottom = ddsd2.lHeight
    ''''将图形绘图平面中的内容复制到后台绘图平面上
    Call BackSurf.BltFast(0, 0, BmpSurf, mrectScreen, DDBLTFAST_WAIT)
    
    ''''获得前景角色位图平面的矩形区域
    mrectScreen.Right = ddsd5.lWidth
    mrectScreen.Bottom = ddsd5.lHeight
    ''''将前景角色位图复制到后台绘图平面上。
    Call BackSurf.B

[1] [2] [3] [4] [5] [6]  下一页


[常用软件]Flashget 1.x 简明教程  [网页制作]样式表CSS简明教程
[网页制作]CSS基础学习:样式表CSS简明教程  [网页制作]简明教程 SPAN和DIV的区别
[网页制作]XSL简明教程  [Web开发]推荐阅读HTML简明教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台