Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Intervalo entre disparos [Mi Matamarcianos en proceso]

Iniciado por Pilton88, 12 de Mayo de 2007, 05:58:40 PM

« anterior - próximo »

Pilton88

Como andan?
Resulta que quiero hacer un intervalo, entre cada disparo, del pj.
Obvio que es algo de logica, pero hoy estoy muy cabeza dura, no se que me pasa..
Desde ya les digo que lo que menos tiene el codigo por el momento, es optimizacion... asi que no me critiquen eso xd

Este es el codigo:

Codigo del frmMain:

Option Explicit

'Objetos indispensables
Public m_Gfx As dx_GFX_Class
Public m_Sound As dx_Sound_Class
Public m_System As dx_System_Class
Public m_Input As dx_Input_Class

'Variable de bucle principal
Private Looping As Boolean
'Variable de objeto que apunta a clsPersonaje
Public PJ As clsPersonaje
'Variable de objeto que apunta a clsDisparo
Public Disparo As clsDisparo
'Long donde se aloja el ID del grafico cargado del PJ
Public SpritePJ As Long
'Long donde se aloja el ID del grafico cargado del Disparo
Public SpriteShoot As Long
'Variable objeto que contiene info sobre el Sprite del PJ
Private GFXInfo As GFX_Info
'Flag disparando
Public Disparando As Boolean
'ID del TimerDisparo
Public TimerDisparo As Long
'Flag que indica si el timer esta activo
Public Contando As Boolean
'Variable que hara de AddressOf
Public ProcReferido As Long
Private Sub Form_Load()
   'Instanciamos los objetos
   Set m_Gfx = New dx_GFX_Class
   Set m_System = New dx_System_Class
   Set m_Input = New dx_Input_Class
   Set m_Sound = New dx_Sound_Class
   Me.Show
   Looping = True
   
   'Inicializamos el modo de video
   If m_Gfx.Init(Me.hWnd, frmMain.ScaleWidth, frmMain.ScaleHeight, , True, False, False) = False Then
       MsgBox "No se puede inicializar el modo de video."
       Exit Sub
   End If
   'Inicializamos el modo de entrada
   If m_Input.Init(Me.hWnd) = False Then
       MsgBox "Error en inicializacion de dispositivos de entrada."
       Exit Sub
   End If
   
   'Instanciamos el objeto que apunta al clsPersonaje
   Set PJ = New clsPersonaje
   
   'Cargamos la imagen "player.bmp" como un Sprite
   SpritePJ = m_Gfx.MAP_Load(App.Path & "\player.bmp", 0)
   '" " "disparo.bmp" como un Sprite
   SpriteShoot = m_Gfx.MAP_Load(App.Path & "\disparo.bmp", 0)
   
   'Obtenemos anchura y altura del Sprite
   Call m_Gfx.MAP_GetInfo(SpritePJ, GFXInfo)
   
   Do While Looping
       'Detectamos las teclas
       DetectaTecla
       If Disparando Then
           Disparo.Update
       End If
       'Dibujamos PJ
       PJ.Draw
       'Dibujamos Disparo
       If Disparando Then
           Disparo.Draw
       End If
       'Volcamos los graficos en pantalla, a 60 FPS
       m_Gfx.Frame 0, 60
       'Hacemos un STOP para que no se tilde el VB
       DoEvents
   Loop
   'Si salimos del bucle...
   End
End Sub

Private Sub DetectaTecla()
   'Si mantenemos pulsada la tecla Izquierda
   If m_Input.Key(Key_Left) Then
       'Decrementamos X de PJ en 15 unidades, lo cual es mas lento que de a 30...
       'Logico :D
       PJ.x = PJ.x - 10
       'Si X de PJ < 0...
       If PJ.x < 0 Then
           'La posicion de x sera igual a 0...
           PJ.x = 0
       End If
   ElseIf m_Input.Key(Key_Right) Then
       PJ.x = PJ.x + 10
       'Si la anchura del pj, sobre pasa al limite derecho de la pantalla....
       If PJ.x + GFXInfo.Width > 564 Then
           'X va a ser = al tope de la pantalla, menos la anchura del Sprite
           PJ.x = 564 - GFXInfo.Width
       End If
   ElseIf m_Input.Key_Hit(Key_Space) Then
       'Si se esta Contando, no hacemos nada (INTERVALO)
       If Contando = True Then Exit Sub
       'Si no estamos contando, entonces empezamos a contar
       If Contando = False Then
           Contando = True
       End If
       'Creamos una nueva instancia de clsDisparo
       Set Disparo = New clsDisparo
       'Flag disparando = True
       Disparando = True
       'Creamos un Timer
       TimerDisparo = m_System.TIMER_CreateProcess(Me.hWnd, 1000, AddressOf ProcDisparo)
   End If
End Sub


Codigo de modGeneral:

Option Explicit
Public i As Integer

Public Sub ProcDisparo()
   i = i + 1
   If i = 2 Then
       frmMain.Contando = False
       i = 0
       frmMain.m_System.TIMER_KillProcess frmMain.hWnd, frmMain.TimerDisparo
   End If
End Sub


Codigo de clsDisparo

Option Explicit

Public x As Long, y As Long

Public Sub Draw()
   frmMain.m_Gfx.DRAW_Map frmMain.SpriteShoot, x, y, 0, 0, 0
End Sub

Public Sub Update()
   'Actualizamos la logica del Disparo
   y = y - 20
   'Si el disparo llega a una posicion menor a 0 en Y..
   If frmMain.Disparo.y < 0 Then
       'Destruimos la instancia del disparo
       Set frmMain.Disparo = Nothing
       'Flag=false... no disparamos mas
       frmMain.Disparando = False
   End If
End Sub

Private Sub Class_Initialize()
   'La posicion X del disparo = Posicion del PJ en X
   x = frmMain.PJ.x
   y = frmMain.PJ.y
End Sub


Codigo de clsPersonaje:

Option Explicit

'Declaramos el ID y las coordenadas del PJ
Public x As Long, y As Long

Public Sub Draw()
   'Dibujamos, en la posicion "x" e "y", que vamos obteniendo
   'segun movamos el pj horizontalmente o verticalmente
   frmMain.m_Gfx.DRAW_Map frmMain.SpritePJ, x, y, 0, 0, 0
End Sub

Private Sub Class_Initialize()
   x = 200
   y = 200
End Sub


Desde ya debe ser una pavada, algo de los flags supongo :S... pero bueno, no lo puedo encontrar.
saludos.[/code]

EDIT: Aprovecho asi no hago otro post al pedo...
Como puedo hacer para dibujar un grafico sin el fondo? cosa de que no se vea horrible con el background que uno le pone.

EDIT2: Acabo de hacerlo con un timer... y me anda de 10, igual me gustaria saber que pasa que asi no me anda.

Gracias y adios.






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.