Mauszeigergeschwindigkeit

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Rubiko
Beiträge: 943
Registriert: 25.02.2005 19:43
Computerausstattung: Intel i7 2600k
8GB Ram
GeForce GTX 560 Ti
Wohnort: Schwabach

Beitrag von Rubiko »

ich glaube ja, aber am ende vom programm muss es natürlich wieder aufs minimum gezogen werden
Ich wollte die Welt verändern, doch Gott gab mir nicht den Quelltext.
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

wenn ich leos code benutze kann ich die geschwindigkeit ändern aber wie kann ich sie rausfinden bzw. am ende des Programms wieder zurücksetzen?
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Code: Alles auswählen

#SPI_GETMOUSESPEED = 112
Procedure GetMouseSpeed()
    SystemParametersInfo_(#SPI_GETMOUSESPEED, #Null, @MSBuffer, #Null)
    ProcedureReturn MSBuffer
EndProcedure

Debug GetMouseSpeed()
P.S.: Ich glaube aber, dass bei DX ne andere Maus verwendet wird ... (@Stefan Moubius?)
Benutzeravatar
zigapeda
Beiträge: 1753
Registriert: 06.03.2005 17:22
Wohnort: Kaufbeuren
Kontaktdaten:

Beitrag von zigapeda »

Wie du vermutet hast es hat keinen Unterschied ob ich bei Dx den MouseSpeed auf 1 oder 20 setzte (mit deiner Procedure).
kluger Mann + kluge Frau = Romanze | dummer Mann + dumme Frau = Schwangerschaft
kluger Mann + dumme Frau = Affäre | dummer Mann + kluge Frau = Shopping <)
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

[auch wenn MouseDeltaX() nach einem jahr schon ziemlich groß sein wird] <)

hier mal mit beschleunigung, wobei kleine bewegungen auch klein bleiben.

Code: Alles auswählen

InitSprite()
InitMouse()
#screenW=1024
#screenH=768
OpenScreen(#screenW,#screenH,32,"fllscrn")
#ACCELERATION=1.5
Repeat
  ExamineMouse()
  mouseDX.f=MouseDeltaX()
  mouseDY.f=MouseDeltaY()
  If mouseDX<0 : mouseDX=-Pow(-mouseDX,#ACCELERATION) : Else : mouseDX=Pow(mouseDX,#ACCELERATION) : EndIf  
  If mouseDY<0 : mouseDY=-Pow(-mouseDY,#ACCELERATION) : Else : mouseDY=Pow(mouseDY,#ACCELERATION) : EndIf
  mouseX+mouseDX :If mouseX>#screenW-1 : mouseX=#screenW-1 :EndIf :If mouseX<0 : mouseX=0 :EndIf
  mouseY+mouseDY :If mouseY>#screenH-1 : mouseY=#screenH-1 :EndIf :If mouseY<0 : mouseY=0 :EndIf

  StartDrawing( ScreenOutput() )
    Circle(mouseX,MouseY,2,$ff3311)
  StopDrawing()
  FlipBuffers()
  ClearScreen(0)
Until MouseButton(2)
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@MLK

Code: Alles auswählen

int aMouseInfo[3];
ist ein array mit 3 feldern. leider weiß ich nich genau, wie groß ein INT in diesem fall ist.

Code: Alles auswählen

aMouseInfo[2] = 2 * aMouseInfo[2]; 
das zweite Feld enthält den Speed.
evtl. sind die anderen beiden Felder Grid und Accelleration.

@Leo
yo das ist dann die Umsetzung. thnx.

> Ich glaube aber, dass bei DX ne andere Maus verwendet wird ...

und das ist wohl der knackpunkt. kann da jemand weiterhelfen?
ich hab mir nämlich zufällig grad vor ein paar tagen dieselbe frage gestellt.

@#NULL

wieso Pow()?
also, ich würde nen einfachen faktor vorziehen, zumal das Pow() irre rechenzeit braucht.
abgesehen davon ist die lösung durchaus zwar brauchbar, aber das problem bleibt,
dass die rückgabe von MouseDelta wohl eigentlich Integer ist,
und wir dann mit einem faktor eben immer größere schritte als 1 bekommen.
es wäre halt wünschenswert, durchaus 1pix-schritte bekommen zu können,
wenn die maus synchron zur framerate bewegt wird.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

wieso einfach?? wenn es auch komplieziert geht ....

also leute dies ist eine naja sagen wir mal eine sehr genaue aber trotzdem schnelle maus ...

Code: Alles auswählen

examinemouse()

if MouseDeltaX() < -3 or MouseDeltaX() > 3 
  MouseLocate(mouseX()+ MouseDeltaX() * 2,mouseY())
endif
if MouseDeltaY() < -3 or mousedeltay() > 3
  MouseLocate(mouseX, mouseY()+MouseDeltaY() * 2)
endif

dort wie die -3 und die 3 steht kannste das so einstellen wie du es willst.
und genau ist die maus ach noch wie die alte ^^


MFG
Brügge
Beiträge: 359
Registriert: 28.05.2006 16:40
Wohnort: Rheine

Beitrag von Brügge »

die maus kann man sogar noch verbessern!

jetzt ist das ja so: das wenn du mit der maus langsam anfärst und von 2 aud 3 wechselst dann macht er einen riesen geschwindigkeitssprung... so passiert das nicht:

Code: Alles auswählen

Exminemouse()

MouseLocate(mouseX()+MouseDeltaX()*MouseDeltaX(), mouseY()+MouseDeltaY()*MouseDeltaY())

naja du musst wissen wie deine maus sein soll also so finde ich die cool!

MFG brügge
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@Brügge

kannst du mir mal verkasematuckeln, was der schwachsinn soll?

also, du nimmst die aktuelle Koordinaten der Maus,
dann die differenz zu den letzten Koordinaten,
die liest du auch noch 2x aus, also, 2x Function-Call...

*koppschüttel*

sorry, aber das entbehrt jeder logik. warauf wolltest du denn hinaus?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
#NULL
Beiträge: 2238
Registriert: 20.04.2006 09:50

Beitrag von #NULL »

@KG
ja, der Pow()-aufruf ist etwas übertrieben.
aber dass die bewegungen immer gößer als 1 pixel wären stimmt nicht.

Code: Alles auswählen

deltaX.f=1
n=Pow(deltaX,1.9)
Debug n ; gibt 1 aus


....hier mal vier modi (mit taste 1 bis 4 umschalten)

Code: Alles auswählen

InitSprite():InitKeyboard()
InitMouse()
#screenW=1024
#screenH=768
OpenScreen(#screenW,#screenH,32,"fllscrn")
#ACC1=1.3
#ACC2=1.2
#ACC3=0.15
mode=1
Repeat
  ExamineKeyboard()
  ExamineMouse()
  If KeyboardReleased(#PB_Key_1) : mode=1 : EndIf
  If KeyboardReleased(#PB_Key_2) : mode=2 : EndIf
  If KeyboardReleased(#PB_Key_3) : mode=3 : EndIf
  If KeyboardReleased(#PB_Key_4) : mode=4 : EndIf

  Select mode
    Case 1
      mouseX=MouseX()
      mouseY=MouseY()
      s$="normal"
    Case 2
      mouseDX.f=MouseDeltaX()*#ACC1
      mouseDY.f=MouseDeltaY()*#ACC1
      mouseX+mouseDX :If mouseX>#screenW-1 : mouseX=#screenW-1 :EndIf :If mouseX<0 : mouseX=0 :EndIf
      mouseY+mouseDY :If mouseY>#screenH-1 : mouseY=#screenH-1 :EndIf :If mouseY<0 : mouseY=0 :EndIf
      s$="faktor"
    Case 3
      mouseDX.f=MouseDeltaX()
      mouseDY.f=MouseDeltaY()
      If mouseDX<0 : mouseDX=-Pow(-mouseDX,#ACC2) : Else : mouseDX=Pow(mouseDX,#ACC2) : EndIf 
      If mouseDY<0 : mouseDY=-Pow(-mouseDY,#ACC2) : Else : mouseDY=Pow(mouseDY,#ACC2) : EndIf
      mouseX+mouseDX :If mouseX>#screenW-1 : mouseX=#screenW-1 :EndIf :If mouseX<0 : mouseX=0 :EndIf
      mouseY+mouseDY :If mouseY>#screenH-1 : mouseY=#screenH-1 :EndIf :If mouseY<0 : mouseY=0 :EndIf
      s$="Pow()"
    Case 4
      mouseDX.f=MouseDeltaX()
      mouseDY.f=MouseDeltaY()
      If mouseDX<-4 : mouseDX=-mouseDX*mouseDX*#ACC3 : ElseIf mouseDX>4 : mouseDX=mouseDX*mouseDX*#ACC3 : EndIf 
      If mouseDY<-4 : mouseDY=-mouseDY*mouseDY*#ACC3 : ElseIf mouseDY>4 : mouseDY=mouseDY*mouseDY*#ACC3 : EndIf
      mouseX+mouseDX :If mouseX>#screenW-1 : mouseX=#screenW-1 :EndIf :If mouseX<0 : mouseX=0 :EndIf
      mouseY+mouseDY :If mouseY>#screenH-1 : mouseY=#screenH-1 :EndIf :If mouseY<0 : mouseY=0 :EndIf
      s$="exponential ohne Pow() - mit schranke"
  EndSelect

  StartDrawing( ScreenOutput() )
    Circle(mouseX,MouseY,2,$ff3311)
    DrawText(100,100,s$, $aaaaaa,$0)
  StopDrawing()
  FlipBuffers()
  ClearScreen(0)
Until MouseButton(2)
my pb stuff..
Bild..jedenfalls war das mal so.
Antworten