Hola , estoy haciendo una aplicación directx , pero tengo un problemilla. Capturo el raton con directinput pero cuando quiero saber si se ha pulsado un botón del ratón, a veces el resultado es como si se hubiera hecho doble click.
Me explico , tengo una clase boton en la cual al captar del raton un click encima del objeto este cambia de color , pero a veces va tan "sensible" que hago un click pero me lo coge como dos clicks seguidos.¿ Hay algun modo de ajustar la sensibilidad?
Gracias a quien pueda responder a este pobre trekkie.
Si no recuerdo mal, DirectInput no te informa de si se ha hecho click o no. Solo te informa sobre si un boton del ratón ha sido pulsado o ha sido soltado. Por lo que es posible que tu problema sea que pillas los dos eventos (pulsar y soltar) como si fueran dos clics.
en realidad creo que solo capturo el evento de pulsar , lo hago así:
left = mousestate.rgbButtons[0] & 0x80;
pero ya te digo , a veces me devuelve dos pulsaciones , es como si fuera que lo hace demasiado rápido. nose , alguien más tiene ideas?
Quizás el problema esté en tu ratón o en el driver de DirectInput
Hola kirk,
Lo que puedes hacer es actualizar el contenido de mousestate cada cierto tiempo en vez de cada frame (1/10 sec podría estar bien, aunque eso te limita también la obtención de datos de los ejes).
Me inclino a pensar en que puede ser un problema del físico del ratón, que tenga algún botón medio changao o el cable pelao.
de donde sacas mousestate ? que tipo de variable es ?
las variables que uso son:
LPDIRECTINPUT8 mouse;
LPDIRECTINPUTDEVICE8 m_device;
DIMOUSESTATE mousestate;
y el codigo para capturar los clicks y la posicion del ratón es el siguiente:
m_device->GetDeviceState(sizeof(DIMOUSESTATE),&mousestate);
x = x + mousestate.lX;
y = y + mousestate.lY;
left = mousestate.rgbButtons[0] & 0x80;
right = mousestate.rgbButtons[1] & 0x80;
he probado en distintos ordenadores y siempre pasa igual , o me detecta como dos clicks o a veces ninguno o a veces uno.
si alguien tiene una función de captura del ratón más aceptable que esta pues nada , se lo agradeceré enormemente.
Prueba a usar el metodo GetDeviceData. (El ejemplo sobre el mouse de DirectInput creo que lo usa, asi que puedes probar ese ejemplo).
Sino recuerdo mal con este metodo lo que obtienes es si el boton esta pulsado, no si has echo click, o no.
El problema varia segun como funcione el driver, o sea, si pulsas el raton, durante bastante tiempo, veras que durante n game-loops esta pulsado el boton, por lo cual dependiendo de si un click tarda mas o menos, o como el driver lo envia, te podria suponer varios clicks, en tu sistema.
Para hacerlo mejor deberias usar switch para indicar si el boton estaba pulsado anteriormente o si esta soltado, y solo registrar un nuevo click cuando se pulsa.
mas o menos
bool estadoEstabaPulsado = false;
...
...
bool bEstaPulsado = stado&0x80;
bool click = false;
if (bEstaPulsado){
if (!estadoEstabaPulsado) click = true;
estadoEstabaPulsado = true;
}else{
estadoEstabaPulsado = false;
}
if (click){
x++;
y++;
}
Mas o menos algo por el estilo
mICrO
Citar
El 2002-05-24 10:29, capitan_kirk escribió:
Hola , estoy haciendo una aplicación directx , pero tengo un problemilla. Capturo el raton con directinput pero cuando quiero saber si se ha pulsado un botón del ratón, a veces el resultado es como si se hubiera hecho doble click.
Me explico , tengo una clase boton en la cual al captar del raton un click encima del objeto este cambia de color , pero a veces va tan "sensible" que hago un click pero me lo coge como dos clicks seguidos.¿ Hay algun modo de ajustar la sensibilidad?
Gracias a quien pueda responder a este pobre trekkie.