Mausbewegung (ehem:USB-Schnittstelle)

Anfängerfragen zum Programmieren mit PureBasic.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Kaeru Gaman »

Sebastian hat geschrieben:Wieso muss ich ExamineMouse() bei jedem Schleifendurchlauf aufrufen?
schrieb ich bereits oben.

vielleicht wird es so deutlicher:

Code: Alles auswählen

InitSprite()
InitMouse()
InitKeyboard()

OpenScreen( 1024, 768, 32, "Maustest" )

CreateSprite( 0, 32, 32 )
  StartDrawing( SpriteOutput( 0 ) )
    LineXY( 0,0, 32, 32, $40F020 )
    LineXY( 0,0, 16,  8, $40F020 )
    LineXY( 0,0,  8, 16, $40F020 )
  StopDrawing()

timer = ElapsedMilliseconds()
MouseLocate( 512, 384 )
ExamineMouse()

Repeat

;** die ersten 5 sec kein ExamineMouse
  If ElapsedMilliseconds() > timer + 5000
    ExamineMouse()
  EndIf  

  ExamineKeyboard()

  MX = MouseX()
  MY = MouseY()  
  MDX = MouseDeltaX()
  MDY = MouseDeltaY()

  If KeyboardPushed( #PB_Key_Escape )
    EXIT = 1
  EndIf

  ClearScreen( $201008 )

  StartDrawing( ScreenOutput() )
    DrawingMode( #PB_2DDrawing_Transparent )
    DrawText( 4,  4, "MDX: " + Str(MDX) , $0FF0FF )
    DrawText( 4, 24, "MDY: " + Str(MDY) , $0FF0FF )
  StopDrawing()

  DisplayTransparentSprite( 0, MX, MY )

  FlipBuffers()

Until EXIT
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Sebastian »

Vielen Dank für Deine Mühe, Kaeru, aber ich glaube, dass wir aneinander vorbeireden bzw. ich drücke mich vielleicht nicht genau genug aus:
Ich muss ExamineMouse() bei jedem Schleifendurchlauf ermitteln, damit ich ein wunderbares Ergebnis erhalte, wie Du mit dem Beispiel demonstrierst. Warum aber reicht es denn nicht, wie in meinem Beispiel, ExamineMouse() alle 1000ms auszuführen? In diesen 1000ms kann ich die Maus natürlich ein bisschen weiter bewegen...
(Win 11 64-bit, PB 6.04 und 6.10)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Kaeru Gaman »

das ist eine verdammt gute Frage...
ich hab versuchsweise mal alle 100ms eingebaut, und festgestellt, dass die maus dann nur sporadisch erkannt wird, wenn man sie zu schnell bewegt!

Code: Alles auswählen

InitSprite()
InitMouse()
InitKeyboard()

OpenScreen( 1024, 768, 32, "Maustest" )

CreateSprite( 0, 32, 32 )
  StartDrawing( SpriteOutput( 0 ) )
    LineXY( 0,0, 32, 32, $40F020 )
    LineXY( 0,0, 16,  8, $40F020 )
    LineXY( 0,0,  8, 16, $40F020 )
  StopDrawing()

timer = ElapsedMilliseconds()
MouseLocate( 512, 384 )
ExamineMouse()

Repeat

;** die ersten 5 sec kein ExamineMouse
  If ElapsedMilliseconds() > timer + 100
    timer = ElapsedMilliseconds()
    ExamineMouse()
  EndIf  

  ExamineKeyboard()

  MX = MouseX()
  MY = MouseY()  
  MDX = MouseDeltaX()
  MDY = MouseDeltaY()

  If KeyboardPushed( #PB_Key_Escape )
    EXIT = 1
  EndIf

  ClearScreen( $201008 )

  StartDrawing( ScreenOutput() )
    DrawingMode( #PB_2DDrawing_Transparent )
    DrawText( 4,  4, "MDX: " + Str(MDX) , $0FF0FF )
    DrawText( 4, 24, "MDY: " + Str(MDY) , $0FF0FF )
  StopDrawing()

  DisplayTransparentSprite( 0, MX, MY )

  FlipBuffers()

Until EXIT
wenn du sie ganz langsam bewegst, wird jeder durchlauf korrekt ausgelesen.
vielleicht irgendeine Sicherung seitens des OS?
also, oft genug abfragen, damit schnelle bewegungen zuverlässig genug erkannt werden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Sebastian »

Okay. Dann war es kein Verständnisproblem, sondern es geht tatsächlich nicht. Dann muss also ein sehr genauer Timer verwendet werden und die jeweiligen DeltaX-Werte summiert werden, um die Gesamtstrecke zu errechnen. Bleibt noch das Problem, dass nur die Bildschirmbreite genutz werden kann und außerdem die Pixelbreite irgendwie erfasst werden muss. Das klingt nicht machbar mit einer Softwarelösung. Das Problem ist aber dennoch sehr interessant, finde ich und die Idee wirklich originell. Man müsste doch tatsächlich seine Maus als Scanner nutzen könne, um damit zu messen. Mann müsste doch irgedwie an DeltaX-Werte kommen können, auch wenn die Maus den tatsächlichen Bildschirmrahmen überschreitet?!!?
(Win 11 64-bit, PB 6.04 und 6.10)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Kaeru Gaman »

Sebastian hat geschrieben:Bleibt noch das Problem, dass nur die Bildschirmbreite genutz werden kann und außerdem die Pixelbreite irgendwie erfasst werden muss.
probier doch bitte mein Beispiel aus! /:->
dir sollte auffallen, dass DX tatsächlich sinnvolle Werte annimmt, auch wenn man an den Rand fährt und weiter.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Sebastian »

:allright:
Hast recht. Ist mir gar nicht aufgefallen :oops:
Dann bleibt nur noch das Problem, daraus irgendwie eine Angabe in mm oder ähnliches zu machen. Da bin ich völlig überfragt...
(Win 11 64-bit, PB 6.04 und 6.10)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Kaeru Gaman »

na, das musst du als Konstante oder Eingabewert einbinden.
also einen Kalibrierungslauf, wo deine Meßapparatur eine gewisse zeit lang durchläuft, dann sagt er dir, wieviel pixel das waren und fordert dich auf, die manuell gemessenen zentimeter einzugeben.

ob es irgendwie möglich ist, die DPI deiner Maus abzufragen, bin ich jetzt überfragt.
das wäre natürlich das eleganteste, die DPI direkt vom Maustreiber zu erfahren, dann kannst du direkt umrechnen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Sebastian
Beiträge: 322
Registriert: 14.06.2006 16:46
Wohnort: Kiel

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Sebastian »

Ja, das klingt doch plausibel... ist denn das überhaupt das, was Du meintest, Martin?
(Win 11 64-bit, PB 6.04 und 6.10)
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Kaeru Gaman »

noch ein ganz wichtiger punkt der nicht übersehen werden darf:
die Beschleunigung in den Einstellungen des Maustreibers muss ausgeschaltet werden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: Mausbewegung (ehem:USB-Schnittstelle)

Beitrag von Martin66119 »

Hallo an alle HELFENDEN!

Genau das habe ich gesucht. Vielen Dank

Nun fehlt nur noch die Mausbeschleunigung beim Programmstart auszuschalten und am Ende wieder auf den gewünschten Wert zu setzen.

Vielen Vielen Dank!

Grüße
Martin
Antworten