Wie identifiziere ich Mausklicks im Vergleich zu Mausklicks in Spielen?

8

Was ist die häufigste Art, mit Mausklicks in Spielen umzugehen?

Vorausgesetzt, Sie haben nur die Möglichkeit, Eingaben über die Maus zu erkennen, ob eine Taste nach oben oder unten gedrückt ist.

Ich verlasse mich derzeit nur darauf, dass die Maustaste ein Klick ist, aber dieser einfache Ansatz schränkt mich in dem, was ich erreichen möchte, stark ein. Zum Beispiel habe ich Code, der nur einmal mit einem Mausklick ausgeführt werden sollte. Wenn Sie jedoch die Maustaste als Mausklick verwenden, kann der Code mehr als einmal ausgeführt werden, je nachdem, wie lange die Schaltfläche gedrückt gehalten wird. Also muss ich es mit einem Klick machen!

Aber wie geht man am besten mit einem Klick um? Ist ein Klick, wenn die Maus von Maus nach oben oder von unten nach oben bewegt wird, oder ist es ein Klick, wenn die Schaltfläche weniger als x Frames / Millisekunden gedrückt war, und wenn ja, wird dies als Maus nach unten und ein Klick, wenn sie nach unten ist, betrachtet für x Frames / Millisekunden oder einen Klick dann mit der Maus nach unten?

Ich kann sehen, dass jeder der Ansätze seine Verwendung haben kann, aber welcher ist der häufigste in Spielen? Und vielleicht frage ich genauer, welches in RTS-Spielen am häufigsten vorkommt?

Tristan
quelle
1
Du bist auf dem richtigen Weg. Fügen Sie etwas hinzu, dass die Maus nach unten und die Maus nach oben nahe beieinander liegen müssen (oder innerhalb der Grenzen des angeklickten Objekts), und Sie haben es. Das Klicken auf eine Schaltfläche, das Herausziehen und das Loslassen der Schaltfläche ist kein Mausklick. Ein Klick auf die Schaltfläche und das Loslassen einer beliebigen Stelle auf der Schaltfläche ist jedoch ein Mausklick.
Tim Holt

Antworten:

12

Sie sind auf dem richtigen Weg, um herauszufinden, wann die Maus von unten nach oben wechselt, und einen Handler dafür zu schreiben. Für viele Spiele ist es gut genug, ein mouseUp-Ereignis als Klick zu behandeln.

Abhängig von Ihrem Spiel möchten Sie wahrscheinlich beide Ereignisse behandeln. In einem RTS möchten Sie beispielsweise die Drag-Box-Auswahl sowie die Einzelklick-Auswahl einbeziehen. Der Unterschied besteht darin, zu bestimmen, wie lange sich die Maus im Down-Zustand befand, bevor sie freigegeben wurde.

(Ja, Sie haben im Grunde Ihre eigene Frage beantwortet)

Rechnung
quelle
2
Wie andere Kommentatoren betonten, möchten Sie wahrscheinlich auch überprüfen, ob auf dasselbe Ziel bei mouseDown und mouseUp verwiesen wurde, wenn Sie mit einzelnen Klicks arbeiten.
Bill
Ich bin mir nicht sicher. Beispielsweise ist es Windows-Schaltflächen egal, wo sich die Maus bei gedrückter Maus befand, solange die Schaltfläche das Ereignis "Maus hoch" empfängt. Vielleicht interessieren sich andere Betriebssysteme mehr.
John McDonald
@ John McD Es ist weniger eine technische Anforderung als vielmehr eine Anforderung, herauszufinden, worauf Ihr Benutzer eigentlich klicken wollte.
Bill
1
@ John McD. das ist nicht wahr. Drücken Sie die Maustaste irgendwo auf Ihrem Desktop, bewegen Sie den Cursor auf das Startmenü und lassen Sie los - wird das Startmenü angezeigt? Es ist nicht für mich.
Kylotan
@Kylotan, Sie wären richtig, obwohl sich das Startmenü "button" anders verhält als alle anderen Standardtasten. Es sieht so aus, als ob Standardschaltflächen in Fenstern sowohl die Maus-Abwärts- als auch die Maus-Aufwärts-Ereignisse erfordern, obwohl sich Ihre Maus außerhalb der dazwischen liegenden Schaltflächengrenzen bewegen kann. Minimieren, maximieren und schließen Sie alle Arbeiten wie diese sowie normale Schaltflächen in Anwendungen. Bitte beachten Sie jedoch, dass keine Aktion ausgeführt wird (außer mit der Starttaste), bis die Maustaste losgelassen wird. Leute wie ich werden es bemerken. Annyway ... Bill hat recht, es kommt auf die Anforderungen an.
John McDonald
4

Es gibt kein "Bestes" - Sie brauchen alle.

Wenn ich eine Waffe abfeuere, möchte ich nicht warten, bis die Maus losgelassen wird, um den Waffenabfeuereffekt auszulösen. Wenn Sie eine Box um mehrere Einheiten ziehen, starten Sie die Ziehaktion mit der Maus nach unten.

Wenn ich dagegen auf ein GUI-Element klicke, möchte ich auf den vollständigen Klick warten, da ich das gewohnt bin.

Sie sollten also wahrscheinlich Maus runter, Maus rauf, Maus ziehen (Maus rauf an einer deutlich anderen Stelle als Maus runter) und Mausklick (Maus rauf an derselben Stelle wie Maus runter) implementieren und sie an Teile Ihres Spiels anschließen Sie sehen es für richtig.

Kylotan
quelle
1

Die Art und Weise, wie die meisten Fenstersysteme damit umgehen, sowie die Spiele, an denen ich gearbeitet habe (und die ich teilweise selbst implementieren musste), bestehen darin, auf jeder Schaltfläche ein Bit zu haben, das erkennt, ob die Maus über die angegebene Schaltfläche in den Maus-Ab-Zustand übergegangen ist. Es wird nur der Rahmen festgelegt, in dem die Maus nach unten geht und erst gelöscht wird, wenn die Maustaste losgelassen wird. Wenn und nur wenn die Maus über die Schaltfläche losgelassen und das Bit gesetzt ist, wird das Ereignis ausgelöst, auf das die Schaltfläche geklickt hat.

(Sie möchten wahrscheinlich auch ein Flag, das auf true gesetzt ist, wenn das Bit gesetzt ist und die Maus über Ihrer Schaltfläche schwebt, sodass Sie die Schaltfläche so ändern können, dass anstelle der normalen Textur eine gedrückte Textur verwendet wird.)

Dies ist das Grundschema hinter den meisten Schaltflächen. Fahren Sie fort und suchen Sie eine Dialogaufforderung. Drücken Sie die Abbrechen-Taste, aber lassen Sie sie nicht los. Die Taste wird gedrückt, während sich die Maus darüber befindet, und wird wieder normal, wenn die Maus nicht mehr darüber schwebt. Wenn Sie sich jedoch wieder darüber bewegen, wird sie wieder gedrückt. Es führt seine Aktion nur aus, wenn Sie loslassen und darüber hinweg sind. Verwenden Sie keine Millisekundenzahl, dies dient hauptsächlich dazu, Doppelklicks innerhalb Ihres Schwellenwerts zu erkennen.

(und wenn Sie wirklich Lust haben möchten, haben Sie Ereignisse, die Sie mit jedem dieser Übergänge verbinden können. z. B. MouseOver beim Ein- und Aussteigen, MouseDown-Ein- / Ausstieg, MouseUp-Ein- / Ausstieg, MouseClicked-Ein- / Ausstieg usw. )

Alex Ames
quelle
1

Maustasten und Tastaturtasten können eine Reihe verschiedener Ereignisse haben. Was verfügbar ist, hängt von Ihrer Wahl der Sprache / Bibliothek ab. Am häufigsten:

Tastendruck, wird ausgelöst, wenn eine Taste gedrückt wird.
Key up, wird ausgelöst, wenn eine Taste losgelassen wird.
Die verzögerte Taste ist gedrückt, wird ausgelöst, wenn eine Taste gedrückt wird, und wird dann in einem systemabhängigen Intervall wiederholt ausgelöst, bis die Taste losgelassen wird.

Darüber hinaus kann ein Anruf erfolgen, um festzustellen, ob gerade eine Taste gedrückt gehalten wird oder nicht.

Es ist wichtig, dass Sie genau wissen, welches Tool Sie verwenden. In den meisten Fällen benötigen Sie die beiden zuerst. Wenn sie nicht verfügbar sind, erstellen Sie sie aus den verfügbaren Tools.

Die Standardmethode zum Registrieren, dass eine Bildschirmtaste mit der Maus gedrückt wird, besteht darin, zu bestätigen, dass dieselbe Taste sowohl auf das Abwärts- als auch auf das Aufwärtsereignis gerichtet war. Für viele Spielelemente kann dies jedoch zu langsam sein, so dass es für viele Aktionen ratsam sein kann, sie beim Down-Event auszuführen.

aaaaaaaaaaaa
quelle
0

XOr kann in dieser Situation dein Freund sein.

bool oldIsButtonUp = true;

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

Dies ruft sendMouseClickEvent () auf, wenn sich der Status der Maustaste von false in true ändert.

Asgeir
quelle
4
Oder um einen Programmierer nicht dazu zu bringen, eine Wahrheitstabelle in seinem (ihrem?) Kopf zu erstellen : if (!oldIsButtonUp && isButtonUp) {.
verzögert
-1

Eine XNA-Version dieses Codes wäre ungefähr so ​​(vereinfacht, nur um das Maus-Down-Ereignis zu erkennen, um Doppelklicks zu erkennen, benötigen Sie etwas Anspruchsvolleres);

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); 
} 
Ken
quelle
Abgesehen davon gibt es einen Code für MouseUp, nicht für MouseClick - Wie oft wird Update ausgeführt? Was würde passieren, wenn ein Klick kürzer ist als Ihre Spielzeit?
Kromster
hängt vom Spiel ab, aber in XNA erfolgt die Aktualisierung standardmäßig mit etwa 60 fps. In diesem Zeitraum wäre es sehr schwierig, eine Maustaste zu drücken UND loszulassen.
Ken
Tatsächlich ist es Code, um ein Maus-Down-Ereignis zu erkennen.
Ken
Ich sehe keine tatsächliche Antwort auf die eigentliche Frage in diesem abstrakten XNA-Codebeispiel
Kromster
Vielen Dank für die Korrekturen. Ich habe einen kleinen Test durchgeführt und Click benötigt tatsächlich 16-100 ms, was etwas mehr als die Update-Länge ist. Trotzdem würde ich nicht empfehlen, Eingaben in einer Aktualisierungsschleife zu verarbeiten, da der Zeitschritt weniger als 60 fps betragen könnte, insbesondere ohne Eingaben in die Warteschlange zu stellen.
Kromster