Genauigkeitsproblem mit Maussteuerung
Übersicht

![]() |
Ryo SaebaBetreff: Genauigkeitsproblem mit Maussteuerung |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hi, ich arbeite zwar mit Blitz3D, aber in meinem folgendem Problem kommen keine 3D Befehle vor, deshalb ist es sicher sinnvoll es hier zu posten, es geht um folgendes:
Ich versuche eine Maussteuerung zu implementieren, bei der es auf Genauigkeit ankommt und darauf, dass das Objekt, dass per Maus bewegt wird, eine bestimmte Maximalgeschwindigkeit besitzt. Um dies zu erreichen, habe ich die Bewegung eingeschränkt, sodass man, wenn man die Maus zu schnell bewegt, "abgebremst wird". Ich will nun den Mauszeiger immer in der Mitte des Bildschirms halten, was auch funktioniert, bis auf die Genauigkeit, denn wenn man den Mauszeiger seeehr langsam bewegt, dann bewegt sich das Objekt manchmal gar nicht. Hier ist der Code: Code: [AUSKLAPPEN] Global size = 50 Global x = 640 / 2 Global y = 480 / 2 Global mx Global my Global mx_old = 640 / 2 Global my_old = 480 / 2 Global mx_vel Global my_vel Global mx_max = 16 Global my_max = 16 Graphics 640, 480 SetBuffer BackBuffer () frametimer = CreateTimer (100) MoveMouse (mx_old, my_old) Repeat WaitTimer frametimer Cls mx = MouseX () my = MouseY () ;/////x movement restriction///// If mx > mx_old Then ;movement in positive x direction If mx > mx_old + mx_max Then ;restriction mx_vel = mx_max Else ;no restriction mx_vel = mx - mx_old EndIf ElseIf mx < mx_old Then ;movement in negative x direction If mx < mx_old - mx_max Then ;restriction mx_vel = - mx_max Else ;no restriction mx_vel = mx - mx_old EndIf Else ;no movement in x direction mx_vel = 0 EndIf ;/////y movement restriction///// If my > my_old Then ;movement in positive y direction If my > my_old + my_max Then ;restriction my_vel = my_max Else ;no restriction my_vel = my - my_old EndIf ElseIf my < my_old Then ;movement in negative y direction If my < my_old - my_max Then ;restriction my_vel = - my_max Else ;no restriction my_vel = my - my_old EndIf Else ;no movement in y direction my_vel = 0 EndIf MoveMouse (mx_old, my_old) x = x + mx_vel y = y + my_vel Rect x, y, size, size Text 100, 100, MouseX () Text 100, 132, MouseY () Flip (0) Until KeyHit (1) Kann mir jemand sagen, woran das liegt? Ich habe schon eine ganze Weile daran gegrübelt. |
||
![]() |
Tankbuster |
![]() Antworten mit Zitat ![]() |
---|---|---|
Also bei mir geht das eigentlich mit der Maus. Es liegt wohl daran, dass du ohne Floats arbeitest, oder daran, dass es keine halben-Pixel gibt ![]() |
||
Twitter
Download Jewel Snake! Windows|Android |
![]() |
hecticSieger des IS Talentwettbewerb 2006 |
![]() Antworten mit Zitat ![]() |
---|---|---|
''oder garnicht...''. Du solltest MoveMouse gleich nach der Abfrage der Mausbewegung setzen. Denn, so wie du es machst, kann in der Zwischenzeit so viel Zeit vergangen sein, dass dein Maustreiber bereits neue Koordinaten liefert, die dann mit MoveMouse gelöscht werden.^^
Also irgendwie so: Code: [AUSKLAPPEN] mx_old=mx
my_old=my mx = MouseX () my = MouseY () MoveMouse (mx_old, my_old) |
||
Download der Draw3D2 V.1.1 für schnelle Echtzeiteffekte über Blitz3D |
![]() |
Ryo Saeba |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für die Antworten erstmal.
@Tankbuster: Das dachte ich zuerst auch, aber nein, daran liegt es definitiv nicht (habe es getestet). @hectic: Ich verwendete den MoveMouse Befehl doch auch im selben Durchlauf, genau wie du in deinem Beispiel angedeutet hast, das funktionierte also so auch nicht. Aber du hast mich auf die richtige Pfärte gebracht, thx^^ Es lag nämlich wirklich an der Positionierung des MoveMouse Befehls. Mein neuer Code sieht nun so aus: Code: [AUSKLAPPEN] Global size = 50 Global x = 640 / 2 Global y = 480 / 2 Global mx Global my Global mx_old = 640 / 2 Global my_old = 480 / 2 Global mx_vel Global my_vel Global mx_max = 16 Global my_max = 16 Graphics 640, 480 SetBuffer BackBuffer () frametimer = CreateTimer (100) MoveMouse (mx_old, my_old) Repeat WaitTimer frametimer Cls mx = MouseX () my = MouseY () ;/////x movement restriction///// If mx > mx_old Then ;movement in positive x direction If mx > mx_old + mx_max Then ;restriction mx_vel = mx_max Else ;no restriction mx_vel = mx - mx_old EndIf MoveMouse (mx_old, my_old) ElseIf mx < mx_old Then ;movement in negative x direction If mx < mx_old - mx_max Then ;restriction mx_vel = - mx_max Else ;no restriction mx_vel = mx - mx_old EndIf MoveMouse (mx_old, my_old) Else ;no movement in x direction mx_vel = 0 EndIf ;/////y movement restriction///// If my > my_old Then ;movement in positive y direction If my > my_old + my_max Then ;restriction my_vel = my_max Else ;no restriction my_vel = my - my_old EndIf MoveMouse (mx_old, my_old) ElseIf my < my_old Then ;movement in negative y direction If my < my_old - my_max Then ;restriction my_vel = - my_max Else ;no restriction my_vel = my - my_old EndIf MoveMouse (mx_old, my_old) Else ;no movement in y direction my_vel = 0 EndIf x = x + mx_vel y = y + my_vel Rect x, y, size, size Text 100, 100, MouseX () Text 100, 132, MouseY () Flip (0) Until KeyHit (1) End Ich habe lasse den MoveMouse Befehl nun nicht mehr bei jedem Durchlauf abarbeiten, sonder nur noch, wenn sich die Koordinaten der Maus auch geändert haben. Nun funktioniert es einwandfrei. Was ich daraus schließe ist, dass Windows die Mauskoordinaten von sich aus in Fließkommazahlen speichert, der MouseX/Y-Befehl einem aber dennoch immer nur Int-Werte liefert, auch wenn man die Variablen in Blitz, die die MouseX/Y Befehle speichern, als Fließkommazahlen deklariert. |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group