Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Porque este code no anda?

Iniciado por El'The, 29 de Marzo de 2010, 06:41:37 AM

« anterior - próximo »

El'The

Que tal?

Bueno pues sigo con mi duda, pero no veo el tema viejo, así que abro uno nuevo (Creo que, al momento de bloquear el mismo, lo eliminé xDD)

Tengo una imagen llamada Tux en el mismo directorio que la Aplicación y el siguiente code:

Código (VB) [Seleccionar]

Private Dx As New dx_GFX_Class
Private Din As New dx_Input_Class
Private Sys As New dx_System_Class
Private Imagen As Long
Private Render As Boolean
Private mdx As Long
Private mdy As Long
Private A As GFX_Rect

Private Sub Form_Load()
    Dim A As GFX_Rect
    Set Dx = New dx_GFX_Class
    Set Din = New dx_Input_Class
    Set Sys = New dx_System_Class
    Render = Dx.Init(Me.hWnd, 640, 400, 32, True)
    Imagen = Dx.MAP_Load(App.Path & "\tux.png", 0)
    Din.Init Me.hWnd
    mdx = 200
    mdy = 80
    A.X = 270
    A.Y = 100
    A.Width = 110
    A.Height = 200
   
   
    Do While Render
           
        Dx.DRAW_Map Imagen, mdx, mdy, 0, 0, 0
        Call Dx.DRAW_Box(270, 100, 380, 300, 0, -1)
        Dx.Frame
   
    Loop
   
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Sys.MATH_PointInRect(CLng(X), CLng(Y), A) = True Then
    MsgBox "Ok"
    End
    End If
End Sub


Pero el mismo no logra su cometido, que viene siendo en lanzar un mensaje y salir cuando el ratón entre en el área que demarco

Espero respuestas

Salu2!

t-spy

Hace mucho que no trabajo con VB, pero así de primeras veo que estás definiendo A dos veces: una como global y otra como local, así que al asignar valores solo inicializas la variable local y dejas sin inicializar la global, que es la que se usa en el mousemove.

Hechelion

#2
tienes 2 errores, el primero es que tal como te dijo t-spy tienes dos variables A,, como no especificas cual llenas, el sistema por defecto trabaja sobre la local y no sobre la global, con consiguiente la variable A que usas para comparar siempre vale 0.

Segundo, como lo indicas, asumo que estás usando Twip en vez de pixel, así que MouseMove te va a devolver la posición del mouse en twip mientras que A está en pixel, te recomendaría usar la clase input de la misma librería.

Tercero, la verdad no sé si será necesario (Ex3 tendría que aclararlo), pero en todos los ejemplos siempre se descargan los recursos cargados y se destruye la instancia a la librería.

[EX3]

Cita de: Hechelion en 29 de Marzo de 2010, 08:54:01 AM
Tercero, la verdad no sé si será necesario (Ex3 tendría que aclararlo), pero en todos los ejemplos siempre se descargan los recursos cargados y se destruye la instancia a la librería.
Internamente, todas las clases de dx_lib32 al destruir su instancia destruyen sus respectivas instancias de DirectX, por ejemplo, dx_GFX_Class al destruir su instancia con una asignacion a Nothing destruira su instancia a Direct3D8 y por ende todos los recursos que DirectX tenga asociados a el. En la practica, lo recomendable es descargar cada recurso manualmente y al final llamar al metodo de terminacion de la clase, metodo Terminate() (que hubiera tenido que definir en su dia como un autentico destructor de la clase, osea, un metodo Class_Terminate() que se ejecutase al asignar Nothing a la instancia, pero entonces era joven e ingenuo y no tenia los conocimientos jeje :P). De esta forma te aseguras que descargas correctamente los recursos asociados a la libreria ya que dichos metodos estan preparados para esa tarea.

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

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

El'The

Gracias a todos... Sin embargo, sigo sin poder resolver el problema xD

Salu2!

Hechelion

Acá te dejo tu mismo código pero corregido

Código (vb) [Seleccionar]

Private Dx As New dx_GFX_Class
Private Din As New dx_Input_Class
Private Sys As New dx_System_Class
Private Imagen As Long
Private Render As Boolean
Private mdx As Long
Private mdy As Long
Private A As GFX_Rect

Private Sub Form_Load()
    Set Dx = New dx_GFX_Class
    Set Din = New dx_Input_Class
    Set Sys = New dx_System_Class
    Render = Dx.Init(Me.hWnd, 640, 400, 32, True)
    Imagen = Dx.MAP_Load(App.Path & "\tux.png", 0)
    Din.Init Me.hWnd
    mdx = 200
    mdy = 80
    A.X = 270
    A.Y = 100
    A.Width = 110
    A.Height = 200
   
   
    Do While Render
           
        Dx.DRAW_Map Imagen, mdx, mdy, 0, 0, 0
        Call Dx.DRAW_Box(270, 100, 380, 300, 0, -1)
        Dx.Frame
   
    Loop
   
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Sys.MATH_PointInRect(CLng(X), CLng(Y), A) = True Then
    MsgBox "Ok"
    End
    End If
End Sub


Lo otro, en las propieades del Form, hay una propiedade que dice Scale algo, esa la tienes que cambiar de Twip a Pixel, pero mejor aprende a usar la clase input de la libreria.

Saludos.

[EX3]

#6
Cita de: Checmated en 30 de Marzo de 2010, 06:17:39 AM
Gracias a todos... Sin embargo, sigo sin poder resolver el problema xD
Checmated, por que no haces lo que te dijo Hechelion de usar la clase dx_Input para la lectura del raton?
Cita de: Hechelion en 29 de Marzo de 2010, 08:54:01 AMSegundo, como lo indicas, asumo que estás usando Twip en vez de pixel, así que MouseMove te va a devolver la posición del mouse en twip mientras que A está en pixel, te recomendaría usar la clase input de la misma librería.
Cambiar esto:
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Sys.MATH_PointInRect(CLng(X), CLng(Y), A) = True Then
        MsgBox "Ok"
        End
    End If
End Sub

Por esto otro dentro del bucle principal que tienes en el Form_Load (preferiblemente antes de las llamadas graficas):
If Sys.MATH_PointInRect(Din.Mouse.X, Din.Mouse.Y, A) = True Then
    MsgBox "Ok"
    End
End If

Se supone que el formulario solo ha de usarse como lienzo, no necesitas de mas eventos que el Load y el Unload para gestionar lo minimo. El resto lo puedes programar con la libreria, no necesitas practicamente de ninguna de las funciones o eventos de Visual Basic para estos menesteres, es uno de los objetivos de la libreria.

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

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

El'The

Ahhhhh! Vale, vale... Ya entiendo, ya entiendo

Muchas gracias ^^






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.