Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Problema con mouse - joystick

Iniciado por LucifersAngel, 09 de Febrero de 2009, 04:35:22 AM

« anterior - próximo »

LucifersAngel

Hola que tal , aca esta parte del codigo de mi juego , tengo un problema muy simple pero pienso que puede ser algun bug de la libreria ya que no lo he podido resolver , fijarse en las letras en negrita dentro del codigo
Citar
Option Explicit

Private Sub Form_Load()

Enter = 0
Me.Show
Me.SetFocus

'************************ ESTOS PASOS SIGUIENTES VAN SIEMPRE ********************************

' Creamos los objetos de dx_lib32:
    Set n_Gfx = New dx_GFX_Class
    Set n_Input = New dx_Input_Class
    Set n_Sound = New dx_Sound_Class
    Set n_System = New dx_System_Class

' Inicializamos los objetos:
    Call n_Gfx.Init(Me.hWnd, 1024, 768, 32, True, False, False, 60)
    Call n_Input.Init(Me.hWnd)
    Call n_Sound.Init(Me.hWnd, 64)

'************************************************************************************************

'************************** INICIAMOS AUDIO ************************************************

Set Audio = New dx_Sound_Class

Audio.Init Me.hWnd, 64 ' Inicializamos el motor de audio con 64 canales para efectos de sonido.

Snd1 = Audio.MUSIC_Load(App.Path & "\Sounds\intro.wav") ' Cargamos en memoria la muestra de sonido.
Audio.MUSIC_Play (Snd1)


'************************************************************************************************

'***********************************  DIBUJAMOS  ***********************************************

Set Mapa1 = New Map_class1
Mapa1.Cargar_GFX_Main    ' Cargamos los graficos necesarios para el main

Call n_Gfx.DRAW_Map(gfx_back0, 400, n_Gfx.Screen.Height / 2, 0, 227, 20) ' A game made fan
Call n_Gfx.DRAW_Map(gfx_back1, 420, 412, 0, 186, 22) ' Presents


Call n_Gfx.Frame

'************************************************************************************************

'*********************************** BUCLE DE EVENTOS******************************************

Do

With n_Input ' Todas entradas input
   
    If .Key(Key_Escape) = True Then
        End
    End If

    If .Key(Key_Enter) Then
        If Enter = 0 Then
            Call Audio.MUSIC_Stop(Primary_Buffer)
            Snd1 = Audio.MUSIC_Load(App.Path & "\Sounds\music10.wav") ' Cargamos en memoria la muestra de sonido.
            Audio.MUSIC_Play (Snd1)
            Enter = Enter + 1
            Call n_Gfx.DRAW_Map(gfx_back2, 214, 100, 0, 596, 72) ' Titulo MultiHero
            Call n_Gfx.DRAW_Map(gfx_back3, 100, 300, 0, 96, 72) ' Stage
            Call n_Gfx.Frame
        End If
    End If


    If .Mouse_Hit(Left_Button) = True Then
        With .Mouse 'Entradas Mouse
            If .X >= 100 And .X <= 196 And .Y >= 300 And .Y <= 372 Then
                Exit Do
            End If
        End With 'De Todas entradas mouse
    End If
       

   

End With 'De Todas entradas input

Loop

'************************************************************************************************

'*********************************** CAMBIAMOS DE FORM ******************************************

'********************************** Y LIBERAMOS MEMORIA *****************************************

Me.Hide
Load Form2

End Sub

'************************************************************************************************


El porblema esta en que al utilizar la sentencia if con cualquier accion del mouse o joystick no funciona, simplemente no responde no tira error ni nada , si pongo alguna del teclado si funciona, ahora vien si hago lo mismo en otro proyecto nuevo desde cero con el mouse o joystick funciona, nose si habra algun conflicto entre el input y los bucles o nose

Hechelion

#1
acabo de cargar tu código y me funciona sin problema.

en vez del mouse_hit prueba con el Mouse_press, me da la idea que Ex3 en la última versión metió un timer en los eventos HIT (a pedido de un usuario) y ese timer hace que el evento HIT se sobredetecte en equipos rápidos y no se detecte bien en equipos más lentos, de paso sería la explicación de porque te funciona mal el juego Khonquista.

PD más menos por la mitad del siguiente hilo comentaba algo muy similar que me pasa con el evento HIT y concuerdo contigo, creo que es un error en la libreria (sorry Ex3, pero parece que tendrás que darnos una mano por acá)
http://www.stratos-ad.com/forums/index.php?topic=11317.0

LucifersAngel

Hola mi colega hechelion , creo que somos los unicos com dije por aca  :P
Mira agradazeco tu respuesta, ya fue solucionado el problema, y sabes como? es algo raro .. el codigo estaba bien
lo que tuve que hacer es agregar al final del loop un Frame (call n_gfx.Frame) , porque por lo visto sino usamos esta funcion de frame no detecta inmediatamente ni el mouse ni el joystick. Aver que opinan de esto ud's. Hasta la proxima hechelion  :D

[EX3]

Aunque no venga a cuento al problema en si pero este codigo no es correcto en cuanto a rendimiento:
Código (vbnet) [Seleccionar]
Call Audio.MUSIC_Stop(Primary_Buffer)
Snd1 = Audio.MUSIC_Load(App.Path & "\Sounds\music10.wav") ' Cargamos en memoria la muestra de sonido.
Audio.MUSIC_Play (Snd1)

Si has de cargar recursos, sea lo que sea, cargalos al principio del programa o en la carga de niveles o en el intermedio que sea, pero nunca "en mitad de la accion". Ahi estas cargando el mismo sample de musica en cada vuelta de bucle y mientras se cumpla la condicion donde esta declarado, lo que viene a decir que estas creando varias copias del mismo buffer en memoria ya que no descargas las anteriores y a parte de ir llenando la memoria esa carga genera pequeñas paradas en la ejecucion lo que podria provocar que algunas funciones no respondan adecuadamente o a destiempo. Carga ese sample de musica en tu apartado de carga de audio junto al otro sample de audio.

Sobre el problema del hilo, esta visto que no me voy a quitar la **ta funcion de encima en la vida  :grrr: Acabo de probarla en la oficina y he logrado que falle la condenada. Se ve que no fue tan buena idea automatizar mediante un timer dicho evento si no que tendria que haber hecho una funcion de actualizacion similar al metodo Frame de la clase grafica.

Cita de: LucifersAngel en 09 de Febrero de 2009, 02:19:36 PM
Mira agradazeco tu respuesta, ya fue solucionado el problema, y sabes como? es algo raro .. el codigo estaba bien
lo que tuve que hacer es agregar al final del loop un Frame (call n_gfx.Frame) , porque por lo visto sino usamos esta funcion de frame no detecta inmediatamente ni el mouse ni el joystick.
dx_GFX_Class.Frame() no interactua en absoluto con los metodos de las otras clases. Lo que habra provocado la ejecucion de Frame() sera un ligero restraso en la cola de ejecucion y que quizas haya limitado las llamadas al evento del timer.

Bueno, como bien reze en la pagina no voy a sacar nuevas actualizaciones de la libreria, asi que en vez de corregir y modificar la libreria os subo un recurso que complementa a la clase dx_Input reemplazando las funciones *_Hit por unas nuevas y un metodo de actualizacion manual, como el metodo Frame de dx_GFX. De esta forma se consigue una sincronizacion exacta con el bucle del programa y no aleatoria como parece que provoca el timer. La clase esta como adjunto del post que estais leyendo. Aun falta implementar el codigo para evaluar los estados del Joystick, pero como en la oficina no tengo ningun Joystick (y seria un chiste que mi jefe me viera con uno :P) cuando tenga un hueco lo termino en casa.

Darme una alegria, por favor. La clase la he probado y ahora parece funcionar correctamente en las situaciones en las que fallaba la funcion nativa de dx_lib32. Aqui el ejemplo que he usado:
Código (vbnet) [Seleccionar]
' Form1.frm
Option Explicit

Dim GameInput As New dx_Input_Class
Dim HitEvent As New GameInputHitEventClass

Private Sub Form_Load()
    Me.Show
    GameInput.Init Me.hWnd
    HitEvent.Initialize GameInput
   
    Dim i As Long
   
    Do
        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
       
        HitEvent.Update
        DoEvents
    Loop
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set HitEvent = Nothing
    GameInput.Terminate
    End
End Sub

El formulario reacciona cambiando de color cada vez que se pulsa espacio o boton izquierdo del raton. Como veis es lo mismo que usar las funciones nativas pero en vez de llamarlas a dx_lib32 las llamamos a la clase.

Ya me contais (y por dios, que sean buenas noticias  :'()

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

LucifersAngel

La funcion del mouse anda perfectamente, no entendi mucho la verdad, lo del timer es tuyo no? yo no uso ninguno.

Y fijate bien en el codigo , el Snd1 solo lo cargo 1 vez, porque? porque fijate que solo carga esa linea cuando la tecla enter es presionada (una vez) y luego de que es presionada ese bucle no lo lee mas, el juego esta progresando y justamente por lo que decias estoy en la deteccion de botones, estoy haciendo mis clases para que detecte los botones de hasta 4 joysticks.  :o

[EX3]

Cita de: LucifersAngel en 09 de Febrero de 2009, 04:09:58 PM
La funcion del mouse anda perfectamente, no entendi mucho la verdad, lo del timer es tuyo no? yo no uso ninguno.
El timer que digo es un cronometro de Windows, que no un control Timer de Visual Basic, que implementa internamente dx_lib32 para ejecutar automaticamente el codigo de eventos de pulsacion, lo cual parece ser un error en el que no cai en su dia >.<

Cita de: LucifersAngel en 09 de Febrero de 2009, 04:09:58 PM
Y fijate bien en el codigo , el Snd1 solo lo cargo 1 vez, porque? porque fijate que solo carga esa linea cuando la tecla enter es presionada (una vez) y luego de que es presionada ese bucle no lo lee mas
Da igual,  esa carga puntual puede provocar ligeros parones en la ejecucion del juego, o peor aun, que falle la carga y tire al traste el juego en mitad de partida. Como todo en programacion, hay que tener un pequeño orden dentro de lo posible. Si vas a usar un recurso concreto cargalo al principio de un nivel o al principio del programa. Ahi puedes evaluar errores y si hay ligeras pausas te dara igual en tiempo de carga, para algo existen las pantallas de "loading" ;)

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

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

LucifersAngel

Me canse, voy a tomar en cuenta tu consejo  :P

Hechelion

Se agradece ex3, vamos a tener que reemplazar entonces todos los HIT entonces.

[EX3]

#8
Añadido el codigo para los joysticks al recurso anterior. Bajar archivo adjunto ;)

Y aqui el codigo anterior con la llamada a la funcion por si quereis hacer pruebas rapidas:
Código (vbnet) [Seleccionar]
Option Explicit

Dim GameInput As New dx_Input_Class
Dim HitEvent As New GameInputHitEventClass

Private Sub Form_Load()
    Me.Show
    GameInput.Init Me.hWnd
    HitEvent.Initialize GameInput

    Dim i As Long

    Do
        If HitEvent.Key_Hit(Key_Space) Or HitEvent.Mouse_Hit(Left_Button) Or HitEvent.Joystick_Hit(0, Right_Arrow) 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

        HitEvent.Update
        DoEvents
    Loop
End Sub

Private Sub Form_Unload(Cancel As Integer)
    Set HitEvent = Nothing
    GameInput.Terminate
    End
End Sub

Lo he estado probando con los botones y las direcciones y parece que funciona bien.

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.