Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





error sincronización input contra draw

Iniciado por Hechelion, 07 de Junio de 2012, 05:59:00 AM

« anterior - próximo »

Hechelion

#15
windows 7 nativo y es el OS que venía con el PC.
Sobre linux, lo tengo con arranque dual en una partición distinta, por lo cual ambos OS son completamente independientes.

Lo que uso como máquina virtual es XP, pero no tiene nada que ver acá, por que el problema se me presenta programando con NET directo en windows 7.

Citar
Esto lo gestiona dx_lib32 interna mediante varias llamadas a la API de Windows para estudiar la base de la ventana y el estilo aplicado por el sistema operativo (tamaños de los bordes, barra de titulo, etc...).

El problema podría estar en este lado entonces, ya que al parecer el problema es que el área activa real es menor que el área activa pedida, o sea, si inicio la librería en 800x600, el área activa en realidad estaría siendo de 780x590 (aprox).


Cita de: avalontm
De casualidad te pasa eso con modo ventana y despues de redimenciona la ventana haciendo que no cuadre la pos del mouse con el dibujo de puntero en Dxlib32?Huh??

por que ami me pasa lo mismo solo haciendo eso
Es exactamente el mismo problema, con la salvedad que no estoy haciendo ningún redimencionado de ventana (ni por código ni de forma manual).

[EX3]

Cita de: Hechelion en 12 de Junio de 2012, 09:59:31 PM
windows 7 nativo y es el OS que venía con el PC.
Sobre linux, lo tengo con arranque dual en una partición distinta, por lo cual ambos OS son completamente independientes.

Lo que uso como máquina virtual es XP, pero no tiene nada que ver acá, por que el problema se me presenta programando con NET directo en windows 7.
Entonces descarto lo de la maquina virtual como causa.

Cita de: Hechelion en 12 de Junio de 2012, 09:59:31 PM
Citar
Esto lo gestiona dx_lib32 interna mediante varias llamadas a la API de Windows para estudiar la base de la ventana y el estilo aplicado por el sistema operativo (tamaños de los bordes, barra de titulo, etc...).

El problema podría estar en este lado entonces, ya que al parecer el problema es que el área activa real es menor que el área activa pedida, o sea, si inicio la librería en 800x600, el área activa en realidad estaría siendo de 780x590 (aprox).
No tiene nada que ver. Si el problema viniera de ahi no habria desincronizacion de coordenadas, simplemente que en vez de un buffer de 800x600 tendrias uno de 780x590. ScreenToClient() deberia funcionar ahi sin problemas y en cualquier situacion ya que internamente se encarga de averiguar las dimensiones del area de cliente de la ventana para realizar la conversion de coordenadas.

Cita de: Hechelion en 12 de Junio de 2012, 09:59:31 PM
Cita de: avalontm
De casualidad te pasa eso con modo ventana y despues de redimenciona la ventana haciendo que no cuadre la pos del mouse con el dibujo de puntero en Dxlib32?Huh??

por que ami me pasa lo mismo solo haciendo eso
Es exactamente el mismo problema, con la salvedad que no estoy haciendo ningún redimencionado de ventana (ni por código ni de forma manual).
Lo de que se en el caso de redimensionar la ventana tiene explicación, ya que al redimensionar la ventana estáis escalando el buffer del render gráfico de DirectX (aunque si al reescalar la ventana modificais también el modo de video esto se soluciona con DEVICE_SetDisplayMode, claro).

La verdad, me sigue resultando raro que te falle ScreenToClient() siendo una función base del sistema operativo, ya que es el único punto que encuentro donde falle la conversión correcta de coordenadas :-/

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

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

Hechelion

#17
Me han surgido un par de dudas.

Si yo inicio la librería en modo ventana en 800x600:
gfx.Init(Me.Handle, 800, 600, , True)

¿De cuanto debería ser el área activa real?


Pregunto, por que la función de ScreenToClient no está haciendo escalado, lo único que hace es modificar el punto de referencia, colocando el punto (0,0) en la parte superior/izquierda del área activa de mi formulario.


Edit:
Lo digo, por yo estoy pidiendo un área de 800x600, y el área activa real que me devuelve la librería en modo ventana es de 780x590 (aprox).

Al posible error que apunto, es que la librería genere un buffer de 800x600, pero que algún motivo está generando la ventana con dimensiones menores a las que realmente deberían ser y por eso la diferencia entre el input y el draw, ya que entiendo que el ScreenToClient no hace escalado.

[EX3]

Cita de: Hechelion en 13 de Junio de 2012, 02:10:33 AM
Si yo inicio la librería en modo ventana en 800x600:
gfx.Init(Me.Handle, 800, 600, , True)

¿De cuanto debería ser el área activa real?
El area de cliente deberia ser 800x600, la ventana luego tendra el tamaño extra segun la configuracion de estilo de ventanas de Windows.

Cita de: Hechelion en 13 de Junio de 2012, 02:10:33 AM
Pregunto, por que la función de ScreenToClient no está haciendo escalado, lo único que hace es modificar el punto de referencia, colocando el punto (0,0) en la parte superior/izquierda del área activa de mi formulario.
Por lo que he visto en tu captura, es como la funcion que tiene que modificar la ventana al tamaño correcto para su area de cliente no tuviera en cuenta tanto el borde derecho como el inferior por que el punto 800, 600 del area cliente coincide con la esquina de la ventana. No entiendo el por que ya el valor de grosor de los bordes es una unica variable del sistema y si la toma en cuenta para un borde lo toma para todos.

Aqui esta el codigo de la libreria que se encarga de modificar la ventana al tamaño correcto segun el modo de video que se aplique. Ahi veras que se obtienen los valores de los elementos base de la ventana para calcular el tamaño correcto:
'Aplica un tamaño a la ventana:
Public Sub Set_SizeWindow(hWnd As Long, Height As Long, Width As Long, Windowed As Boolean)
    'Variables de valores metricos de la ventana:
    Dim BorderX As Long
    Dim BorderY As Long
    Dim EdgeX As Long
    Dim EdgeY As Long
    Dim CaptionY As Long
    Dim MenuY As Long
   
    'Dimensiones del area de la ventana:
    Dim WinRect As RECT
   
    Dim Top As Long
   
    BorderX = GetSystemMetrics(SM_CXBORDER)
    BorderY = GetSystemMetrics(SM_CYBORDER)
    EdgeX = GetSystemMetrics(SM_CXEDGE)
    EdgeY = GetSystemMetrics(SM_CYEDGE)
    CaptionY = GetSystemMetrics(SM_CYCAPTION)
   
    'Obtenemos el nuevo tamaño para la ventana y la centramos en pantalla:
    With WinRect
        .Right = Width + (BorderX * 2) + (EdgeX * 2)
        .bottom = Height + (BorderY * 2) + (EdgeY * 2) + CaptionY + MenuY
        .Left = GetSystemMetrics(SM_CXSCREEN) / 2 - (.Right / 2)
        .Top = GetSystemMetrics(SM_CYSCREEN) / 2 - (.bottom / 2)
       
        If Windowed Then
            Call SetWindowRgn(hWnd, GetWindowRgn(hWnd, 0), False)
            Top = HWND_NOTOPMOST
           
            ' Recuperar barra de tareas:
            '...
       
        Else
            Call SetWindowRgn(hWnd, CreateRectRgn(0, 0, Width, Height), True)
            Top = HWND_TOPMOST
           
            ' Ocultar barra de tareas:
            '...
       
        End If
   
        Call MoveWindow(hWnd, .Left, .Top, .Right, .bottom, True)
        'Call RedrawWindow(hwnd, ByVal 0&, ByVal 0&, RDW_UPDATENOW Or RDW_NOERASE)
       
        Call SetWindowPos(hWnd, Top, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE Or SWP_SHOWWINDOW)
       
    End With

End Sub


Una cosa que me mato en su día es no encontrar una función de la API de Windows para modificar el tamaño de una ventana indicando su area de cliente, solo su tamaño completo. De hecho en .NET los formularios tienen una función para tal fin, SetClientSizeCore().

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

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

Hechelion

No logro encontrarle lógica al error, pero acabo de probar tu última solución junto a la idea de thorrex de redimencionar la ventana luego de inicializar el GFX y funciona de maravilla (Dhu nun lo estoy programando en NET)


        gfx.Init(Me.Handle, 800, 600, , modoVentana)
        If modoVentana Then SetClientSizeCore(800, 600)




[EX3]

Bueno, bien por lo de haber podido solucionar el problema con dicha función, mejor eso que nada :) pero sigo con la mosca en la oreja por el bug en si y que solo te ocurra a ti y encima siendo una sola función la posible culpable :-/

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.