home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 1_2002.ISO / Data / Zips / CODE_UPLOAD62465302000.psc / fly.frm (.txt) < prev    next >
Encoding:
Visual Basic Form  |  2000-05-16  |  16.5 KB  |  574 lines

  1. VERSION 5.00
  2. Object = "{08216199-47EA-11D3-9479-00AA006C473C}#2.1#0"; "RMCONTROL.OCX"
  3. Begin VB.Form frm_Avion 
  4.    AutoRedraw      =   -1  'True
  5.    Caption         =   "3d Avioncito"
  6.    ClientHeight    =   3915
  7.    ClientLeft      =   165
  8.    ClientTop       =   735
  9.    ClientWidth     =   6195
  10.    Icon            =   "fly.frx":0000
  11.    KeyPreview      =   -1  'True
  12.    LinkTopic       =   "Form1"
  13.    ScaleHeight     =   261
  14.    ScaleMode       =   3  'Pixel
  15.    ScaleWidth      =   413
  16.    StartUpPosition =   3  'Windows Default
  17.    Begin VB.Timer Timer_Render 
  18.       Enabled         =   0   'False
  19.       Interval        =   24
  20.       Left            =   2520
  21.       Top             =   1770
  22.    End
  23.    Begin RMControl7.RMCanvas RMCanvas 
  24.       Height          =   3930
  25.       Left            =   0
  26.       TabIndex        =   0
  27.       Top             =   15
  28.       Width           =   6195
  29.       _ExtentX        =   10927
  30.       _ExtentY        =   6932
  31.    End
  32.    Begin VB.Menu Menu_Anima_Ppal 
  33.       Caption         =   "&Animaci
  34.       Begin VB.Menu mnu_Auto_Anima 
  35.          Caption         =   "&Autom
  36. tica"
  37.          Checked         =   -1  'True
  38.          Shortcut        =   {F5}
  39.       End
  40.       Begin VB.Menu Mnu_Linea 
  41.          Caption         =   "-"
  42.       End
  43.       Begin VB.Menu mnu_Anima_Manual 
  44.          Caption         =   "&Manual"
  45.          Shortcut        =   {F6}
  46.       End
  47.       Begin VB.Menu mnu_Dorno 
  48.          Caption         =   "-"
  49.       End
  50.       Begin VB.Menu mnu_Accidente 
  51.          Caption         =   "Accidente"
  52.          Shortcut        =   {F7}
  53.       End
  54.    End
  55.    Begin VB.Menu mnu_FPS 
  56.       Caption         =   "FPS"
  57.    End
  58. Attribute VB_Name = "frm_Avion"
  59. Attribute VB_GlobalNameSpace = False
  60. Attribute VB_Creatable = False
  61. Attribute VB_PredeclaredId = True
  62. Attribute VB_Exposed = False
  63. Option Explicit
  64. 'Modelo del avi
  65. Dim M_Avi
  66. n As Direct3DRMFrame3
  67. 'Cabina [ para controlar la posici
  68. n el avi
  69. Dim M_Cabina As Direct3DRMFrame3
  70. 'Su animaci
  71. Dim M_AnimaAvi
  72. n As Direct3DRMAnimation2
  73. 'Tiempo para la animaci
  74. Dim M_Tiempo As Single
  75.  volando?
  76. Dim M_Volando As Boolean
  77. Dim VelRot  'Velocidad Rotaci
  78. 'Aclaraciones:
  79. '======================================================================
  80. 'Un frame contiene la geometr
  81. a con posiciones y orientaci
  82. n diferentes
  83. 'Un MeshBuilder es pura geometr
  84. a y pueden cambiar la posici
  85. n y orientaci
  86. ' de sus objetos
  87. 'A su vez un frame puede ser vinculado a otro (una escena) y cuando se mueve
  88. ' todos los frames se mueven tambi
  89. n junto con los mesh-builders a
  90. adidos a 
  91. 'Es decir que cuando un frame se mueve todos sus mesh y frames tb lo hacen.
  92. '--=[Es algo as
  93.  como el sistema solar]=--------------------------------- :]
  94. '  Donde el sol es el frame ra
  95. z (base),a
  96. adido a 
  97. l se encuentran los
  98. 'frames childs o hijos que puede contener a la tierra, por ejemplo
  99. ' A su vez, a
  100. adido a la tierra (de geometr
  101. a inferior) se encuentran a
  102. adidos
  103. 'otros frames hijos como la luna con su propia geometr
  104. a, claro
  105. 'imagina que rotamos el Sol; esta rotaci
  106. n generar
  107. a en el frame de la tierra
  108. 'rotar alrededor de la 
  109. rbita del frame Sol
  110. ' Pero podemos rotar la tierra y todo lo que ella contiene dentro del frame del Sol
  111. '==================================================================================
  112. '  RMCanvas.SceneFrame
  113. 'Este objeto es la base de todos los dem
  114. s, incluido el ra
  115. z o base root
  116. ' es donde generamos nuestro mundo 3D
  117. '---------
  118. '  RMCanvas.CameraFrame
  119. '   Este objeto es un hijo de la escena.
  120. ' Como su propio nombre indica determina la posici
  121. n y orientaci
  122. 'de la c
  123. mara.
  124. ' Su valor por defecto es -10 unidades detr
  125. s del eje Z y mirando
  126. ' hacia adelante  0,0,0
  127. '---------
  128. '  RMCanvas.DirLightFrame
  129. '  Existen 2 luces por defecto establecidas para ser usadas.
  130. '    * La luz ambiental:
  131. '       + omnidirectional
  132. '       + sin location ni direction
  133. '    * La luz direccional: (hija de la escena-un foco,vamos)
  134. '       + debes usar las funciones setPosition and lookAt para
  135. '           posicionarla y orientarla.
  136. '       + valores por defecto: toward 0,0,0
  137. '---------
  138. '  RMCanvas.DirLight
  139. ' Este es el objeto que se establece en el FrameDirLight frame
  140. ' Puedes usar el m
  141. todo setColorRGB para cambiar el color de la luz.
  142. '---------
  143. '  RMCanvas.AmbientLight
  144. ' Este determina como es la luz ambiental de la escena.
  145. ' * setColorRGB cambia el color y la intesidad del light
  146. '   - no uses el blanco porque es "cegador", usa el gris claro :p
  147. '---------
  148. ' RMCanvas.Viewport
  149. ' Esto describe como funciona la c
  150. mara:
  151. '  * Usa el m
  152. todo setField para determinar como es de cerrada y amplia
  153. ' es el area que est
  154. s observando.
  155. '  * Con setFront y setBack determinas desde cu
  156. nta distancia te gustar
  157. ' ver y c
  158. mo de cerrado observas un objecto.
  159. ' Sirve adem
  160. s para obtener objetos que se est
  161. n visualizando, incluso
  162. 'se le puede pasar el evento Mouse_Over del rat
  163. n... :]
  164. '---------
  165. '  RMCanvas.Device
  166. '   Esto sirve para declarar el interfaz que controlar
  167.  el rendering
  168.  como la calidad de dibujo (SetQuality).
  169. ' Lo normal es el Gouraund.
  170. '---------
  171. '  RMCanvas.SceneSpeed
  172. '  En unidades por segundo, pueden ser ajustadas = que la rotaci
  173. ' y la velocidad que afectan a un objecto.Default=30 unidadess/sg.
  174. '---------
  175. '=================================================
  176. 'En fin, estas son las propiedades m
  177. s interesantes del control
  178. ' RMCanvas paraDirect3D, otras properties te permitir
  179. n por ejemplo
  180. ' dibujar sobre la escena como si fueran etiquetas, algo as
  181.  como las
  182. ' animaciones del CounterStrike para Half-Life :]
  183. 'Mirad por ejemplo: DDBackSurface y sus ejemplos.
  184. '=================================================
  185. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
  186. If Not mnu_Anima_Manual.Checked Then Exit Sub
  187. Dim Posici
  188. n_Actual As D3DVECTOR
  189. M_Avi
  190. n.GetPosition M_Cabina, Posici
  191. n_Actual
  192. VelRot = VelRot + 0.0001
  193. Select Case (KeyCode)
  194.     Case 37: 'Izquierda... 37
  195.         'M_Avi
  196. n.AddRotation D3DRMCOMBINE_AFTER, Posici
  197. n_Actual.X + 0.5, Posici
  198. n_Actual.Y + 0.5, Posici
  199. n_Actual.z + 0.5, -VelRot
  200.         'M_Avi
  201. n.AddRotation D3DRMCOMBINE_AFTER, 0#, 15#, 0#, VelRot
  202.         
  203.     Case 38: 'Arriba...
  204.         M_Avi
  205. n.AddRotation D3DRMCOMBINE_AFTER, 0#, 1#, 0#, 0.002
  206.     Case 39: 'Derecha... 39
  207.         M_Avi
  208. n.AddRotation D3DRMCOMBINE_AFTER, 0#, -15#, 0#, VelRot
  209.     Case 40: 'Abajo...
  210.         M_Avi
  211. n.SetPosition M_Cabina, Posici
  212. n_Actual.X, Posici
  213. n_Actual.Y + VelRot, Posici
  214. n_Actual.z
  215.         M_Avi
  216. n.AddRotation D3DRMCOMBINE_AFTER, 0, 1#, 1#, VelRot
  217.     Case 82: 'Rotar
  218.         M_Avi
  219. n.AddRotation D3DRMCOMBINE_AFTER, Posici
  220. n_Actual.X + 0.5, Posici
  221. n_Actual.Y + 0.5, Posici
  222. n_Actual.z + 0.5, VelRot
  223.     Case 76: 'Looping Star!
  224.         M_Avi
  225. n.AddRotation D3DRMCOMBINE_AFTER, Posici
  226. n_Actual.X, Posici
  227. n_Actual.Y, Posici
  228. n_Actual.z + 10, VelRot
  229.     Case Else:
  230.         Exit Sub
  231. End Select
  232. M_AnimaAvi
  233. n.SetFrame RMCanvas.CameraFrame
  234. M_Avi
  235. n.LookAt M_Cabina, Nothing, D3DRMCONSTRAIN_Z
  236. 'RMCanvas.CameraFrame.SetPosition Nothing, Posici
  237. n_Actual.x - 10, Posici
  238. n_Actual.y - 10, Posici
  239. n_Actual.z - 10
  240. RMCanvas.CameraFrame.LookAt M_Avi
  241. n, Nothing, D3DRMCONSTRAIN_Z
  242. End Sub
  243. Private Sub Form_KeyUp(KeyCode As Integer, Shift As Integer)
  244.     VelRot = 0.002
  245. End Sub
  246. Private Sub Form_Load()
  247. Static Rula As Boolean
  248. 'Creamos una variable est
  249. tica para llamadas entre m
  250. dulos
  251. ' es decir que no pierda su valor al hacer referencia a 
  252. ' desde otra funci
  253. n y sepamos si rulaba o no el 3D :]
  254.     If Rula = True Then End
  255.    Rula = True
  256. 'Mostrar el formulario antes de cargar la escena
  257.     Me.Show
  258. 'Hacer los dem
  259. s eventos antes de la escena...
  260.     DoEvents
  261.     VelRot = 0.0002
  262.     Inicio
  263. End Sub
  264. Private Sub Form_Resize()
  265. 'Tama
  266. o del Canvas al mismo tama
  267. o que la ventana...
  268.     RMCanvas.width = Me.ScaleWidth
  269.     RMCanvas.height = Me.ScaleHeight
  270. End Sub
  271. Sub Inicio()
  272. Dim Rula As Boolean
  273. Dim sFile As String
  274. '  Vamos a ejecutarlo en modo ventana...
  275. '  encontramos el hardware 3D del 'Display' Primario...
  276. '  si no lo encuentra usar
  277.  el Software emulation RGB rasterizer
  278. Rula = RMCanvas.StartWindowed
  279.     If Rula = False Then
  280.         MsgBox "
  281. No puedo iniciar Direct3D con Hardware!" & vbCrLf & _
  282.         vbCrLf & " 
  283.  Renderizando con software...", vbCritical, "Error de Hardware"
  284.         RMCanvas.Use3DHardware = False
  285.     End If
  286.     Crear_Escena
  287.     Timer_Render.Enabled = True
  288. End Sub
  289. Sub Crear_Escena()
  290. If StrConv(Dir(App.Path & "\land4.x", vbArchive), vbUpperCase) <> "LAND4.X" Then
  291.     MsgBox "No puedo encontrar los mapas de superficie!!", vbCritical, "Error de ficheros"
  292.     End
  293.     Crear_Tierra
  294.     Crear_Modelo
  295.     Crear_Trayectoria_Animaci
  296. End If
  297. End Sub
  298. Sub Crear_Tierra()
  299. Dim mb_deTierra As Direct3DRMMeshBuilder3
  300. Static m_tierra As Direct3DRMFrame3
  301. Dim Caja As D3DRMBOX
  302. Dim i As Integer, j As Integer
  303. '- Creamos el frame de la tierra perteneciente al de la escena
  304.     Set m_tierra = RMCanvas.D3DRM.CreateFrame(RMCanvas.SceneFrame)
  305. '- Ahora creamos un objeto para dibujar estructuras...
  306.     Set mb_deTierra = RMCanvas.D3DRM.CreateMeshBuilder()
  307. '- Y cargamos su geometr
  308. a de un ficherofile en el constructor de estructuras
  309. ndolo en el frame.
  310.     mb_deTierra.LoadFromFile App.Path & "\land4.x", 0, 0, Nothing, Nothing
  311.     m_tierra.AddVisual mb_deTierra
  312. 'Hacemos que la tierra sea mayor escal
  313. ndola y tomando su extensi
  314. ' la colocamos en una caja, as
  315.  sabremos cu
  316. nto mide exactamente, es como
  317. ' tomar las medidas de una fase de un juego para que el personaje
  318. ' no se salga de ella. :)
  319.     mb_deTierra.ScaleMesh 10, 8, 10
  320.     mb_deTierra.GetBox Caja
  321. 'Metemos sus medidas en la caja, un poco de imaginaci
  322. Dim RangO As Single
  323. 'Ahora tomamos los ejes de la caja...
  324.     RangO = Caja.Max.Y - Caja.Min.Y
  325. 'Creamos el color de fondo...
  326.     'RMCanvas.SceneFrame.SetSceneBackground &H6060E0
  327. 'La textura de fondo... -by juax- :)
  328.     Dim Textura_Fondo As Direct3DRMTexture3
  329.     Set Textura_Fondo = RMCanvas.CreateUpdateableTexture(256, 256, App.Path & "\cloud3.bmp")
  330.     Textura_Fondo.SetShades Rnd * 50
  331.     Textura_Fondo.GenerateMIPMap
  332.     RMCanvas.SceneFrame.SetSceneBackgroundImage Textura_Fondo
  333. 'Y establecemos el color de la luz ambiental por defecto
  334. ' del control RMCanvas...
  335.     RMCanvas.AmbientLight.SetColorRGB 0.36, 0.36, 0.36
  336. 'Dibujamos las caras seg
  337. n su largo:
  338.     Dim Vertice As D3DVECTOR, Vector_Normal As D3DVECTOR, Y As Single
  339. 'Recorremos todos los vertices del MeshBuilder de Tierra
  340.     For i = 0 To mb_deTierra.GetFaceCount() - 1
  341.         Y = Caja.Min.Y
  342.     'Y a su vez por todas las caras...
  343.         For j = 0 To mb_deTierra.GetFace(i).GetVertexCount() - 1
  344.             mb_deTierra.GetFace(i).GetVertex j, Vertice, Vector_Normal
  345.     'Colocamos todos los v
  346. rtices dentro de la caja
  347.             If Vertice.Y > Y Then Y = Vertice.Y
  348.         Next
  349.         If (Y - Caja.Min.Y) / RangO < 0.05 Then
  350.     'Si la cara por la que vamos en el bucle se ve por encima de la tierra, es decir
  351.     ' la c
  352. mara lo ve se dibuja de color potito sino pues de blanco,,,
  353.             Call mb_deTierra.GetFace(i).SetColorRGB((Y - Caja.Min.Y) / RangO, 0.6, 1 - (Y - Caja.Min.Y) / RangO)
  354.         Else
  355.             Call mb_deTierra.GetFace(i).SetColorRGB(0.2 + (Y - Caja.Min.Y) / RangO, 1 - (Y - Caja.Min.Y) / RangO, 0.5)
  356.         End If
  357.     Next
  358. End Sub
  359. Sub Crear_Modelo()
  360.     Dim mb_Avi
  361. n As Direct3DRMMeshBuilder3
  362. 'Creamos un MeshBuilder Avi
  363. n para dibujar el modelo...
  364.     Set mb_Avi
  365. n = RMCanvas.D3DRM.CreateMeshBuilder()
  366. 'Cargandolo de un fichero.X...
  367.     mb_Avi
  368. n.LoadFromFile App.Path & "\dropship.x", 0, 0, Nothing, Nothing
  369. 'Le ajustamos el tama
  370.     mb_Avi
  371. n.ScaleMesh 0.015, 0.008, 0.015
  372.     ' y el color...
  373.     mb_Avi
  374. n.SetColorRGB 0.8, 0.8, 0.8
  375. 'Creamos un Frame para representar el modelo...
  376. Set M_Avi
  377. n = RMCanvas.D3DRM.CreateFrame(RMCanvas.SceneFrame)
  378.   ' a
  379. ndolo a la escena
  380.     M_Avi
  381. n.AddVisual mb_Avi
  382.     Dim Textura As Direct3DRMTexture3
  383.     Set Textura = RMCanvas.CreateUpdateableTexture(64, 64, App.Path & "\banana.bmp")
  384.     Textura.GenerateMIPMap
  385.     Textura.SetName "Banana"
  386.     M_Avi
  387. n.SetTexture Textura
  388.     M_Avi
  389. n.GetParent.SetTexture Textura
  390. 'Lo mismo con su chase (cabina)...
  391. Set M_Cabina = RMCanvas.D3DRM.CreateFrame(RMCanvas.SceneFrame)
  392. 'Crea un array de 1000 v
  393. rtices de DirectX 
  394.  :P ?
  395. 'Dim verts(1000) As D3DRMVERTEX
  396. End Sub
  397. Sub Crear_Trayectoria_Animaci
  398. Dim Datos_Trayectoria()
  399. Dim X As Single, Y As Single, z As Single, i As Integer
  400. 'Los valores del array son las posiciones del objeto:
  401.     Datos_Trayectoria = Array( _
  402.             -8, 3, -12, _
  403.             -4, 2, -8, _
  404.             -2, 0, -4, _
  405.              9, -1, 7, _
  406.              4, 6, 10, _
  407.             -4, 5, 9, _
  408.              5.5, 3.5, -6.5, _
  409.              2, 5, -10, _
  410.              0, 4, -15, _
  411.             -5, 4, -15, _
  412.             -8, 3, -12)
  413. '...una vez establecida la trayectoria con puntos se puede
  414. ' crear la animaci
  415. Set M_AnimaAvi
  416. n = RMCanvas.D3DRM.CreateAnimation()
  417. 'Las opciones de la animaci
  418. n est
  419. n establecidas aqu
  420.  abajo para que
  421. ' se repita continuamente...
  422.     M_AnimaAvi
  423. n.SetOptions D3DRMANIMATION_CLOSED Or D3DRMANIMATION_SPLINEPOSITION Or D3DRMANIMATION_POSITION
  424. Dim Posici
  425. n As D3DRMANIMATIONKEY
  426. 'Este bucle va de 10 en 10 cambiando la posici
  427. n del modelo:
  428.     For i = 0 To 10
  429. 'Toma los datos escalares del array de posiciones preparado
  430. ' especialmente para este "mapa".
  431.         X = Datos_Trayectoria(i * 3)
  432.         Y = Datos_Trayectoria(i * 3 + 1)
  433.         z = Datos_Trayectoria(i * 3 + 2)
  434. 'Esto de aqu
  435.  abajo se ahorra con: m_AnimaAvi
  436. n.AddPositionKey i, x, y, z
  437.         Posici
  438. n.dvX = X
  439.         Posici
  440. n.dvY = Y
  441.         Posici
  442. n.dvZ = z
  443.         Posici
  444. n.lKeyType = 3
  445.         Posici
  446. n.dvTime = i
  447. adimos el juego de posiciones a la animaci
  448. n para que sepa donde
  449. ' tiene que colocar el objeto.
  450.         M_AnimaAvi
  451. n.AddKey Posici
  452.     Next
  453. End Sub
  454. Sub Movimiento_Camara_Avi
  455. n(delta As Single)
  456.     Dim Direcci
  457. n As D3DVECTOR
  458.     Dim Direcci
  459. n_Antig
  460. a As D3DVECTOR
  461.     Dim Direcci
  462. mara As D3DVECTOR
  463.     Dim Dir_Ant_Cam As D3DVECTOR
  464. 'Velocidad de la escena...
  465.     RMCanvas.SceneSpeed = 1
  466. 'El tiempo de la animaci
  467. n va cambiando con el movimiento de
  468. ' la c
  469. mara el delta es el valor de la propia escena...
  470.     M_Tiempo = M_Tiempo + delta
  471. 'Colocamos la c
  472. mara seg
  473. n la animaci
  474.     M_AnimaAvi
  475. n.SetFrame RMCanvas.CameraFrame
  476.     M_AnimaAvi
  477. n.SetTime M_Tiempo + 0
  478. '...al igual que el modelo del avi
  479.     M_AnimaAvi
  480. n.SetFrame M_Avi
  481.     M_AnimaAvi
  482. n.SetTime M_Tiempo + 0.5
  483. '...y el chase (cabina)...
  484.     M_AnimaAvi
  485. n.SetFrame M_Cabina
  486.     M_AnimaAvi
  487. n.SetTime M_Tiempo + 1
  488. 'orientamos la c
  489. mara hacia el avi
  490.     RMCanvas.CameraFrame.LookAt M_Avi
  491. n, Nothing, D3DRMCONSTRAIN_Z
  492. 'y el avi
  493. n a su vez lo orientamos hacia la cabina...
  494.     M_Avi
  495. n.LookAt M_Cabina, Nothing, D3DRMCONSTRAIN_Y
  496. 'tomamos la orientaci
  497. n de la c
  498. mara...
  499.     RMCanvas.CameraFrame.GetOrientation Nothing, Direcci
  500. n_Antig
  501. a, Dir_Ant_Cam
  502. 'y la del avi
  503.     M_Avi
  504. n.GetOrientation Nothing, Direcci
  505. n, Direcci
  506. n_Antig
  507. 'almacen
  508. ndolas en sus correspondientes variables...
  509.     Direcci
  510. n_Antig
  511. a.X = Direcci
  512. n.X - Direcci
  513. n_Antig
  514.     Direcci
  515. n_Antig
  516. a.Y = Direcci
  517. n.Y - Direcci
  518. n_Antig
  519. a.Y + 1#
  520.     Direcci
  521. n_Antig
  522. a.z = Direcci
  523. n.z - Direcci
  524. n_Antig
  525. 'Ahora podemos colocar al avi
  526. n (:] eehhee) en su sitio:
  527.     M_Avi
  528. n.SetOrientation Nothing, Direcci
  529. n.X, Direcci
  530. n.Y, Direcci
  531. n.z, Direcci
  532. n_Antig
  533. a.X, Direcci
  534. n_Antig
  535. a.Y, Direcci
  536. n_Antig
  537. 'Fondo..
  538. If mnu_Accidente.Checked Then _
  539.     RMCanvas.SceneFrame.AddRotation D3DRMCOMBINE_AFTER, Rnd * 2, Rnd * 2, Rnd * 2, 0.1
  540.     RMCanvas.CameraFrame.SetColorRGB Rnd * 256, Rnd * 255, Rnd * 123
  541.     Dim Superficie As DDSURFACEDESC2
  542.     RMCanvas.DDraw.CreateSurfaceFromFile App.Path & "\cloud3.bmp", Superficie
  543.     RMCanvas.DDraw.CreateSurface Superficie
  544. End Sub
  545. Private Sub Form_Unload(Cancel As Integer)
  546.     M_Volando = False
  547. End Sub
  548. Private Sub mnu_Accidente_Click()
  549.     mnu_Accidente.Checked = Not mnu_Accidente.Checked
  550. End Sub
  551. Private Sub mnu_Anima_Manual_Click()
  552. If mnu_Anima_Manual.Checked Then Exit Sub
  553.     mnu_Anima_Manual.Checked = True
  554.     mnu_Auto_Anima.Checked = False
  555. End Sub
  556. Private Sub mnu_Auto_Anima_Click()
  557. If mnu_Auto_Anima.Checked Then Exit Sub
  558.     mnu_Anima_Manual.Checked = False
  559.     mnu_Auto_Anima.Checked = True
  560. End Sub
  561. Private Sub RMCanvas_KeyDown(KeyCode As Integer, Shift As Integer)
  562.     Call Form_KeyDown(KeyCode, False)
  563. End Sub
  564. Private Sub RMCanvas_SceneMove(delta As Single)
  565. If mnu_Auto_Anima.Checked Then _
  566.      Movimiento_Camara_Avi
  567. n delta
  568. End Sub
  569. Private Sub Timer_Render_Timer()
  570.     RMCanvas.Update
  571.     DoEvents
  572.     mnu_FPS.Caption = RMCanvas.FPS
  573. End Sub
  574.