打印本文 打印本文 关闭窗口 关闭窗口
VB编写DirectX简明教程
作者:武汉SEO闵涛  文章来源:敏韬网  点击数6129  更新时间:2009/4/23 18:58:56  文章录入:mintao  责任编辑:mintao
b InitDDraw() Set RMViewPort = Nothing Set RMDevice = Nothing ''''建立DirectDraw对象 Set g_dd = g_dx.DirectDraw4Create("") ''''设定DirectDraw对象的协作模式 g_dd.SetCooperativeLevel Me.hWnd, DDSCL_NORMAL ''''预先定义主绘图平面的属性 g_ddsd.lFlags = DDSD_CAPS g_ddsd.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE ''''建立主绘图平面 Set MainBuffer = g_dd.CreateSurface(g_ddsd) Set pcClipper = g_dd.CreateClipper(0) pcClipper.SetHWnd Me.hWnd MainBuffer.SetClipper pcClipper g_dx.GetWindowRect Me.hWnd, g_rcDest g_ddsd.lFlags = DDSD_HEIGHT Or DDSD_WIDTH Or DDSD_CAPS g_ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_3DDEVICE g_dx.GetWindowRect Me.hWnd, g_rcDest g_ddsd.lWidth = g_rcDest.Right - g_rcDest.Left g_ddsd.lHeight = g_rcDest.Bottom - g_rcDest.Top ''''建立后台绘图平面 Set BackBuffer = g_dd.CreateSurface(g_ddsd) End Sub ''''InitS函数设定三维场景 Sub InitS() Set D3DRM = g_dx.Direct3DRMCreate ''''建立三维场景 Set RMFrameScene = D3DRM.CreateFrame(Nothing) ''''建立相机 Set RMFrameCamera = D3DRM.CreateFrame(RMFrameScene) ''''设置相机位置 RMFrameCamera.SetPosition Nothing, 0, 0, -10 ''''建立方向光源以及设置亮度 Set RMFrameDirLight = D3DRM.CreateFrame(RMFrameScene) Set RMDirLight = D3DRM.CreateLightRGB(D3DRMLIGHT_DIRECTIONAL, 1, 1, 1) ''''建立环境光源,环境光源的亮度只有方向光源的1/5 Set RMAmbientLight = D3DRM.CreateLightRGB(D3DRMLIGHT_AMBIENT, 0.2, 0.2, 0.2) ''''将光源添加到三维场景中 RMFrameDirLight.AddLight RMDirLight RMFrameScene.AddLight RMAmbientLight ''''设置光源位置 RMFrameDirLight.SetPosition Nothing, 5, 5, -5 RMFrameDirLight.LookAt RMFrameScene, Nothing, 0 End Sub ''''InitD3DRM函数设定三维设备和视区 Sub InitD3dRM() Dim f As Direct3DRMFace2 Dim ddsd As DDSURFACEDESC2 Dim r As RECT Dim D3DTexture As Direct3DRMTexture3 ''''获得窗口矩形区域 Call g_dx.GetWindowRect(Me.hWnd, r) ddsd.lWidth = r.Right - r.Left ddsd.lHeight = r.Bottom - r.Top ddsd.lFlags = DDSD_CAPS Or DDSD_HEIGHT Or DDSD_WIDTH ddsd.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN Or DDSCAPS_3DDEVICE Or _ DDSCAPS_SYSTEMMEMORY ''''在后台绘图平面的基础上建立D3dRMDevice Set RMDevice = D3DRM.CreateDeviceFromSurface("IID_IDirect3DRGBDevice", _ g_dd, BackBuffer, 0) ''''三维设备接管窗口的绘制 RMDevice.HandleActivate 0 RMDevice.HandlePaint Me.hWnd ''''建立视区,视区的范围为窗口的范围 Set RMViewPort = D3DRM.CreateViewport(RMDevice, RMFrameCamera, 0, 0, _ ddsd.lWidth, ddsd.lHeight) ''''建立高路德渲染 RMDevice.SetQuality D3DRMRENDER_GOURAUD ''''建立子场景 Set framebox = D3DRM.CreateFrame(RMFrameScene) Set meshbox = D3DRM.CreateMeshBuilder Set D3DTexture = D3DRM.LoadTexture(App.Path + "\glass.bmp") ''''为meshbox建立六个平面并设置纹理 Set f = D3DRM.CreateFace() f.AddVertex 2, 2, -2 f.AddVertex 2, -2, -2 f.AddVertex -2, -2, -2 f.AddVertex -2, 2, -2 f.SetTextureCoordinates 0, 0, 0 f.SetTextureCoordinates 1, 0, 4 f.SetTextureCoordinates 2, 4, 4 f.SetTextureCoordinates 3, 4, 0 f.SetTexture D3DTexture meshbox.AddFace f Set f = Nothing Set f = D3DRM.CreateFace() f.AddVertex -2, 2, 2 f.AddVertex -2, -2, 2 f.AddVertex 2, -2, 2 f.AddVertex 2, 2, 2 f.SetTextureCoordinates 0, 0, 0 f.SetTextureCoordinates 1, 0, 4 f.SetTextureCoordinates 2, 4, 4 f.SetTextureCoordinates 3, 4, 0 f.SetTexture D3DTexture meshbox.AddFace f Set f = Nothing Set f = D3DRM.CreateFace() f.AddVertex 2, 2, 2 f.AddVertex 2, -2, 2 f.AddVertex 2, -2, -2 f.AddVertex 2, 2, -2 f.SetTextureCoordinates 0, 0, 0 f.SetTextureCoordinates 1, 0, 4 f.SetTextureCoordinates 2, 4, 4 f.SetTextureCoordinates 3, 4, 0 f.SetTexture D3DTexture meshbox.AddFace f Set f = Nothing Set f = D3DRM.CreateFace() f.AddVertex -2, -2, 2 f.AddVertex -2, 2, 2 f.AddVertex -2, 2, -2 f.AddVertex -2, -2, -2 f.SetTextureCoordinates 0, 0, 0 f.SetTextureCoordinates 1, 0, 4 f.SetTextureCoordinates 2, 4, 4 f.SetTextureCoordinates 3, 4, 0 f.SetTexture D3DTexture meshbox.AddFace f Set f = Nothing Set f = D3DRM.CreateFace() f.AddVertex 2, 2, -2 f.AddVertex -2, 2, -2 f.AddVertex -2, 2, 2 f.AddVertex 2, 2, 2 f.SetTextureCoordinates 0, 0, 0 f.SetTextureCoordinates 1, 0, 4 f.SetTextureCoordinates 2, 4, 4 f.SetTextureCoordinates 3, 4, 0 f.SetTexture D3DTexture meshbox.AddFace f Set f = Nothing Set f = D3DRM.CreateFace() f.AddVertex 2, -2, 2 f.AddVertex -2, -2, 2 f.AddVertex -2, -2, -2 f.AddVertex 2, -2, -2 f.SetTextureCoordinates 0, 0, 0 f.SetTextureCoordinates 1, 0, 4 f.SetTextureCoordinates 2, 4, 4 f.SetTextureCoordinates 3, 4, 0 f.SetTexture D3DTexture meshbox.AddFace f Set f = Nothing meshbox.SetName "Box" Set f = D3DRM.CreateFace meshbox.SetName "Color Box" framebox.SetPosition Nothing, -5, 0, 10 framebox.SetRotation Nothing, 1, 1, 1, 0.05 ''''分别设置六个平面德颜色 meshbox.GetFace(0).SetColor g_dx.CreateColorRGB(1, 1, 0) meshbox.GetFace(1).SetColor g_dx.CreateColorRGB(0, 1, 0) meshbox.GetFace(2).SetColor g_dx.CreateColorRGB(0, 0, 1) meshbox.GetFace(3).SetColor g_dx.CreateColorRGB(1, 1, 0) meshbox.GetFace(4).SetColor g_dx.CreateColorRGB(0, 1, 1) meshbox.GetFace(5).SetColor g_dx.CreateColorRGB(1, 1, 1) ''''将立方体对象添加到场景中 framebox.AddVisual meshbox End Sub Private Sub Form_Load() Dim rectMe As RECT Dim rectEmpty As RECT Me.Show Me.ScaleMode = 3 InitS InitDDraw InitD3dRM g_dx.GetWindowRect Me.hWnd, rectMe While True DoEvents ''''清除视区内德内容 RMViewPort.Clear D3DRMCLEAR_ZBUFFER Or D3DRMCLEAR_TARGET ''''重新渲染视区内的场景 RMViewPort.Render RMFrameScene ''''更新三维设备 RMDevice.Update ''''将后台绘图平面的内容翻转到前台来 Call MainBuffer.Blt(rectMe, BackBuffer, rectEmpty, DDBLT_WAIT) Wend End Sub Private Sub Form_Unload(Cancel As Integer) CleanUp End End Sub


运行程序,在窗口中就会出现一个立方体,可以看到,相对于使用立即模式,上面的保留模式就简单的多了。首先调用InitS函数建立场景、设置灯光以及相机,然后调用InitDDraw函数建立DirectDraw对象,最后调用InitD3dRM函数建立Direct3D对象以及设备并绘制三维立方体,设置立方体每面的颜色并添加到场景中(演员登场)。如果想让三维对象动起来,可以通过设置三维对象的位置、场景的角度以及相机的角度来分别实现。
三、 DirectInput
DirectInput是DirectX中的输入设备控件对象,它包括了对键盘、鼠标以及游戏杆的支持,使用DirectX的DirectInputCreate方法可以建立DirectInput对象,当建立一个DirectInput对象后,利用DirectInput对象的CreateDevice方法可以建立一个DirectInputDevice对象,使用DirectInputDevice对象可以获得对输入设备(键盘、鼠标、游戏杆)的控制。
下面通过一个简单的程序来了解DirectInput是如何工作的。首先建立一个新工程,加入Directx7说明库,在Form1中加入一个Timer控件和一个Label控件。然后在Form1中加入以下代码:
Option Explicit

Dim dx As New DirectX7
Dim di As DirectInput
Dim diDEV As DirectInputDevice
Dim diMouse As DirectInputDevice

Dim diState As DIKEYBOARDSTATE
Dim diSMouse As DIMOUSESTATE

Dim iKeyCounter As Integer
Dim ix, iy, iz

Private Sub Form_Load()
    Set di = dx.DirectInputCreate()
    If Err.Number <> 0 Then
        MsgBox "Direct Input设置错误,请确认再你的系统中是否安装了DirectX", _
                vbApplicationModal
        End
    End If
    ''''建立一个键盘DirectInput对象
    Set diDEV = di.CreateDevice("GUID_SysKeyboard")
    Set diMouse = di.CreateDevice("GUID_SysMouse")

    diDEV.SetCommonDataFormat DIFORMAT_KEYBOARD
    diDEV.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE
    
    diMouse.SetCommonDataFormat DIFORMAT_MOUSE
    diMouse.SetCooperativeLevel Me.hWnd, DISCL_BACKGROUND Or DISCL_NONEXCLUSIVE

    Me.Show

    diDEV.Acquire
    diMouse.Acquire
    
    ix = diSMouse.x
    iy = diSMouse.y
    iz = diSMouse.z

    Timer1.Interval = 10 ''''设置敲击键盘的灵敏度
    Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
    ''''程序结束后释放DirectInput对象
    diDEV.Unacquire
    diMouse.Unacquire
End Sub

Private Sub Timer1_Timer()
''''获得当前的击键值
    diDEV.GetDeviceStateKeyboard diState

    For iKeyCounter = 0 To 255
        ''''判断是否敲击了某键
        If diState.Key(iKeyCounter) <> 0 Then
            Label1.Caption = iKeyCounter & " - 击键时间为: (" & Time & ")"
        End If
    Next
    
    diMouse.GetDeviceStateMouse diSMouse
    If diSMouse.x <> 0 Then
        ix = diSMouse.x
    End If
    If diSMouse.y <> 0 Then
        iy = diSMouse.y
    End If
    If diSMouse.z <> 0 Then
        iz = diSMouse.z
    End If
    Form1.Caption = "X:" & ix & " Y:" & iy & " Z:" & iz
    DoEvents
End Sub


运行程序,敲击键盘的任意键,可以看到键值显示在了Label1上,而移动鼠标,当前鼠标坐标会显示在Form1的标题条上(光标的坐标原点是程序运行时光标所在的位置,而如果你的鼠标有滚轮的话,则Z坐标由你的滚轮的滚动所决定)。而不论窗口处于前台或者后台,击键和鼠标动作都会倍记录下来,你可以利用上面的程序稍加修改建立自己的鼠标键盘Hook程序。
四、 DirectSound
DirectSound类对象是DirectX中播放、捕捉数字声音对象并且对声音在虚拟的三维控件内进行定位。
它主要包括以下的几个对象:
DirectSound
DirectSoundBuffer
DirectSound3DBuffer
Direct3DsoundListner
DirectSoundCapture
DirectSoundCaptureBuffer
DirectSound对象和DirectSoundCapture对象是DirectSound类对象的基本对象,DirectSound对象是音频播放基本对象,而DirectSoundCapture对象是音频捕捉基本对象。利用DirectX7对象的DirectSoundCreate方法和DirectSoundCaptureCreate方法可以分别建立DirectSound对象和DirectSoundCapture对象。DirectSoundBuffer对象和DirectSound3Dbuffer是音频播放缓冲对象,顾名思义,前者是音频播放对象,而后者是三维音频播放对象。Direct3DSoundListner对象用于设置播放三维音频时收听者所处的位置。
下面通过一个程序来介绍DirectSound的应用,这个程序可以利用DirectSound3DBuffer播放文件并可以动态的设置声音位置。首先建立一个工程文件,在其中加入DirectX7说明库,然后在Form1中加入一个PictureBox控件和两个CommandButton控件。将Picture1的Width和Height属性都设置为3000。将Picture1的Scale属性设置为3-Pixel。保存工程文件,并在工程所在的目录下放置一个名为 Demo.wav 的声音文件。在Form1的代码窗口加入以下代码:
Dim m_dx As New DirectX7

Dim m_ds As DirectSound
Dim m_dsBuffer As DirectSoundBuffer
Dim m_ds3dBuffer As DirectSound3DBuffer
Dim m_dsPrimaryBuffer As DirectSoundBuffer
Dim m_dsListener As DirectSound3DListener
Dim m_pos As D3DVECTOR

Sub DrawPositions()
    Dim X As Integer
    Dim z As Integer
    
    Picture1.Cls
    

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

打印本文 打印本文 关闭窗口 关闭窗口