Ich mache eine GUI-API für Spiele und eine angeforderte Funktion war ein Shake-Event. Im Wesentlichen ein Ereignis, das dem Aero Shake von Windows 7 sehr ähnlich ist. Wenn die Maus nicht bewegt wird, wird das Ereignis ausgelöst, wenn es schnell und unidirektional vor- und zurückbewegt wird. Ich bin mir nur nicht sicher, welche Art von Psedocode würde in diese gehen?Ein Shake-Event implementieren?
Antwort
ich könnte wie folgt betrachten:
- immer einen Vektor für die Richtung schaffen die Maus auf den letzten Zug reiste
- halten immer eine Aufzeichnung des unmittelbar vorigen Vektor, wie Sie den nächsten Vektor sammeln (was bedeutet, dass Sie immer zwei Vektoren zum Auswerten haben).
- machen Sie ein Skalarprodukt der zwei Vektoren, wenn jede Mauseingabe ankommt. Wenn das Skalarprodukt positiv ist, dann ignoriere es. Wenn es negativ ist, dann setze einen Zeitwert damit und speichere in einem Array, das vielleicht bis zu fünf dieser Zeitstempel speichert.
- Wiederholen Sie die obige Sequenz. Wenn das Timestamp-Array einen aufeinander folgenden Satz von Zeitstempeln hat, die sich jeweils um einige Epsilon unterscheiden, dann kann man annehmen, dass jemand etwas schüttelt. :)
Ich könnte falsch liegen, aber in (4) meinst du nicht delta, anstatt epsilon? – ocodo
@slomojo: von 'epsilon' Ich meinte nur ein sehr kleines Delta. Angesichts seiner Verwendung im Kalkül ist Epsilon vielleicht eine Über-Aussage. :) –
Sie müssen die Änderungen in der Mausbewegung zählen. Wenn die Maus die Richtung mehr als dreimal in weniger als beispielsweise 0,7 Sekunden ändert, ist es ein Shake. Um die Richtungsänderung für immer zu verfolgen, zuletzt 5 Mauskoordinaten. Wenn der Punkt P0 der letzte und P5 der fünfte ist, dann berechnen Sie einen Winkel zwischen P0-P3 und P3-P5. Wenn der Winkel 5 Grad beträgt, änderte die Maus die Richtung.
so etwas wird wahrscheinlich die beste Lösung sein. Dies ist keine exakte Wissenschaft. – rtpg
Hängt von der Stichprobengröße und Häufigkeit ab. Jede Bewegung der Maus kann möglicherweise Ereignisse generieren. Wenn die Samples zu nah beieinander liegen, ergibt sich eher eine Kurve als ein steiler Winkel. Zumal wenige Personen den Cursor genau in die entgegengesetzte Richtung bewegen können - die Bewegung wird oft etwas abgerundet. – cHao
Die allgemeine Idee etwas so sein würde:
Auf die Maus nach unten:
- Speichern Sie die aktuelle Position als
(x0, y0)
. - Set
slope = 0
. - Set
start time = current time
.
Auf Maus bewegen:
- Speichern Sie die aktuelle Position als
(x, y)
. - Set
newSlope = abs((y - y0)/(x - x0))
. (dies zeigt die Richtung der Mausbewegung in Bezug auf die Startposition an) - Wenn
abs(newSlope - slope) < some threshold
dann bewegt sich der Benutzer noch in die gleiche Richtung: dann überprüfen Sie, obcurrent time - start time > shake time
, wenn ja, das Shake-Ereignis auslösen undstart time
zurücksetzen. - Andernfalls hat der Benutzer die Richtung geändert. Stellen Sie
slope = newSlope
ein und setzen Siestart time = current time
zurück.
Seien Sie vorsichtig mit der Chance, dass jemand die Maus genau vertikal bewegt - scheint mir jedoch, dass es leicht zu einer "Division durch Null" Ausnahme/Fehler kommen könnte. – cHao
Ich fand eleganter und mehr auf den Punkt Antwort. Verfolgen Sie die letzten N (sagen wir 20) Mauspositionen. Diese Positionen sind durch ein Rechteck begrenzt, dessen Oberkante ein Minimum (P (N) .top), Unten = Maximum (P (N) .unten) usw. ist. Berechnen Sie die Gesamtdistanz der Maus während dieser letzten N Male. Wenn die gesamte zurückgelegte Strecke mehr als K-mal größer ist als der Umfang dieses Rechtecks, ist es ein Shake.
Auf welche Betriebssysteme zielen Sie? Welchen Spielrahmen verwendest du, wenn überhaupt? –
Es sollte nicht plattformspezifisch sein, ich kann zeitgesteuerte Ereignisse erstellen, Mausposition usw. bekommen, – jmasterx