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.