WinAPI, DI, RI?
-
Hallo!
Wenn man Tastatur und Mausdaten haben möchte, reicht da nicht die WinAPI? Warum verwendet man DirectInput? Oder RawInput?
MfG
-
Geschwindigkeit.
Auf normalem WinAPI Wege durchlaufen solche Eingabe immer gewisse Transformationen. Also Windows errechnet, wo jetzt der Mauszeiger auf dem Bildschirm ist, statt nur die Relativbewegung aus dem Maustreiber zu lesen.Oder Windows schaut nach, ob die zwei Tasten, die der Nutzer gedrückt hat, irgendeine besondere Tastaturkombination sind.
Möchte man mal eben erfragen, ob die Taste 'y' gerade gedrückt ist, so fragt man mit GetAsyncKeyState, ob diese Taste gedrückt ist. Also jede Taste einzeln.Bei DirectInput kopiert es dir den ganzen Momentanzustand des Keyboards in ein Array. Da kannst du dann effektiver abfragen, welche Tasten in diesem Moment gerade gedrückt wurden. Das hat für Spiele Vorteile, die Tastatur wird so zu einem Joystick mit > 100 Knöpfen.
-
Aha.
Ich hatte da mal ne RawInput Implementierung, ist aber schon ne ganze Weile her. Wäre das denn am ratsamsten? DI soll ja nur ein RI-Wrapper sein.
Jedoch hatte ich Probleme mit RI! Zum Beispiel wurde teils wirrer Mouseinput empfangen, wobei alles stoppte, sobald ich eine Taste auf der Tastatur drückte usw...
MfG
-
DI kann kein Wrapper von RI sein, da es RI erst seit WinXP zu geben scheint.
Das wäre mir persönlich aber auch schon Grund genug, RI nicht zu verwenden.Ich sehe jetzt bei RI auch keine wirklichen Vorteile, es sei denn, man hat irgendeinen sonderbaren Controller, den man speziell abfragen möchte.
Wenn man nur Maus, Tastatur und 08/15 Joystick Bewegungen abfragen will, denke ich, dass man mit den anderen beiden Konzepten völlig auskommt. Und vor allem bequemer.
-
Angeblich:
DirectInput wird nicht mehr weiterentwickelt und Microsoft rät jedem, mit RawInput zu arbeiten.Ich bin mir nun unsicher. DI schneller als WinAPI? RI schneller als DI?
MfG
-
Ich empfehle was sich bei allen anderen Anwendungen bewährt hat: Bau eine abstraktes Interface mit dem du die Eingabegeräte abfragst. Intern kannst du dann die implementierung auswechseln, z.b. von DI auf RI, ohne das du den Rest deines Programmes ändern musst.
Also z.B. OOP:interface Input { boolean isKeypressed(key); } class RawInput implements Input { } class DirectInput implements Input { } //... Input input = new DirectImput(); // wenn DI langsamer sein sollte input = new RawImput();
-
ceplusplus schrieb:
DirectInput wird nicht mehr weiterentwickelt und Microsoft rät jedem, mit RawInput zu arbeiten.
BlaBlubb, MS rät alle zwei Tage mal was anderes.

Je nachdem, welches Produkt sie gerade pushen wollen...
-
Interessant.
Hab noch nie mit interfaces gearbeitet. Die Funktion "isKeypressed()" muss dann in den beiden Klassen implementiert sein, richtig?
MfG
-
ceplusplus schrieb:
Interessant.
Hab noch nie mit interfaces gearbeitet. Die Funktion "isKeypressed()" muss dann in den beiden Klassen implementiert sein, richtig?
MfG
Ja klar.