¿Cómo manejar la entrada del mouse en XNA?

13

Estoy desarrollando un juego de cartas en XNA.

¿Hay algún OnClickevento en XNA para objetos?

Estoy tratando de hacer que las cartas se muevan cuando el jugador hace clic en ellas. En este proyecto, hay una clase de Sprite que roba la carta, pero estoy un poco atascado porque no sé cómo usar OnClickeventos ni nada de eso.

Luis
fuente

Respuestas:

12

Cuando se trabaja con XNA en general, debe pasar de un paradigma de código controlado por evento a un paradigma de código controlado por bucle. Su código de actualización se repite 60 veces / seg. Entonces, cada vez, mire el estado del mouse y si un botón está presionado y el puntero está dentro de su rectificador, bifurque al código que normalmente colocaría en un evento OnClick.

Steve H
fuente
2
Parece que eso puede ser semánticamente correcto, pero también incorrecto en mi opinión. No hay eventos cuando se baja a mirar un hilo y cuál es el estado actual durante cada ciclo. Es por eso que creamos nuestros propios eventos y escribimos sus controladores correspondientes. Debo decir que usar el control de flujo para ramificarse a cada instancia de mouse down se volvería loco en un gran proyecto. En cambio, registre un evento y escriba controladores donde sea necesario. Los eventos fueron pensados ​​en primer lugar por esta razón.
Brandon
55
Brandon: No "usas el control de flujo para ramificarte a cada instancia del mouse". Usted registra el estado actual y anterior del mouse una vez al comienzo de cada cuadro, y luego, en cada lugar que su código responde a un mousedown, presione simplemente hacer if(MouseLeftPress()){ DoSomething(); }, donde MouseLeftPress()hay un método que escribe para comparar los estados actuales y anteriores del mouse izquierdo. Encuentro esto más fácil que implementar eventos la mayor parte del tiempo.
Olhovsky
44
El sondeo simple se vuelve realmente feo más allá de sus controles básicos de arcade. Tengo una clase de administrador de entrada que captura el estado del gamepad como FlagAttributes y le permite asignar delegados a diferentes combinaciones de botones. El siguiente paso es implementar el tiempo. Sin embargo, todo este debate solo refuerza el punto de Steve H, estás dando un sistema de votación y eres libre de construir sobre él para apoyar el paradigma que prefieras.
michael.bartnett
6

XNA solo le brinda lo suficiente para crear sus propias clases de entrada, y debe hacerlo teniendo en cuenta la utilidad que ofrecen.

Recomendaría la clase de entrada del mouse descrita en esta publicación de blog ( código fuente ). Detecta un botón presionado, retenido o liberado, y le permite obtener esa información ya sea a través de encuestas o eventos.

En una nota relacionada, la misma publicación de blog también proporciona clases de dispositivos de entrada de teclado y gamepad.

doppelgreener
fuente
3

El código real para verificar un clic del mouse en XNA es algo así;

    MouseState previousMouseState;
    protected override void Initialize()
    {
        // TODO: Add your initialization logic here
        //store the current state of the mouse
        previousMouseState = Mouse.GetState();
    }


    protected override void Update(GameTime gameTime)
    {
        // .. other update code


        //is there a mouse click?
        //A mouse click occurs if the goes from a released state
        //in the previous frame  to a pressed state 
        //in the current frame
        if (previousMouseState.LeftButton == ButtonState.Released 
            && Mouse.GetState().LeftButton == ButtonState.Pressed)
        {
            //do your mouse click response...

        }

        //save the current mouse state for the next frame
        // the current 
        previousMouseState = Mouse.GetState();

        base.Update(gameTime);
    }
Conocer
fuente
2

Si su juego es 3D, puede implementar la selección, que se describe aquí: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . Básicamente, esto crea un rayo desde la cámara hacia donde hace clic el mouse (con una pequeña matriz que no se proyecta allí), luego verifica si alguno de tus objetos se cruzó con el rayo.

Si su juego es 2D, debería poder traducir las coordenadas de la ventana a las coordenadas del juego con bastante facilidad. Luego verifique si las coordenadas seleccionadas están dentro de los límites de cualquiera de sus objetos.

MichaelHouse
fuente
1

La forma más sencilla de ver si se hace clic con el mouse es esta

//Create this variable
MouseState mouseState;

ahora en el método de actualización agregue esto

mouseState = Mouse.GetState();

if (mouse.RightButton == ButtonState.Pressed)
{
     //Do Stuff
}

espero que esto haya ayudado

Battle_Pasture
fuente