Dado que la versión publicada de la librería contiene un bug importante referente a las funciones _HIT de la clase dx_Input_Class que se usan para detectar pulsaciones individuales y no constantes y dado que no dispongo de tiempo para arreglar todos los bugs y temas pendientes de la librería ni de componer nuevas publicaciones desarrolle hace algún tiempo esta pequeña clase de apoyo que redefine las funciones _HIT por unas propias y añade un código de actualización de estados propio. A continuación tenéis el código de la clase y después los pasos necesarios para utilizarla y un pequeño ejemplo de su uso:
' GameInputHitEvent.cls
' Version 1.0
' Clase complemento para la clase dx_Input_Class de dx_lib32 2.2.0 para lectura de eventos de pulsaciones.
' José Miguel Sánchez Fernández - 09/02/2009 (actualizado 07/02/2011)
Option Explicit
Private refGameInput As dx_Input_Class ' Referencia a la instacia de dx_Input_Class del programa.
Private keybHitState(255) As Boolean ' Estados de las teclas del teclado.
Private mouseHitState As Mouse_Data ' Estados de los botones del raton.
Private joyHitState(1 To 4, 1 To 16) As Boolean
' Inicializa la clase obteniendo la referencia a la instancia de la clase dx_Input_Class del programa:
Public Sub Initialize(GameInput As dx_Input_Class)
Set refGameInput = GameInput
End Sub
' Evalua si la tecla del teclado ha sido presionada:
Public Function Key_Hit(key As Key_Const) As Boolean
If refGameInput.key(key) And Not keybHitState(key) Then
keybHitState(key) = True
Key_Hit = True
End If
End Function
' Evalua si el boton del raton ha sido presionado:
Public Function Mouse_Hit(Button As Mouse_Button) As Boolean
If (Button = Left_Button And refGameInput.Mouse.Left_Button) And Not mouseHitState.Left_Button Then
mouseHitState.Left_Button = True
Mouse_Hit = True
ElseIf (Button = Right_Button And refGameInput.Mouse.Right_Button) And Not mouseHitState.Right_Button Then
mouseHitState.Right_Button = True
Mouse_Hit = True
ElseIf (Button = Middle_Button And refGameInput.Mouse.Middle_Button) And Not mouseHitState.Middle_Button Then
mouseHitState.Middle_Button = True
Mouse_Hit = True
End If
End Function
' Evalua si el boton del joystick ha sido pulsado:
Public Function Joystick_Hit(Joystick As Integer, Button As Joystick_Button) As Boolean
Dim value As Long
value = refGameInput.Joystick_Press(Joystick)
If value > 0 And Not joyHitState(Joystick, value) Then
joyHitState(Joystick, value) = True
Joystick_Hit = True
End If
End Function
' Actualiza los estados de la clase:
Public Sub Update()
Call UpdateKeyb
Call UpdateMouse
Call UpdateJoystick
End Sub
' Codigo encargado de actualizar los estados del teclado:
Private Sub UpdateKeyb()
Dim key As Long
For key = 0 To 255
If Not refGameInput.key(key) And keybHitState(key) Then keybHitState(key) = False
Next
End Sub
' Codigo encargado de actualizar los estados del raton:
Private Sub UpdateMouse()
If Not refGameInput.Mouse.Left_Button And mouseHitState.Left_Button Then mouseHitState.Left_Button = False
If Not refGameInput.Mouse.Right_Button And mouseHitState.Right_Button Then mouseHitState.Right_Button = False
If Not refGameInput.Mouse.Middle_Button And mouseHitState.Middle_Button Then mouseHitState.Middle_Button = False
End Sub
' Codigo encargado de actualizar los estados de los joysticks:
Private Sub UpdateJoystick()
Dim i As Long, j As Long
For i = 1 To 4
With refGameInput.Joystick(i)
If .X = 0 Then
joyHitState(i, 13) = False
joyHitState(i, 15) = False
ElseIf .Y = 0 Then
joyHitState(i, 14) = False
joyHitState(i, 16) = False
Else
For j = 1 To 12
If Not .Button(i) And joyHitState(i, i) Then joyHitState(i, i) = False
Next
End If
End With
Next
End Sub
' Destructor de la clase:
Private Sub Class_Terminate()
Set refGameInput = Nothing
End Sub
Copiar el codigo en un modulo clase y lo nombrais como GameInputHitEventClass. Después es tan sencillo como que lo añadais en vuestro proyecto y lo useis de la siguiente manera:
1. Crearos una instancia del objeto que sea visible desde cualquier parte del proyecto (donde tengáis instanciado dx_lib32 seria un buen lugar):
Public HitEvent As New GameInputHitEventClass
2 . Inicializar el objeto pasandole la instancia de la clase dx_Input_Class que tengais:
' Supongamos que vuestra instancia de dx_Input_Class se llame m_Input:
Call HitEvent.Initialize(m_Input)
3. Al principio de vuestro bucle principal, antes de nada, deberéis hacer la siguiente llamada para actualizar correctamente los estados de la clase, siempre antes de cualquier llamada que se vaya hacer para preguntar estados, de lo contrario no funcionara correctamente la sincronizacion:
Call HitEvent.Update()
4. Despues ya podreis llamar a las funciones de la clase para evaluar estados:
If HitEvent.Key_Hit(Key_Space) Or HitEvent.Mouse_Hit(Left_Button) Then ...
Las funciones de joystick no he podido evaluarlas (y en casa ya no tengo instalado Visual Basic 6.0 para probarlo) pero las del teclado y raton si funcionan y están probadas con el siguiente ejemplo:
Option Explicit
Dim GameInput As New dx_Input_Class
Dim HitEvent As New GameInputHitEventClass
Private Sub Form_Load()
Me.AutoRedraw = True
Call Me.Show
Call GameInput.Init(Me.hWnd)
Call HitEvent.Initialize(GameInput)
Dim i As Long
Do
Call HitEvent.Update
If HitEvent.Key_Hit(Key_Space) Or HitEvent.Mouse_Hit(Left_Button) Then
Select Case i
Case 0
Me.BackColor = vbRed
i = 1
Case 1
Me.BackColor = vbYellow
i = 2
Case 2
Me.BackColor = vbGreen
i = 3
Case 3
Me.BackColor = vbBlue
i = 0
End Select
End If
DoEvents
Loop
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set HitEvent = Nothing
GameInput.Terminate
End
End Sub
Salu2...