Genauigkeitsproblem mit Maussteuerung

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Ryo Saeba

Betreff: Genauigkeitsproblem mit Maussteuerung

BeitragDo, Jun 21, 2007 17:35
Antworten mit Zitat
Benutzer-Profile anzeigen
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

BeitragDo, Jun 21, 2007 18:03
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Wink
Twitter
Download Jewel Snake!
Windows|Android

hectic

Sieger des IS Talentwettbewerb 2006

BeitragDo, Jun 21, 2007 19:43
Antworten mit Zitat
Benutzer-Profile anzeigen
''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

BeitragFr, Jun 22, 2007 11:18
Antworten mit Zitat
Benutzer-Profile anzeigen
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.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group