SurfBack.frm
上传用户:tjgy203
上传日期:2013-07-04
资源大小:621k
文件大小:24k
源码类别:

DirextX编程

开发平台:

Visual Basic

  1. VERSION 5.00
  2. Begin VB.Form frmMain 
  3.    BorderStyle     =   0  'None
  4.    Caption         =   "Character Animation-By MartWare-FPS:"
  5.    ClientHeight    =   6810
  6.    ClientLeft      =   0
  7.    ClientTop       =   0
  8.    ClientWidth     =   9945
  9.    LinkTopic       =   "Form1"
  10.    MaxButton       =   0   'False
  11.    ScaleHeight     =   454
  12.    ScaleMode       =   3  'Pixel
  13.    ScaleWidth      =   663
  14.    ShowInTaskbar   =   0   'False
  15.    StartUpPosition =   2  '屏幕中心
  16.    Begin VB.Label Label1 
  17.       Caption         =   "Label1"
  18.       Height          =   15
  19.       Left            =   360
  20.       TabIndex        =   0
  21.       Top             =   360
  22.       Visible         =   0   'False
  23.       Width           =   135
  24.    End
  25. End
  26. Attribute VB_Name = "frmMain"
  27. Attribute VB_GlobalNameSpace = False
  28. Attribute VB_Creatable = False
  29. Attribute VB_PredeclaredId = True
  30. Attribute VB_Exposed = False
  31. '****************************************************************************
  32. '人人为我,我为人人
  33. '枕善居汉化收藏整理
  34. '发布日期:05/05/06
  35. '描  述:DirectX游戏编程-----3D机器人模型
  36. '网  站:http://www.mndsoft.com/
  37. 'e-mail:mnd@mndsoft.com
  38. 'OICQ  : 88382850
  39. '****************************************************************************
  40. 'Hi all.
  41. 'Some people asked me if it's possible to use animated .x files with
  42. 'Direct3D Retain Mode;
  43. 'in some VB forums I had read that it's not possible, or it's possible only
  44. 'in Direct3D Immediate Mode, or that the only method in Retain Mode is to create
  45. 'a loop of several static x. files.
  46. 'Well, this is not correct: it's possible to use an .x file with animation
  47. 'data in Direct3DRM, as you can see in this example;
  48. 'I think the best way to do this is to create an animated 3DS file and
  49. 'then convert it in an animated .x file with Conv3ds.exe having the -A option.
  50. '
  51. 'This application wants to be only an example not a real game (it was the beginning of
  52. 'a RobotsWar 3D game project, but I have suspended it at today), but I am sure you could
  53. 'find some interesting things in it.
  54. '
  55. 'The robot bullet are moving with a traslation: best way is to get them the set.velocity
  56. '
  57. 'The explosion was only a simple experiment of nice 3d effect using a surface, but the sequence
  58. 'decrease the speed of application; I have left it in this program because it's good for
  59. 'static objects.
  60. 'I have used this method to create trees in my City3D program because of several up and down views;
  61. 'however if you have the same height for view, the best way is using the billboard method.
  62. '
  63. 'If you choose 1024x768 display mode, a weapon appear for the player
  64. '(for other resolution you need to make some calculations).
  65. '
  66. 'Everybody can modify the code or employ parts of it within own projects, I don't care (just
  67. 'a little credit, please) but NOBODY MUST USE ANY PART OF THIS PROGRAM IN COMMERCIAL
  68. 'PURPOSES.
  69. '
  70. 'Every comments, suggestions, ideas and e-mails are always welcomed to:
  71. 'fabiocalvi@ yahoo.com
  72. '
  73. 'Happy coding and have fun!
  74. 'Goodbye, Fabio.
  75. '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  76. 'Arrow Keys moving you around scene
  77. '
  78. 'Pageup key: looking up
  79. 'Pagedown key: looking down
  80. 'Q key: rotate robot to left
  81. 'W key: rotate robot to right
  82. 'Space key: robot shoot
  83. 'Ctrl key: you are firing
  84. 'Z key:explosion
  85. Option Explicit
  86. Const pi = 3.1415927
  87. ' direct x objects
  88. Dim dx As New DirectX7
  89. Dim dd As DirectDraw4
  90. Dim SurfPrimary As DirectDrawSurface4
  91. Dim SurfBack As DirectDrawSurface4
  92. Dim DDSDPrimary As DDSURFACEDESC2
  93. Dim DDCapsBack As DDSCAPS2
  94. Dim dev As Direct3DRMDevice3
  95. Dim clip As DirectDrawClipper
  96. Dim d3drm As Direct3DRM3
  97. Dim scene As Direct3DRMFrame3
  98. Dim cam As Direct3DRMFrame3
  99. Dim pos As D3DVECTOR
  100. Dim view As Direct3DRMViewport2
  101. Dim mesh As Direct3DRMMeshBuilder3
  102. Dim m_objectFrame(1000) As Direct3DRMFrame3
  103. Dim m_meshBuilder(1000) As Direct3DRMMeshBuilder3
  104. Dim m_object As Direct3DRMMeshBuilder3
  105. Dim bullet(1000) As D3DVECTOR
  106. ' animation variables
  107. Dim animframe As Direct3DRMFrame3 ' frame that holds the animation
  108. Dim anim As Direct3DRMAnimationSet2 ' the actual animation
  109. Dim animpos As D3DVECTOR
  110. Dim curframe As Single ' the current frame that the animation is at
  111. Dim active(1000) As Boolean
  112. Dim Keyctrl As Boolean
  113. Dim Keyright As Boolean
  114. Dim Keyleft As Boolean
  115. Dim Keydown As Boolean
  116. Dim Keyup As Boolean
  117. Dim KeyQ As Boolean
  118. Dim KeyW As Boolean
  119. Dim KeyZ As Boolean
  120. Dim Keyspace As Boolean
  121. Dim Keyescape As Boolean
  122. Dim KeyPagedown As Boolean
  123. Dim KeyPageup As Boolean
  124. Dim I As Integer, j As Integer
  125. Dim LastTime As Long
  126. Dim NumFramesDone As Integer
  127. Dim FrameText As String
  128. Dim GameFont As IFont
  129. Dim StartGameTime As Long, nowTime As Long
  130. Dim MaxSpeed As Integer
  131. Dim Grados As Integer
  132. Dim grado2 As Integer
  133. Dim valor As Integer
  134. Dim corx As Single
  135. Dim corz As Single
  136. Dim NoEdgeW As DDCOLORKEY
  137. Dim Weapon11 As DirectDrawSurface4
  138. Dim Weapon12 As DirectDrawSurface4
  139. Dim Weapon13 As DirectDrawSurface4
  140. Dim Stretching As DDSURFACEDESC2
  141. Dim Weapon1Width
  142. Dim Weapon1Height
  143. Dim Weapon1Attributes As RECT
  144. Dim Weapon1X As Integer
  145. Dim Weapon1Y As Integer
  146. Dim MouseX
  147. Dim MouseY
  148. Dim WeaponSwitchable
  149. Dim shootcount As Byte
  150. Dim Sfondo As Direct3DRMTexture3
  151. Dim explframe As Integer, explo As Boolean, nameexplo As String
  152. Dim mexplo(4) As Direct3DRMFace2
  153. Dim explox As Single, exploz As Single
  154. Private Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
  155. Private Sub form_KeyDown(KeyCode As Integer, Shift As Integer)
  156.    If KeyCode = vbKeyControl Then Keyctrl = True
  157.    If KeyCode = vbKeyZ Then KeyZ = True
  158.    If KeyCode = vbKeyRight Then Keyright = True
  159.    If KeyCode = vbKeyLeft Then Keyleft = True
  160.    If KeyCode = vbKeyDown Then Keydown = True
  161.    If KeyCode = vbKeyEscape Then Keyescape = True
  162.    If KeyCode = vbKeyUp Then Keyup = True
  163.    If KeyCode = vbKeySpace Then
  164.       Keyspace = True
  165.       If j < 1001 Then j = j + 1
  166.    End If
  167.    If KeyCode = vbKeyQ Then KeyQ = True
  168.    If KeyCode = vbKeyW Then KeyW = True
  169.    If KeyCode = vbKeyPageUp Then KeyPageup = True
  170.    If KeyCode = vbKeyPageDown Then KeyPagedown = True
  171. End Sub
  172. Private Sub form_Keyup(KeyCode As Integer, Shift As Integer)
  173.    If KeyCode = vbKeyControl Then Keyctrl = False
  174.    If KeyCode = vbKeyZ Then KeyZ = False
  175.    If KeyCode = vbKeyRight Then Keyright = False
  176.    If KeyCode = vbKeyLeft Then Keyleft = False
  177.    If KeyCode = vbKeyDown Then Keydown = False
  178.    If KeyCode = vbKeyEscape Then Keyescape = False
  179.    If KeyCode = vbKeyUp Then Keyup = False
  180.    If KeyCode = vbKeySpace Then Keyspace = False
  181.    If KeyCode = vbKeyQ Then KeyQ = False
  182.    If KeyCode = vbKeyW Then KeyW = False
  183.    If KeyCode = vbKeyPageUp Then KeyPageup = False
  184.    If KeyCode = vbKeyPageDown Then KeyPagedown = False
  185. End Sub
  186. ' main sub
  187. Public Sub init_dx(nWidth As Integer, nHeight As Integer, nDepth As Integer, nGUID As String, nDetail As Integer)
  188. Dim t1 As Long, fogcolor As Single
  189. Dim Starttick As Long, LastTick As Long
  190. Dim collidev As Boolean, collideb As Boolean
  191. Dim distance As Single, distanceb As Single
  192. StartGameTime = dx.TickCount
  193. MaxSpeed = 30
  194. Unload frmSplash
  195.    
  196.    'RED GETS MULTIPLIED BY 2^16 OR 65536. GREEN GETS MULTIPLIED BY 2^8 OR 256.
  197.    'BLUE GETS MULTIPLIED BY 2^0 OR 1. VERY EASY, ADD 'EM UP TO SPECIFY COLOR.
  198.     fogcolor = 125 * 65536 + 125 * 256 + 125
  199.     
  200.     t1 = dx.TickCount()
  201.     
  202.     Set dd = dx.DirectDraw4Create("")
  203.     dd.SetCooperativeLevel Me.hWnd, DDSCL_FULLSCREEN Or DDSCL_EXCLUSIVE
  204.     
  205.     ' this will be full-screen, so set the display mode
  206.     dd.SetDisplayMode CLng(nWidth), CLng(nHeight), CLng(nDepth), 0, DDSDM_DEFAULT
  207.     
  208.     ' create the primary surface
  209.     DDSDPrimary.lFlags = DDSD_CAPS Or DDSD_BACKBUFFERCOUNT
  210.     DDSDPrimary.ddsCaps.lCaps = DDSCAPS_PRIMARYSURFACE Or DDSCAPS_3DDEVICE Or DDSCAPS_COMPLEX Or DDSCAPS_FLIP
  211.     DDSDPrimary.lBackBufferCount = 1
  212.     Set SurfPrimary = dd.CreateSurface(DDSDPrimary)
  213.            
  214.     ' get the back buffer
  215.     DDCapsBack.lCaps = DDSCAPS_BACKBUFFER
  216.     Set SurfBack = SurfPrimary.GetAttachedSurface(DDCapsBack)
  217.     
  218.     ' Create the Retained Mode object
  219.     Set d3drm = dx.Direct3DRMCreate()
  220.     
  221.     SurfBack.SetForeColor RGB(0, 255, 0)
  222.     
  223.     Set dev = d3drm.CreateDeviceFromSurface(nGUID, dd, SurfBack, D3DRMDEVICE_DEFAULT)
  224.     
  225.     dev.SetBufferCount 2
  226.     
  227.     Select Case nDetail
  228.        Case 0
  229.           dev.SetQuality D3DRMLIGHT_ON Or D3DRMFILL_SOLID
  230.        Case 1
  231.           dev.SetQuality D3DRMLIGHT_ON Or D3DRMRENDER_GOURAUD
  232.           'Linear texturing looks better
  233.           dev.SetTextureQuality D3DRMTEXTURE_LINEAR
  234.           dev.SetRenderMode D3DRMRENDERMODE_BLENDEDTRANSPARENCY
  235.     End Select
  236.     
  237.     Set scene = d3drm.CreateFrame(Nothing)
  238.     Set cam = d3drm.CreateFrame(scene)
  239.     
  240. '    Set Sfondo = d3drm.LoadTexture("sky.bmp")
  241. '    scene.SetSceneBackgroundImage Sfondo
  242.     
  243.     dev.SetDither D_TRUE
  244.     Set view = d3drm.CreateViewport(dev, cam, 0, 0, Me.ScaleWidth, Me.ScaleHeight)
  245.     view.SetBack 5000!
  246.    
  247.     Set mesh = d3drm.CreateMeshBuilder()
  248.     mesh.SetPerspective D_TRUE
  249.     scene.AddVisual mesh
  250.     
  251.     For I = 1 To 1000
  252.     active(I) = False
  253.     Next
  254.     
  255.     ' create walls
  256.     Call MakeWall(d3drm, mesh, -1000, -15, 1000, 1000, -15, 1000, 1000, -15, -1000, -1000, -15, -1000, "wall", 20, 20, 0, 0, 0) ' grass texture on the floor
  257.     Call MakeWall(d3drm, mesh, 200, 15, 1000, -200, 15, 1000, -200, 15, -1000, 200, 15, -1000, "roof", 3, 3, 0, 0, 0)
  258.     Call MakeWall(d3drm, mesh, 200, -15, 1000, -200, -15, 1000, -200, 15, 1000, 200, 15, 1000, "r10", 18, 3, 0, 0, 0)
  259.     Call MakeWall(d3drm, mesh, 200, 15, -1000, -200, 15, -1000, -200, -15, -1000, 200, -15, -1000, "r10", 18, 3, 0, 0, 0)
  260.     Call MakeWall(d3drm, mesh, 200, -15, 1000, 200, 15, 1000, 200, 15, -1000, 200, -15, -1000, "r10", 3, 60, 0, 0, 0)
  261.     Call MakeWall(d3drm, mesh, -200, 15, 1000, -200, -15, 1000, -200, -15, -1000, -200, 15, -1000, "r10", 3, 60, 0, 0, 0)
  262.     
  263.     ' create animation frame
  264.     Set animframe = d3drm.CreateFrame(scene)
  265.     ' create animation set
  266.     Set anim = d3drm.CreateAnimationSet()
  267.     anim.LoadFromFile "cyborg.x", 0, D3DRMLOAD_FROMFILE, Nothing, Nothing, animframe ' load animation into frame and animation set
  268.     animframe.AddScale D3DRMCOMBINE_BEFORE, 0.1, 0.1, 0.1
  269.     animframe.SetPosition scene, 0, -15, 100
  270.     For I = 1 To 1000
  271.        Set m_objectFrame(I) = d3drm.CreateFrame(scene)
  272.        Set m_meshBuilder(I) = d3drm.CreateMeshBuilder()
  273.        m_meshBuilder(I).LoadFromFile "cuboid13.x", 0, D3DRMLOAD_FROMFILE, Nothing, Nothing
  274.        m_objectFrame(I).AddScale D3DRMCOMBINE_REPLACE, 0.01, 0.01, 0.01
  275.        m_objectFrame(I).AddVisual m_meshBuilder(I)
  276.        m_objectFrame(I).SetPosition animframe, -50, 90, -20
  277.     Next I
  278.    
  279.     ' add light to camera
  280.     Dim light(4) As Direct3DRMLight
  281.     Dim lightframe(4) As Direct3DRMFrame3
  282.     
  283.     For I = 1 To 4
  284.     Set light(I) = d3drm.CreateLightRGB(D3DRMLIGHT_POINT, 1, 1, 1)
  285.     light(I).SetRange 1000
  286.     light(I).SetColorRGB 255, 255, 255
  287.     light(I).SetUmbra 0.8
  288.     light(I).SetPenumbra 1.1
  289.     Set lightframe(I) = d3drm.CreateFrame(scene)
  290.     lightframe(I).AddLight light(I)
  291.     Next
  292.     lightframe(1).SetPosition scene, 1000, 15, 1000
  293.     lightframe(2).SetPosition scene, -1000, 15, 1000
  294.     lightframe(3).SetPosition scene, -1000, 15, -1000
  295.     lightframe(4).SetPosition scene, 1000, 15, -1000
  296.    
  297.     ' add a bit of ambient light to the scene
  298.     scene.AddLight d3drm.CreateLightRGB(D3DRMLIGHT_AMBIENT, 0.5, 0.5, 0.5)
  299.      
  300. '    scene.SetSceneFogEnable 1 'true
  301. '    scene.SetSceneFogMode D3DRMFOG_LINEAR 'EXPONENTIAL
  302. '    scene.SetSceneFogColor fogcolor
  303. '    scene.SetSceneBackground fogcolor
  304. '    scene.SetSceneFogMethod D3DRMFOGMETHOD_TABLE
  305. '    scene.SetSceneFogParams 1, 200, 1
  306. '    scene.SetZbufferMode D3DRMZBUFFER_ENABLE
  307. '    scene.SetSortMode D3DRMSORT_FRONTTOBACK
  308.     
  309.     DoEvents
  310.     explo = False
  311.     valor = 5
  312.     
  313.     Weapon1Width = Int(600 / 1) '1024
  314.     Weapon1Height = Int(324 / 1) '768
  315.     Stretching.lFlags = DDSD_CAPS
  316.     Stretching.ddsCaps.lCaps = DDSCAPS_OFFSCREENPLAIN
  317.     Stretching.lWidth = Weapon1Width
  318.     Stretching.lHeight = Weapon1Height
  319.     Set Weapon11 = dd.CreateSurfaceFromFile("weapon11.bmp", Stretching)
  320.     Weapon11.SetColorKey DDCKEY_SRCBLT, NoEdgeW
  321.     Set Weapon12 = dd.CreateSurfaceFromFile("weapon12.bmp", Stretching)
  322.     Weapon12.SetColorKey DDCKEY_SRCBLT, NoEdgeW
  323.     Set Weapon13 = dd.CreateSurfaceFromFile("weapon13.bmp", Stretching)
  324.     Weapon13.SetColorKey DDCKEY_SRCBLT, NoEdgeW
  325.     Weapon1Attributes.Left = 0
  326.     Weapon1Attributes.Right = Weapon1Width
  327.     Weapon1Attributes.Top = 0
  328.     Weapon1Attributes.Bottom = Weapon1Height
  329.     NoEdgeW.low = RGB(0, 0, 0)
  330.     NoEdgeW.high = 0
  331.     
  332.     ' start main loop
  333.     Do While DoEvents()
  334.         
  335.        DoEvents
  336.        Starttick = dx.TickCount
  337.        DoEvents
  338.         
  339.         nowTime = dx.TickCount
  340.         Do Until nowTime - LastTick > MaxSpeed
  341.             DoEvents
  342.             nowTime = dx.TickCount
  343.         Loop
  344.         LastTick = nowTime
  345.         FrameText = Int(1000 / (dx.TickCount - Starttick + 1))
  346.         
  347.        'Move forward
  348.         If Keyup = True Then
  349.            corx = corx + valor * Sin(Grados * pi / 180)
  350.            corz = corz + valor * Cos(Grados * pi / 180)
  351.            cam.SetPosition scene, corx, 0, corz
  352.         End If
  353.         
  354.         'Move back
  355.         If Keydown = True Then
  356.            corx = corx - valor * Sin(Grados * pi / 180)
  357.            corz = corz - valor * Cos(Grados * pi / 180)
  358.            cam.SetPosition scene, corx, 0, corz
  359.         End If
  360.         
  361.         'Rotate left
  362.         If Keyleft = True Then
  363.            Grados = Grados - valor
  364.            cam.AddRotation D3DRMCOMBINE_BEFORE, 1, 0, 0, -(grado2 * pi / 180)
  365.            cam.AddRotation D3DRMCOMBINE_BEFORE, 0, 1, 0, -(valor * pi / 180)
  366.            cam.AddRotation D3DRMCOMBINE_BEFORE, 1, 0, 0, (grado2 * pi / 180)
  367.         End If
  368.         
  369.         'Rotate right
  370.         If Keyright = True Then
  371.            Grados = Grados + valor
  372.            cam.AddRotation D3DRMCOMBINE_BEFORE, 1, 0, 0, -(grado2 * pi / 180)
  373.            cam.AddRotation D3DRMCOMBINE_BEFORE, 0, 1, 0, (valor * pi / 180)
  374.            cam.AddRotation D3DRMCOMBINE_BEFORE, 1, 0, 0, (grado2 * pi / 180)
  375.         End If
  376.         
  377.         'Look up
  378.         If KeyPageup = True Then
  379.             grado2 = grado2 - valor
  380.             If grado2 > -90 Then
  381.                cam.AddRotation D3DRMCOMBINE_BEFORE, 1, 0, 0, -(valor * pi / 180)
  382.             Else
  383.                grado2 = grado2 + valor
  384.             End If
  385.         End If
  386.         
  387.         'Look down
  388.         If KeyPagedown = True Then
  389.             grado2 = grado2 + valor
  390.             If grado2 < 90 Then
  391.                cam.AddRotation D3DRMCOMBINE_BEFORE, 1, 0, 0, (valor * pi / 180)
  392.             Else
  393.                grado2 = grado2 - valor
  394.             End If
  395.         End If
  396.        
  397.         curframe = curframe + 1
  398.             
  399.         ' check if current frame is too high or low
  400.         If curframe > 40 Then curframe = 0
  401.         If curframe < 0 Then curframe = 40
  402.         
  403.         'move the robot
  404.         animframe.AddTranslation D3DRMCOMBINE_BEFORE, 0, 0, -2
  405.         
  406.         For I = 1 To 1000
  407.             If active(I) = False Then
  408.                m_objectFrame(I).SetPosition animframe, -50, 90, -20
  409.             End If
  410.         Next I
  411.         
  412.         'reset the animation frames
  413.         If curframe > 40 Then anim.SetTime 40 Else anim.SetTime curframe
  414.         
  415.         ' rotate robot left
  416.         If KeyQ = True Then
  417.            animframe.AddRotation D3DRMCOMBINE_BEFORE, 0, 1, 0, 0.05
  418.            For I = 1 To 1000
  419.               If active(I) = False Then m_objectFrame(I).AddRotation D3DRMCOMBINE_BEFORE, 0, 1, 0, 0.05
  420.            Next
  421.         End If
  422.         ' rotate robot right
  423.         If KeyW = True Then
  424.            animframe.AddRotation D3DRMCOMBINE_BEFORE, 0, 1, 0, -0.05
  425.            For I = 1 To 1000
  426.               If active(I) = False Then m_objectFrame(I).AddRotation D3DRMCOMBINE_BEFORE, 0, 1, 0, -0.05
  427.            Next
  428.         End If
  429.         ' active robot shooting
  430.         If Keyspace = True Then
  431.            If j < 1001 Then active(j) = True
  432.         End If
  433.                 
  434.         For I = 1 To 1000
  435.             m_objectFrame(I).GetPosition scene, bullet(I)
  436.             If I <= j And active(I) = True Then
  437.                distanceb = Sqr((bullet(I).X - corx) ^ 2 + (bullet(I).z - corz) ^ 2)
  438.                If distanceb <= 10 Then
  439.                   collideb = True
  440.                   active(I) = False
  441.                Else
  442.                   m_objectFrame(I).AddTranslation D3DRMCOMBINE_BEFORE, 0, 0, -1500
  443.                End If
  444.             End If
  445.         Next
  446.         
  447.         If collideb = True Then
  448.            Dim k As Integer
  449.            For k = 1 To 2
  450.                If k = 1 Then
  451.                   grado2 = grado2 + valor
  452.                   cam.AddRotation D3DRMCOMBINE_BEFORE, 1, 0, 0, (valor * pi / 180)
  453.                 Else
  454. '                  grado2 = grado2 - valor
  455. '                  cam.AddRotation D3DRMCOMBINE_BEFORE, 1, 0, 0, -(valor * pi / 180)
  456.                 End If
  457.                 view.Clear D3DRMCLEAR_ALL
  458.                 view.Render scene
  459.                 dev.Update
  460.            Next
  461.            collideb = False
  462.         End If
  463.         
  464.         cam.GetPosition scene, pos
  465.         animframe.GetPosition scene, animpos
  466.         
  467.         ' don't overcross the limits of room
  468. '        If pos.X < -175 Then pos.X = -175
  469. '        If pos.X > 175 Then pos.X = 175
  470. '        If pos.z < -975 Then pos.z = -975
  471. '        If pos.z > 975 Then pos.z = 975
  472.         If animpos.X < -185 Then animpos.X = -185
  473.         If animpos.X > 185 Then animpos.X = 185
  474.         If animpos.z < -985 Then animpos.z = -985
  475.         If animpos.z > 985 Then animpos.z = 985
  476.    
  477.         cam.SetPosition scene, pos.X, pos.Y, pos.z
  478.         animframe.SetPosition scene, animpos.X, animpos.Y, animpos.z
  479.   
  480.   
  481.         If KeyZ = True Then
  482.            explo = True
  483.            explframe = -1
  484.         End If
  485.         If explo = True Then
  486.            explframe = explframe + 1
  487.            If explframe = 18 Then
  488.               explo = False
  489.               explframe = -1
  490.            End If
  491.            If explo = True And explframe > -1 And explframe < 18 Then
  492.               nameexplo = "2200" & explframe
  493.               explox = 50
  494.               exploz = 50
  495.               Call MakeExplo(d3drm, mesh, explox, 15, exploz - 20, explox, 15, exploz + 20, explox, -15, exploz + 20, explox, -15, exploz - 20, nameexplo, 1, 1, 1)
  496.               Call MakeExplo(d3drm, mesh, explox - 20, 15, exploz, explox + 20, 15, exploz, explox + 20, -15, exploz, explox - 20, -15, exploz, nameexplo, 1, 1, 2)
  497.               Call MakeExplo(d3drm, mesh, explox + 20, 15, exploz, explox - 20, 15, exploz, explox - 20, -15, exploz, explox + 20, -15, exploz, nameexplo, 1, 1, 3)
  498.               Call MakeExplo(d3drm, mesh, explox, 15, exploz + 20, explox, 15, exploz - 20, explox, -15, exploz - 20, explox, -15, exploz + 20, nameexplo, 1, 1, 4)
  499.            End If
  500.        End If
  501.        
  502.         view.Clear D3DRMCLEAR_ALL
  503.         view.Render scene
  504.         dev.Update
  505.               
  506.         If explo = True And explframe > -1 And explframe < 18 Then
  507.             For I = 1 To 4
  508.                 mesh.DeleteFace mexplo(I)
  509.             Next
  510.         End If
  511.         ' check to exit
  512.         If Keyescape = True Then Unload Me: End
  513.         
  514.         'Set GameFont = Label1.Font
  515.         'SurfBack.SetFont GameFont
  516.         'Call SurfBack.DrawText(10, 10, "D3DRM Full Screen, Esc to exit", False)
  517.         'Call SurfBack.DrawText(10, 30, "Current frame rate: " & FrameText & " fps", False)
  518.         
  519.         If Keyctrl = True Then
  520.            shootcount = shootcount + 1
  521.            If shootcount > 3 Then
  522.               Call SurfBack.BltFast(424, 443, Weapon12, Weapon1Attributes, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY)
  523.               shootcount = 0
  524.             Else
  525.                Call SurfBack.BltFast(424, 443, Weapon13, Weapon1Attributes, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY)
  526.             End If
  527.         Else
  528.             shootcount = 0
  529.             Call SurfBack.BltFast(424, 443, Weapon11, Weapon1Attributes, DDBLTFAST_WAIT Or DDBLTFAST_SRCCOLORKEY)
  530.         End If
  531.         
  532.         SurfPrimary.Flip Nothing, DDFLIP_WAIT
  533.     
  534.     Loop
  535.     
  536. End Sub
  537. Private Sub MakeWall(d3drm As Direct3DRM3, mesh As Direct3DRMMeshBuilder3, X1 As Single, Y1 As Single, z1 As Single, x2 As Single, y2 As Single, z2 As Single, x3 As Single, y3 As Single, z3 As Single, x4 As Single, y4 As Single, z4 As Single, TexFile As String, TileX As Single, TileY As Single, r As Single, g As Single, b As Single)
  538.     ' local variables
  539.     Dim wall As Direct3DRMFace2
  540.     Dim texwall As Direct3DRMTexture3
  541.     ' create face
  542.     Set wall = d3drm.CreateFace()
  543.     ' add vertexs
  544.     wall.AddVertex X1, Y1, z1
  545.     wall.AddVertex x2, y2, z2
  546.     wall.AddVertex x3, y3, z3
  547.     wall.AddVertex x4, y4, z4
  548.     ' get type of file
  549.     If TexFile = "" Then
  550.         ' set colors
  551.         wall.SetColorRGB r, g, b
  552.     Else
  553.         ' create texture
  554.         Set texwall = d3drm.LoadTexture(App.Path & "" & TexFile & ".bmp")
  555.         ' set u and v values
  556.         wall.SetTextureCoordinates 0, 0, 0
  557.         wall.SetTextureCoordinates 1, TileX, 0
  558.         wall.SetTextureCoordinates 2, TileX, TileY
  559.         wall.SetTextureCoordinates 3, 0, TileY
  560.         ' set the texture
  561.         wall.SetTexture texwall
  562.     End If
  563.     ' add face to mesh
  564.     mesh.AddFace wall
  565. End Sub
  566. Private Sub MakeExplo(d3drm As Direct3DRM3, mesh As Direct3DRMMeshBuilder3, X1 As Single, Y1 As Single, z1 As Single, x2 As Single, y2 As Single, z2 As Single, x3 As Single, y3 As Single, z3 As Single, x4 As Single, y4 As Single, z4 As Single, TexFile As String, TileX As Single, TileY As Single, ind As Byte)
  567.     ' local variables
  568.     Dim t As Direct3DRMTexture3
  569.     ' create face
  570.     Set mexplo(ind) = d3drm.CreateFace()
  571.     ' add vertexs
  572.     mexplo(ind).AddVertex X1, Y1, z1
  573.     mexplo(ind).AddVertex x2, y2, z2
  574.     mexplo(ind).AddVertex x3, y3, z3
  575.     mexplo(ind).AddVertex x4, y4, z4
  576.     ' get type of file
  577.     If TexFile = "" Then
  578.         MsgBox ("Texture file missing")
  579.         End
  580.     Else
  581.         ' create texture
  582.         Set t = d3drm.LoadTexture(App.Path & "" & TexFile & ".bmp")
  583.         t.SetDecalTransparency D_TRUE
  584.         t.SetDecalTransparentColor 0
  585.         ' set u and v values
  586.         mexplo(ind).SetTextureCoordinates 0, 0, 0
  587.         mexplo(ind).SetTextureCoordinates 1, TileX, 0
  588.         mexplo(ind).SetTextureCoordinates 2, TileX, TileY
  589.         mexplo(ind).SetTextureCoordinates 3, 0, TileY
  590.         ' set the texture
  591.         mexplo(ind).SetTexture t
  592.     End If
  593.     ' add face to mesh
  594.     mesh.AddFace mexplo(ind)
  595. End Sub
  596. Sub EndIT()
  597. Call dd.RestoreDisplayMode
  598. Call dd.SetCooperativeLevel(Me.hWnd, DDSCL_NORMAL)
  599. End
  600. End Sub
  601. Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
  602.     MouseX = X
  603.     MouseY = Y
  604. End Sub
  605. Private Sub Weapon1Edge(bytTileNumber As Byte, ByRef intTileX As Integer, ByRef intTileY As Integer, ByRef Weapon1Attributes As RECT)
  606.     Weapon1Attributes.Left = 0
  607.     Weapon1Attributes.Right = Weapon1Width
  608.     Weapon1Attributes.Top = 0
  609.     Weapon1Attributes.Bottom = Weapon1Height
  610.     
  611.     If intTileX < 0 Then
  612.         Weapon1Attributes.Left = Weapon1Attributes.Left - intTileX
  613.         intTileX = 0
  614.     End If
  615.     
  616.     If intTileY < 0 Then
  617.         Weapon1Attributes.Top = Weapon1Attributes.Top - intTileY
  618.         intTileY = 0
  619.     End If
  620.     
  621.     If intTileX + Weapon1Width > 1024 Then
  622.         Weapon1Attributes.Right = Weapon1Attributes.Right + (1024 - (intTileX + Weapon1Width))
  623.     End If
  624.     
  625.     If intTileY + Weapon1Height > 768 Then
  626.         Weapon1Attributes.Bottom = Weapon1Attributes.Bottom + (768 - (intTileY + Weapon1Height))
  627.     End If
  628.     
  629. End Sub