Seite 2 von 3

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 14:01
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

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 14:21
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...

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 14:46
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.

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 14:53
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?!!?

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 14:58
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.

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 15:33
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...

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 15:48
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.

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 20.12.2009 19:46
von Sebastian
Ja, das klingt doch plausibel... ist denn das überhaupt das, was Du meintest, Martin?

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 21.12.2009 02:56
von Kaeru Gaman
noch ein ganz wichtiger punkt der nicht übersehen werden darf:
die Beschleunigung in den Einstellungen des Maustreibers muss ausgeschaltet werden.

Re: Mausbewegung (ehem:USB-Schnittstelle)

Verfasst: 21.12.2009 13:15
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