Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Spezielle Mausbewegungen erkennen (https://www.delphipraxis.net/112126-spezielle-mausbewegungen-erkennen.html)

.chicken 15. Apr 2008 14:36


Spezielle Mausbewegungen erkennen
 
Hi, also ich arbeite mich ja im Moment in DirectX ein und möchte damit in naher (oder auch ferner :D) Zukunft ein kleines 2D Spiel programmieren. Soll eine Art Action-Adventure-Rpg werden.

Dabei habe ich überlegt, wie ich das Kampfsystem interessant gestalten kann und bin auf folgende Idee gekommen:
Laufen tut man normal mit der Tastatur. Aktionen macht man, indem man die Maus speziell bewegt.
Wenn zB die linke Maustaste gedrückt ist und man die Maus kreisförmig bewegt wird ein Rundumschlag ausgeführt. Ruckelt man die Maus von links nach rechts, wird eine schnelle Hiebfolge ausgeführt. Versteht ihr was ich meine?

Jetzt brauche ich aber einen Weg, wie ich solche Mausbewegungen erkenne!? Ich bin noch lange nicht soweit, dass ich das Spiel programmiere oder das Feature einbaue, aber ich würd trotzdem schonmal gerne wissen wie man das macht und das in einem kleinen Beispielprogramm nachprogrammieren.

Hat wer Vorschläge oder weiss nach welchen Stichwörtern ich suchen könnte? Habe mir überlegt es einfach mit einem schwarz-weiss-Bild zu vergleichen (weisse Bereiche sind die "gültigen" in denen die Maus sich bewegen soll), aber das würde die Bewegung enorm einschränken (Weite der Bewegung zB). Andere Ideen?

Grüße

TurboMartin 15. Apr 2008 14:52

Re: Spezielle Mausbewegungen erkennen
 
Vielleicht hilft dir dashier. Ist allerdings für .Net.

SirThornberry 15. Apr 2008 15:00

Re: Spezielle Mausbewegungen erkennen
 
ich würde sobald die Maus sich x pixel vom letzten punkt weg bewegt diesen in eine Liste packen wo beispielsweise die letzten 100 Positionen drin stehen. Dann einfach diese Punkte nehmen und auf eine bestimmte größe skalieren so das es später keine rolle spielt ob der user einen großen oder kleinen Kreis "gemalt" hat. Dann dein Muster nehmen welches auf die gleiche Größe skaliert sein sollte und prüfen ob alle punkte des musters auch in den letzten punkten drin sind (natürlich eine gewisse tolleranz lassen.

Letzendlich ist das ganze unabhängig davon ob es mit der Maus gemacht wird oder nicht. Denn die eigentliche Aufgabe ist zu prüfen ob ein Muster in einem anderen enthalten ist.

(Die liste der letzten 100 Punkte (oder wieviele man auch immer maximal zulässt) natürlich leeren beim down der Taste und dann den Vergleich beim Mouseup der Taste starten. Wenn die geforderte Geste übereinstimmen soll und nicht nur enthalten sein soll im "gezeichneten", dann müssen beide "bilder" aufeinander geprüft werden)

.chicken 15. Apr 2008 15:05

Re: Spezielle Mausbewegungen erkennen
 
Die Idee dahinter hat mir schonmal geholfen, und da stand was von neuronalen Netzen also such ich damit mal weiter, danke :)

@ThornBerry: Der Ansatz gefällt mir gut, mal gucken wies mit der Umsetzung aussieht.

Danke

glkgereon 28. Apr 2008 08:55

Re: Spezielle Mausbewegungen erkennen
 
Also das Problem ist die flexibilität...

Wenn du einen "Kreis" forderst, so kriegst du vom User nichtmal ein Ei.

Versuch mal in Paint einen Kreis zu malen. Ich (ok, ich hab vielleicht nicht die grandiose Übung im "Kreise mit der Maus malen", aber es wird Leute geben die es noch schlechter können.) bekomme dann etwas raus, was bestenfalls als gekochtes Ei nach dem 3. Runterfallen zu beschreiben ist.
Ausserdem sind meine "Kreise" nur seltenst geschlossen, in der Regel sogar kaum mehr als Halbkreise.

Insofern kannst du dir meiner Ansicht nach Sachen wie "100 Punkte prüfen" ganz dezent abschminken ;-)

Mein Ansatz wäre folgender:

Du hast am Anfang eine Menge von Punkten.
Dann hast du eine gerasterte Fläche (in der Größenordnung 3x3 bis 5x5 Pixel).
Nach entsprechender skalierung zählst du, wie viele Punkte in jeder Fläche sind.
Nun guckst du für jedes Feld, wie gut die Übereinstimmung ist (Vielleicht |Ist - Soll| / Gesamtanzahl)
Diese Zahlenwerte addierst du nun einfach auf.
Nach kurzer mathematischer Betrachtung merkst du, dass dieser kumulierte Wert maximal 1 und minimal 0 sein kann (Bei genau entgegengesetztem und bei absolut exaktem Muster).
Jetzt sagst du einfach: wenn der Wert unter 0,2 liegt, dann nehme ich mal an, der User wollte das hier machen.
Wie genau diese Übereinstimmung berechnet wird kannst du ja immer noch anpassen, und die Größe des Rasters bliebe auch noch mal zu testen.

SirThornberry 28. Apr 2008 09:13

Re: Spezielle Mausbewegungen erkennen
 
das mit den Punkten funktioniert weil man ja eine tolleranz erlaubt. Das gemalte muss ja nicht deckungsgleich sein sondern nur in einem Bereich des anderen sein.

glkgereon 28. Apr 2008 09:18

Re: Spezielle Mausbewegungen erkennen
 
Zitat:

Zitat von SirThornberry
das mit den Punkten funktioniert weil man ja eine tolleranz erlaubt. Das gemalte muss ja nicht deckungsgleich sein sondern nur in einem Bereich des anderen sein.

Und was machst du denn du nicht 100 punkte hast sondern zB 1000?
Schmeisst du dann jeden zehnten weg?

Was machst du, wenn du keinen Kreis hast, sondern eben nur nen 3/4-Kreis?

Oder, um es kurz zu machen:
Hast du eine Implementation, die eben das kann? Irgendwie glaube ich, dass man die Toleranz so hoch stellen muss, das es auch oft Fehlerkennungen gibt.....
(Ok, nicht das ich eine hätte :lol: )

Ist diese Punkte-Vergleich-Methode nicht eher was für Fotos/Bilderkennung?
Also zB bei Gesichtern, wo man sich ziemlich sicher sein kann, dass das Gesicht zumindest annähernd Oval ist und auch irgendwo zwei Augen zu finden sein werden...

Codewalker 28. Apr 2008 11:01

Re: Spezielle Mausbewegungen erkennen
 
*Kleinen Hinweis in die Diskussion werf*

In der JVCL ist eine Komponente für Mausgesten schon drin. Evtl. kann sich daran orientieren


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz