Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Código de reemplazo de las funciones _HIT de dx_lib32 2.2.0

Iniciado por [EX3], 07 de Marzo de 2011, 01:41:17 PM

« anterior - próximo »

[EX3]

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...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt






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.