Come gestire l'input del mouse in XNA?


13

Sto sviluppando un gioco di carte in XNA.

Esiste un OnClickevento in XNA per gli oggetti?

Sto cercando di far muovere le carte quando il giocatore fa clic su di esse. In questo progetto, c'è una classe Sprite che pesca la carta, ma sono un po 'bloccato perché non so usare OnClickeventi o cose del genere.

Risposte:


12

Quando si lavora con XNA in generale, è necessario passare da un paradigma di codice guidato da eventi a un paradigma di codice guidato da loop. Il tuo codice di aggiornamento scorre 60 volte / sec. Quindi ogni volta, guarda lo stato del mouse e se un pulsante è in basso e il puntatore si trova all'interno del tuo rettangolo, quindi passa al codice che normalmente inseriresti in un evento OnClick.


2
Sembra che potrebbe essere semanticamente corretto, ma anche sbagliato secondo me. Non ci sono eventi quando si inizia a guardare un thread e quale sia lo stato corrente durante ciascun loop. Questo è il motivo per cui creiamo i nostri eventi e scriviamo i gestori corrispondenti. Direi che usare il controllo di flusso per diramare ogni istanza del mouse verso il basso diventerebbe pazzo in un grande progetto. Invece, registra un evento e scrivi i gestori dove necessario. Gli eventi sono stati pensati in primo luogo per questo motivo.
brandon,

5
Brandon: Non "usi il controllo di flusso per diramare verso ogni istanza del mouse". Registri lo stato corrente e precedente del mouse una volta all'inizio di ogni fotogramma, quindi in ogni punto in cui il codice risponde a una pressione del mouse if(MouseLeftPress()){ DoSomething(); }, fai semplicemente , dove MouseLeftPress()è un metodo che scrivi per confrontare gli stati del mouse sinistro e attuale. Lo trovo più facile che implementare eventi il ​​più delle volte.
Olhovsky

4
Il polling semplice diventa davvero brutto al di là dei controlli arcade di base. Ho una classe di input manager che cattura lo stato del gamepad come FlagAttributes e ti permette di mappare i delegati a diverse combinazioni di pulsanti. Il prossimo passo è implementare il tempismo. Tutto questo dibattito non fa che rafforzare il punto di Steve H, stai dando un sistema di votazione e sei libero di costruirlo su di esso per supportare qualunque paradigma tu preferisca.
michael.bartnett,


6

XNA ti dà solo quanto basta per costruire le tue classi di input - e dovresti farlo considerando l'utilità che offrono.

Consiglierei la classe di input del mouse descritta in questo post del blog ( codice sorgente ). Rileva un pulsante premuto, trattenuto o rilasciato e consente di ottenere tali informazioni tramite polling o eventi.

In una nota correlata, lo stesso post sul blog fornisce anche classi di dispositivi di input per tastiera e gamepad.


3

Il codice effettivo per controllare un clic del mouse in XNA è qualcosa del genere;

    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);
    }

2

Se il tuo gioco è 3D puoi implementare il picking, che è descritto qui: http://create.msdn.com/en-US/education/catalog/sample/picking_triangle . Fondamentalmente questo crea un raggio dalla telecamera al punto in cui il mouse fa clic (con una piccola matrice non sporgente lì dentro), quindi controlli per vedere se qualcuno dei tuoi oggetti è stato intersecato dal raggio.

Se il tuo gioco è in 2D, dovresti essere in grado di tradurre le coordinate della finestra in coordinate del gioco abbastanza facilmente. Quindi controlla se le coordinate selezionate sono entro i limiti di uno qualsiasi dei tuoi oggetti.


1

Il modo più semplice per vedere se si fa clic con il mouse è questo

//Create this variable
MouseState mouseState;

ora nel metodo di aggiornamento aggiungi questo

mouseState = Mouse.GetState();

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

spero che questo abbia aiutato

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.