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?


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)


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.


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. )


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.


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.


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.