DX8公共模块.bas
上传用户:pcw2004
上传日期:2022-02-02
资源大小:743k
文件大小:11k
源码类别:

DirextX编程

开发平台:

Visual Basic

  1. Attribute VB_Name = "DX公共模块"
  2. Option Explicit
  3. ' Download by http://www.codefans.net
  4. '/////////////////////////定义公共D3D变量/////////////////////////////
  5. Public DX8 As DirectX8
  6. Public D3DX As D3DX8
  7. Public D3D8 As Direct3D8
  8. Public D3DDevice As Direct3DDevice8
  9. Public MainSprite As D3DXSprite
  10. Public Mode As D3DDISPLAYMODE
  11. Public DPP As D3DPRESENT_PARAMETERS
  12. Public D3DFontDesc As IFont
  13. Public Fnt As New StdFont
  14. Public D3DFont As D3DXFont
  15. Public D3DFont1 As D3DXFont
  16. Public D3DFont2 As D3DXFont
  17. '///////////  定义声音变量
  18. Public DS As DirectSound8
  19. Public DMP As DirectMusicPerformance8
  20. Public DML As DirectMusicLoader8
  21. Public DSBDESC As DSBUFFERDESC
  22. Public Type TLVERTEX
  23.     X As Single
  24.     Y As Single
  25.     Z As Single
  26.     rhw As Single
  27.     color As Long
  28.     specular As Long
  29.     tu As Single
  30.     tv As Single
  31. End Type
  32. Public Const FVF = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR
  33. Public mRECT As RECT
  34. Public AddResErrorCount As Integer
  35. '///////////////////////定义公共D3D变量结束/////////////////////////////
  36. '////////////////////////初始化D3D/////////////////////////////////////
  37. Public Sub InitD3D(窗口句柄 As Long, Optional 全屏 As Boolean = False, Optional 宽度 As Integer = 800, Optional 高度 As Integer = 600)
  38.     Set DX8 = New DirectX8
  39.     Set D3DX = New D3DX8
  40.     Set D3D8 = DX8.Direct3DCreate
  41.     If 全屏 = False Then
  42.         D3D8.GetAdapterDisplayMode 0, Mode
  43.         DPP.BackBufferCount = 1
  44.         DPP.BackBufferFormat = Mode.Format
  45.         DPP.SwapEffect = D3DSWAPEFFECT_FLIP
  46.         DPP.AutoDepthStencilFormat = D3DFMT_D16
  47.         DPP.EnableAutoDepthStencil = 1
  48.         DPP.BackBufferWidth = 宽度
  49.         DPP.BackBufferHeight = 高度
  50.         DPP.Windowed = 1
  51.     ElseIf 全屏 = True Then
  52.         DPP.SwapEffect = D3DSWAPEFFECT_DISCARD
  53.         DPP.BackBufferFormat = D3DFMT_R5G6B5
  54.         DPP.BackBufferCount = 1
  55.         DPP.BackBufferWidth = 宽度
  56.         DPP.BackBufferHeight = 高度
  57.             
  58.         DPP.AutoDepthStencilFormat = D3DFMT_D16
  59.         DPP.EnableAutoDepthStencil = 1
  60.         DPP.hDeviceWindow = 窗口句柄
  61.     End If
  62.     Set D3DDevice = D3D8.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, 窗口句柄, D3DCREATE_SOFTWARE_VERTEXPROCESSING, DPP)
  63.     If D3DDevice Is Nothing Then
  64.         MsgBox "D3D初始化失败!", vbSystemModal, "初始化错误"
  65.         End
  66.     End If
  67.     
  68.     Set MainSprite = D3DX.CreateSprite(D3DDevice)
  69.     ResetStates
  70.     With D3DDevice
  71.         
  72.         .SetRenderState D3DRS_POINTSPRITE_ENABLE, 1 'True
  73.         .SetRenderState D3DRS_POINTSCALE_ENABLE, 0 'True
  74.         .SetRenderState D3DRS_POINTSIZE, FtoDW(15)
  75. '        .SetRenderState D3DRS_POINTSIZE_MIN, lngFloat0
  76. '        .SetRenderState D3DRS_POINTSCALE_A, lngFloat0
  77. '        .SetRenderState D3DRS_POINTSCALE_B, lngFloat0
  78. '        .SetRenderState D3DRS_POINTSCALE_C, lngFloat1
  79.         .SetRenderState D3DRS_SRCBLEND, D3DBLEND_SRCALPHA
  80.         .SetRenderState D3DRS_DESTBLEND, D3DBLEND_ONE
  81.         .SetRenderState D3DRS_ALPHABLENDENABLE, 1
  82.         .SetVertexShader FVF
  83.     End With
  84.     
  85.     Fnt.Name = "宋体"
  86.     Fnt.Size = 9
  87.     Set D3DFontDesc = Fnt
  88.     Set D3DFont = D3DX.CreateFont(D3DDevice, D3DFontDesc.hFont)
  89.     
  90.     Fnt.Name = "宋体"
  91.     Fnt.Size = 9
  92.     Fnt.Underline = True
  93.     Set D3DFontDesc = Fnt
  94.     Set D3DFont1 = D3DX.CreateFont(D3DDevice, D3DFontDesc.hFont)
  95.     
  96.     Fnt.Name = "宋体"
  97.     Fnt.Size = 9
  98.     Fnt.Underline = False
  99.     Set D3DFontDesc = Fnt
  100.     Set D3DFont2 = D3DX.CreateFont(D3DDevice, D3DFontDesc.hFont)
  101.     
  102.     
  103.     InitD3DSound
  104. End Sub
  105. Public Sub ResetStates()
  106.     With D3DDevice
  107.         Call .SetVertexShader(FVF)
  108.         Call .SetRenderState(D3DRS_LIGHTING, False)
  109.         Call .SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA)
  110.         Call .SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA)
  111.         Call .SetRenderState(D3DRS_ZENABLE, False)
  112.         Call .SetRenderState(D3DRS_ZWRITEENABLE, False)
  113.         Call .SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE)
  114.         Call .SetRenderState(D3DRS_SHADEMODE, D3DSHADE_FLAT)
  115.         Call .SetRenderState(D3DRS_FILLMODE, CONST_D3DFILLMODE.D3DFILL_SOLID)
  116.         .SetTextureStageState 0, D3DTSS_COLORARG1, D3DTA_TEXTURE
  117.         .SetTextureStageState 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE
  118.         .SetTextureStageState 0, D3DTSS_COLOROP, D3DTOP_MODULATE
  119.         .SetTextureStageState 0, D3DTSS_ALPHAOP, D3DTOP_MODULATE
  120.         Call .SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR)
  121.         Call .SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR)
  122.     End With
  123. End Sub
  124. '////////////// 定义声音模块  /////////////////////////////////
  125. Sub InitD3DSound()
  126.     Set DS = DX8.DirectSoundCreate("")
  127.     DS.SetCooperativeLevel FrmMain.hWnd, DSSCL_NORMAL
  128.     DSBDESC.lFlags = DSBCAPS_CTRLFREQUENCY Or DSBCAPS_CTRLPAN Or DSBCAPS_CTRLVOLUME
  129. End Sub
  130. '///////////////////////// 定义创建贴图函数 ///////////////////////////////
  131. Public Sub CreateTexture(mTexInfo As TexInfo, FileName As String, Optional Width As Long = -1, Optional Height As Long = -1, Optional ColorKey As OLE_COLOR = &HFF000000)
  132.     Dim FileData() As Byte, mLen As Long
  133. On Error GoTo eLabel:
  134.     
  135. CrTex:
  136.     Close #1
  137.     If mTexInfo.Enabled = True Then Exit Sub
  138.     Open FileName For Binary As #1
  139.         Get #1, mTexInfo.StartPos + 1, mTexInfo.Wid
  140.         Get #1, , mTexInfo.Hei
  141.         Get #1, , mTexInfo.PosX
  142.         Get #1, , mTexInfo.PosY
  143.         mLen = mTexInfo.EndPos - mTexInfo.StartPos
  144.         ReDim FileData(mLen - 1)
  145.         Get #1, mTexInfo.StartPos + 13, FileData()
  146.     Close #1
  147.     Open App.Path & "mir.dat" For Binary As #1
  148.         Put #1, , BH
  149.         BI.biWidth = mTexInfo.Wid
  150.         BI.biHeight = mTexInfo.Hei
  151.         BI.biSizeImage = BI.biWidth * BI.biHeight
  152.         Put #1, , BI
  153.         Put #1, , BiRGB()
  154.         Put #1, , FileData()
  155.     Close #1
  156.     
  157.     
  158.     Set mTexInfo.Tex = D3DX.CreateTextureFromFileEx(D3DDevice, App.Path & "mir.dat", Width, Height, _
  159.                                               D3DX_DEFAULT, D3DUSAGE_RENDERTARGET, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, _
  160.                                               D3DX_FILTER_NONE, D3DX_FILTER_NONE, ColorKey, ByVal 0, _
  161.                                                 ByVal 0)
  162.     If mTexInfo.Tex Is Nothing Then
  163.         MsgBox "无法生成材质" & FileName
  164.     End If
  165.     AddResErrorCount = 0
  166.     Exit Sub
  167. eLabel:
  168. '    If MsgBox("加载材质" & FileName & "失败", vbYesNo Or vbDefaultButton2, "错误") = vbYes Then
  169. '        Unload FrmMain
  170. '        End
  171. '    End If
  172.     
  173.     AddResErrorCount = AddResErrorCount + 1
  174.     mTexInfo.Enabled = True
  175.     If AddResErrorCount > 2 Then
  176.         MsgBox "加载游戏资源错误,游戏将中止!,请尝试重新进入游戏!"
  177.         ReleaseMemory
  178.         ClearDx
  179.         End
  180.     End If
  181.     ReleaseMemory
  182.     GoTo CrTex
  183. End Sub
  184. Public Sub CreateTexture1(Texture As Direct3DTexture8, FileName As String, Optional Width As Long = -1, Optional Height As Long = -1, Optional ColorKey As OLE_COLOR = &HFF000000)
  185.     
  186. On Error GoTo eLabel:
  187. CrTex:
  188.     Set Texture = D3DX.CreateTextureFromFileEx(D3DDevice, FileName, Width, Height, _
  189.                                               D3DX_DEFAULT, D3DUSAGE_RENDERTARGET, D3DFMT_UNKNOWN, D3DPOOL_DEFAULT, _
  190.                                               D3DX_FILTER_NONE, D3DX_FILTER_NONE, ColorKey, ByVal 0, _
  191.                                                 ByVal 0)
  192.     If Texture Is Nothing Then
  193.         MsgBox "无法生成材质" & FileName
  194.     End If
  195.     AddResErrorCount = 0
  196.     Exit Sub
  197. eLabel:
  198. '    If MsgBox("加载材质" & FileName & "失败", vbYesNo Or vbDefaultButton2, "错误") = vbYes Then
  199. '        Unload FrmMain
  200. '        End
  201. '    End If
  202.     
  203.     AddResErrorCount = AddResErrorCount + 1
  204.     If AddResErrorCount > 2 Then
  205.         MsgBox "加载游戏资源错误,游戏将中止!,请尝试重新进入游戏!"
  206.         ReleaseMemory
  207.         ClearDx
  208.         End
  209.     End If
  210.     ReleaseMemory
  211.     GoTo CrTex
  212. End Sub
  213. '//////////  释放游戏资源
  214. Public Sub ReleaseMemory()
  215.     Dim i As Long, j As Long
  216.     For i = 0 To UBound(HumTex)
  217.         Set HumTex(i).Tex = Nothing
  218.     Next
  219.     
  220.     For i = 0 To UBound(PrguseTex)
  221.         Set PrguseTex(i).Tex = Nothing
  222.     Next
  223.     
  224.     
  225.     For i = 0 To UBound(Prguse2Tex)
  226.         Set Prguse2Tex(i).Tex = Nothing
  227.     Next
  228.     
  229.     For i = 0 To UBound(Prguse3Tex)
  230.         Set Prguse3Tex(i).Tex = Nothing
  231.     Next
  232.     
  233.     For i = 0 To UBound(WeaponTex)
  234.         Set WeaponTex(i).Tex = Nothing
  235.     Next
  236.     
  237.     For i = 0 To UBound(NpcTex)
  238.         Set NpcTex(i).Tex = Nothing
  239.     Next
  240.     
  241. '    For i = 1 To UBound(MagicPic)
  242. '        For j = 0 To UBound(MagicPic(i).MagicTex)
  243. '            Set MagicPic(i).MagicTex(j).Tex = Nothing
  244. '        Next
  245. '    Next
  246.     
  247.     For i = 0 To UBound(ItemsTex)
  248.         Set ItemsTex(i).Tex = Nothing
  249.     Next
  250.     
  251.     For i = 0 To UBound(StateItemTex)
  252.         Set StateItemTex(i).Tex = Nothing
  253.     Next
  254.     
  255.     For i = 1 To UBound(MonPic)
  256.         For j = 0 To UBound(MonPic(i).MonTex)
  257.             Set MonPic(i).MonTex(j).Tex = Nothing
  258.         Next
  259.     Next
  260. End Sub
  261. Public Function CreateVertex(X As Single, Y As Single, Z As Single, rhw As Single, color As Long, _
  262.                                                specular As Long, tu As Single, tv As Single) As TLVERTEX
  263.     CreateVertex.X = X
  264.     CreateVertex.Y = Y
  265.     CreateVertex.Z = Z
  266.     CreateVertex.rhw = rhw
  267.     CreateVertex.color = color
  268.     CreateVertex.specular = specular
  269.     CreateVertex.tu = tu
  270.     CreateVertex.tv = tv
  271. End Function
  272. Public Sub DrawAlphaTex(Texture As Direct3DTexture8, X1 As Single, Y1 As Single, X2 As Single, Y2 As Single, Optional nColor As Long = -1)
  273.     D3DDevice.SetTexture 0, Texture
  274.     Dim Ver(3) As TLVERTEX
  275.     Ver(0) = CreateVertex(X1, Y1, 0, 0, nColor, 0, 0, 0)
  276.     Ver(1) = CreateVertex(X2, Y1, 0, 0, nColor, 0, 1, 0)
  277.     Ver(2) = CreateVertex(X1, Y2, 0, 0, nColor, 0, 0, 1)
  278.     Ver(3) = CreateVertex(X2, Y2, 0, 0, nColor, 0, 1, 1)
  279.     D3DDevice.DrawPrimitiveUP D3DPT_TRIANGLESTRIP, 2, Ver(0), Len(Ver(0))
  280.     
  281. End Sub
  282. Public Function FtoDW(f As Single) As Long
  283.     Dim buf As D3DXBuffer
  284.     Dim l As Long
  285.     Set buf = D3DX.CreateBuffer(4)
  286.     D3DX.BufferSetData buf, 0, 4, 1, f
  287.     D3DX.BufferGetData buf, 0, 4, 1, l
  288.     FtoDW = l
  289. End Function
  290. Public Function Draw(Texture As Direct3DTexture8, X As Long, Y As Long, RC As RECT, _
  291.                Optional ScX1 As Single = 1, Optional ScY1 As Single = 1, _
  292.                Optional Rot1 As Single = 0, Optional cColor As OLE_COLOR = &HFFFFFFFF)
  293. On Error GoTo ER
  294.     
  295.     
  296.     Dim rt As D3DVECTOR2
  297.     Dim sc As D3DVECTOR2
  298.     Dim tl As D3DVECTOR2
  299.     If Texture Is Nothing Then GoTo ER
  300.     
  301.     sc.X = ScX1: sc.Y = ScY1
  302.     tl.X = X: tl.Y = Y
  303.     rt.X = RC.Right / 2
  304.     rt.Y = RC.bottom / 2
  305.     Dim mmmRECT As RECT
  306.     mmmRECT.Left = RC.Left
  307.     mmmRECT.Top = RC.Top
  308.     mmmRECT.Right = RC.Right
  309.     mmmRECT.bottom = RC.bottom
  310.     
  311.     MainSprite.Draw Texture, RC, sc, rt, Rot1, tl, cColor
  312. ER:
  313.     
  314.    
  315. End Function
  316. Public Sub ClearDx()
  317.     Set MainSprite = Nothing
  318.     Set D3DDevice = Nothing
  319.     Set D3D8 = Nothing
  320.     Set D3DX = Nothing
  321.     Set DX8 = Nothing
  322. End Sub