Come posso identificare i clic del mouse rispetto al mouse in basso nei giochi?


8

Qual è il modo più comune di gestire i clic del mouse nei giochi?

Dato che tutto ciò che hai in modo di rilevare input dal mouse è se un pulsante è su o giù.

Al momento mi baso solo sul fatto che il mouse sia un clic, ma questo semplice approccio mi limita notevolmente in ciò che voglio ottenere. Ad esempio, ho del codice che dovrebbe essere eseguito una sola volta con un clic del mouse, ma l'uso del mouse verso il basso come clic del mouse può far sì che il codice venga eseguito più di una volta a seconda della durata della pressione del pulsante. Quindi devo farlo con un clic!

Ma qual è il modo migliore per gestire un clic? È un clic quando il mouse passa dal mouse verso l'alto o verso il basso o dal basso verso l'alto o è un clic se il pulsante era inattivo per meno di x frame / millisecondi e, in tal caso, viene considerato il mouse in basso e un clic se è in basso per x frame / millisecondi o un clic, quindi il mouse verso il basso?

Vedo che ciascuno degli approcci può avere i loro usi, ma qual è il più comune nei giochi? E forse ti chiederò più specificamente qual è il più comune nei giochi RTS?


1
Sei sulla strada giusta. Aggiungi qualcosa al riguardo: il mouse verso il basso e il mouse verso l'alto devono essere vicini l'uno all'altro (o all'interno dei limiti dell'oggetto su cui si è fatto clic) e il gioco è fatto. Fare clic su un pulsante, quindi trascinarlo, quindi rilasciare il pulsante non è un clic del mouse. Ma fare clic sul pulsante e lasciarsi andare ovunque nel pulsante è un clic del mouse.
Tim Holt,

Risposte:


12

Sei sulla buona strada per capire quando il mouse sta passando da giù a su e scrivere un gestore per questo. Per molti giochi, è abbastanza buono trattare un evento mouseUp come un clic.

A seconda del tuo gioco, probabilmente vorrai gestire entrambi gli eventi - ad esempio, in un RTS, probabilmente vorrai incorporare la selezione con trascinamento e la selezione con un solo clic. La differenza sta nel determinare per quanto tempo il mouse è rimasto nello stato Giù prima di essere rilasciato.

(Sì, hai praticamente risposto alla tua domanda)


2
Come hanno sottolineato altri commentatori, probabilmente vorrai anche verificare che lo stesso target sia stato puntato su mouseDown e mouseUp quando si lavora con singoli clic.
Bill

Non sono così sicuro. Ad esempio, ai pulsanti di Windows non importa dove si trovava il mouse in giù, purché il pulsante riceva l'evento mouse in su. Forse altri sistemi operativi si preoccupano di più.
John McDonald,

@John McD Non è un requisito tecnico tanto quanto un requisito "capire cosa intendeva realmente fare clic l'utente".
Bill,

1
@John McD. non è vero. Premi il pulsante del mouse verso il basso da qualche parte sul desktop, sposta il cursore sul menu Start e rilascia: viene visualizzato il menu Start? Non per me
Kylotan,

@Kylotan, avresti ragione, anche se il "pulsante" del menu Start si comporta in modo diverso rispetto a tutti gli altri pulsanti standard. Sembra che i pulsanti standard di Windows in realtà richiedano sia gli eventi del mouse in giù che quelli del mouse in su, sebbene il mouse possa spostarsi al di fuori dei limiti dei pulsanti tra di loro. Riduci a icona, Ingrandisci e Chiudi tutto funziona in questo modo, così come i normali pulsanti all'interno delle applicazioni. Ma tieni presente che non si verifica alcuna azione (tranne che con il pulsante di avvio) fino a quando non viene rilasciato il pulsante del mouse, le persone come me noteranno. Annyway ... Bill ha ragione, dipende dai requisiti.
John McDonald,

4

Non esiste il "migliore": hai bisogno di tutti loro.

Se sto sparando con una pistola, non voglio aspettare che il mouse venga rilasciato per attivare l'effetto di fuoco dell'arma. E se trascini una casella attorno a un gruppo di unità, avvii l'azione di trascinamento con il mouse verso il basso.

D'altra parte, se sto facendo clic su un elemento della GUI, allora voglio aspettare il clic completo perché è quello a cui sono abituato.

Quindi, dovresti probabilmente implementare il mouse verso il basso, il mouse su, il trascinamento del mouse (il mouse su in un punto significativamente diverso dal mouse verso il basso) e il clic del mouse (mouse su nello stesso posto del mouse verso il basso) e collegarli a parti del gioco come ti sembra giusto.


1

Il modo in cui la maggior parte dei sistemi di finestre lo gestisce, così come i giochi su cui ho lavorato (e ho dovuto implementare parzialmente me stesso) è di avere un po 'su ciascun pulsante che rileva se il mouse è entrato nello stato down del mouse sopra il pulsante dato. Viene impostato solo il frame in cui il mouse si abbassa e viene cancellato solo quando si rilascia il pulsante del mouse. Se e solo se il mouse viene rilasciato sul pulsante e il bit è impostato, quindi attivare l'evento selezionato dal pulsante.

(Probabilmente vuoi anche un flag impostato su true quando il bit è impostato e il mouse passa sopra il tuo pulsante, in modo da poter cambiare il pulsante per usare una trama premuta invece di quella normale.)

Questo è lo schema di base dietro la maggior parte dei pulsanti. Vai avanti e trova una finestra di dialogo. Premi il pulsante Annulla, ma non lasciarlo andare. Il pulsante viene premuto mentre il mouse è sopra di esso e torna alla normalità se il mouse smette di passare sopra di esso, ma tornerà a essere premuto se ci si sposta di nuovo su di esso. Esegue la sua azione solo se lo lasci andare e ci sei sopra. Non utilizzare un conteggio dei millisecondi, principalmente per rilevare doppi clic all'interno della soglia.

(e se vuoi davvero essere fantasioso, organizza eventi che puoi collegare a ciascuna di quelle transizioni. es. MouseOver su invio e su uscita, MouseDown invio / uscita, MouseUp invio / uscita, MouseClicato invio / uscita, ecc. )


1

I pulsanti del mouse e i tasti della tastiera possono avere un numero di eventi diversi, ciò che è disponibile dipende dalla lingua / libreria scelta, più comune:

Tasto giù, si attiva quando si preme un pulsante.
Key up, si attiva quando viene rilasciato un pulsante.
Tasto ritardato verso il basso, si attiva quando viene premuto un pulsante, quindi si attiva ripetutamente a un intervallo dipendente dal sistema fino a quando il tasto non viene rilasciato.

Inoltre, potrebbe esserci anche una chiamata per dire se un tasto è attualmente premuto.

È importante che tu sappia esattamente quale strumento stai usando, più comunemente avrai bisogno prima dei due, se non sono disponibili, costruiscili da qualsiasi cosa sia disponibile.

Il metodo standard per la registrazione della pressione di un pulsante sullo schermo mediante il mouse consiste nell'asserire che lo stesso pulsante è stato puntato sia verso il basso che verso l'alto. Per molti elementi di gioco questo può essere troppo lento, quindi per molte azioni può essere prudente farli accadere in caso di down.


0

X Oppure puoi essere tuo amico in questa situazione.

bool oldIsButtonUp = true;

void pollMouse(bool isButtonUp) {
    if ((oldIsButtonUp ^ isButtonUp) && isButtonUp) {
        sendMouseClickEvent();
    }
    oldIsButtonUp = isButtonUp;
}

Questo chiamerà sendMouseClickEvent () ogni volta che lo stato del pulsante del mouse cambia da falso a vero.


4
O, in modo da non fare un programmatore di creare un truthtable nella sua (sua?) Testa: if (!oldIsButtonUp && isButtonUp) {.
Deceleratedcaviar

-1

Una versione XNA di questo codice sarebbe simile (semplificata solo per rilevare l'evento del mouse verso il basso, per rilevare i doppi clic avrai bisogno di qualcosa di più sofisticato);

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 begins if the button 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); 
} 

Oltre a questo c'è un codice per MouseUp, non per MouseClick - Con quale frequenza viene eseguito l'aggiornamento? Cosa accadrebbe se un clic fosse più breve del tempo di gioco che ticchetta?
Kromster,

dipende dal gioco ma in XNA l'aggiornamento avviene per impostazione predefinita circa 60 fps. Sarebbe molto difficile premere E rilasciare un pulsante del mouse in questo intervallo di tempo.
Ken,

In realtà, è il codice per rilevare un evento down del mouse.
Ken,

Non riesco a vedere una risposta effettiva alla domanda reale in questo esempio di codice XNA astratto
Kromster,

Grazie per le correzioni, ho fatto un piccolo test e Click sembra richiedere 16-100ms, che è leggermente più lungo della lunghezza dell'aggiornamento. Tuttavia non incoraggerei l'elaborazione dell'input in un ciclo di aggiornamento per timestep potrebbe essere inferiore a 60 fps, specialmente senza input di accodamento.
Kromster,
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.