Estou usando C # e tentando obter a posição do mouse de hardware. A primeira coisa que tentei foi a simples funcionalidade XNA, simples de usar
Vector2 position = new Vector2(Mouse.GetState().X, Mouse.GetState().Y);
Depois disso, eu também faço o desenho do mouse e, comparando com o mouse de hardware do Windows, esse novo mouse com coordenadas fornecidas pelo xna está "relaxando". Com isso, quero dizer, que está atrasado em alguns quadros. Por exemplo, se o jogo estiver rodando a 600 fps, a maldição será responsiva, mas a 60 fps o atraso do mouse do software não será mais aceitável. Por isso, tentei usar o que eu pensava ser um mouse de hardware,
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool GetCursorPos(out POINT lpPoint);
mas o resultado foi exatamente o mesmo. Também tentei obter o cursor de formulário do Windows, e esse também era um beco sem saída, mas com o mesmo atraso. Brincando com a funcionalidade xna:
GraphicsDeviceManager.SynchronizeWithVerticalRetrace = true/false
Game.IsFixedTimeStep = true/fale
alterou o tempo de atraso por razões um tanto óbvias, mas a linha inferior é que, independentemente disso, ainda estava atrás do mouse padrão do Windows. Eu já vi em alguns jogos, eles fornecem opção para mouse acelerado por hardware, e em outros (acho) já é por padrão. Alguém pode dar alguma pista sobre como conseguir isso.
Mouse.GetState()
não está quebrado e desde que as IsFixedTimeStep == true
pessoas não consigam ver atraso, a menos que comparadas diretamente com o mouse visível do Windows. No entanto, definir IsFixedTimeStep como false na taxa de quadros inferior torna-se visível para todos. Sobre a entrada direta, considerei uma possibilidade (último recurso).
Mouse.GetState()
está quebrado. Você tem certeza de que está posicionando o mouse no mesmo quadro que o desenha? Lembre-se também de que o cursor do Windows tem a aceleração / desaceleração ativada, para que ele se sinta mais responsivo. Se você quiser se aproximar do hardware, pressione DirectInput, que fornecerá deltas de movimento em vez de posições absolutas do mouse. Mas acredito queMouse.GetState()
ainda é a maneira correta de fazer isso no XNA.