Forum | | | | - Seite 1 - |
| funkheld | Hallo, guten Tag. Ich habe ein kombinationsproblem mit der Maus.
Ich habe über dem Schwungrad von meinem Trimmrad eine optische Mausplatine befestigt(5 Euro-Maus). Die Befestigung ist so, das, wenn ich trete, die Mausposition von y-0 nach y-Max geht.
Wie kann man es machen, das die Maus zb auf y=0 gesetzt wird und bei y>500 ein Zähler gezählt wird und die Maus dann wieder auf y=0 gesetzt wird. Dies dann in einer Schleife abläuft.
Diese kombination bekomme ich nicht hin, weil die Maus bei einer bestimmten Geschwindigkeit überfordert ist, sie zählt dann nicht mehr weiter. Mit "sleep 1" geht es auch nicht.
Woran liegt das. Ich compiliere mit XPSE. KompilierenMarkierenSeparieren {$cleq}
Def @Getcursorpos(1) !"user32","GetCursorPos"
Def @Setcursorpos(2) !"USER32","SetCursorPos"
Struct Mauskoordinaten = X&,Y&
Declare Xpos&,Ypos&,Curpos#,zaehler&
Windowstyle 31
Windowtitle "Cursorposition ermitteln"
Window 200,0 - 440,440
@Setcursorpos (100,0)
While 0 = 0
Sleep 5
Dim Curpos#,Mauskoordinaten
@Getcursorpos(Curpos#)
Xpos& = Curpos#.X&
Ypos& = Curpos#.Y&
if Ypos& > 500
@Setcursorpos (100,0)
zaehler&=zaehler&+1
endif
Dispose Curpos#
Drawtext 0,0,"Zähler: " + zaehler& + @Space$(30)
Endwhile
Danke.
Gruss |
| | | | |
| | | | - Seite 2 - |
| | « Dieser Beitrag wurde als Lösung gekennzeichnet. » | | - Seite 1 - |
| | @Funkheld: Hab Dir hier mal was die Strecke misst... sowas?
Herunterladen KompilierenMarkierenSeparieren {$cleq}
Windowstyle 31
Windowtitle "Cursorposition ermitteln"
Window 500,500
setcursorpos((winRight-winLeft)\2+winLeft,(winBottom-winTop)\2+winTop)
var modified&=0
var strecke&=0
var my2MousePositions&=globalAlloc(gPTR,16)
getCursorPos(my2MousePositions&)
rtlMoveMemory(my2MousePositions&+8,my2MousePositions&,8)
while 1
waitinput 10
getCursorPos(my2MousePositions&)
settext hWnd,"X:"+str$(long(my2MousePositions&,0))+" Y:"+str$(long(my2MousePositions&,4))+" Strecke:"+str$(strecke&)
add strecke&,abs(long(my2MousePositions&,0)-long(my2MousePositions&,8))+abs(long(my2MousePositions&,4)-long(my2MousePositions&,12))
if long(my2MousePositions&,0) > winRight
long my2MousePositions&,0=winLeft
inc modified&
endif
if long(my2MousePositions&,0) < winLeft
long my2MousePositions&,0=winRight
inc modified&
endif
if long(my2MousePositions&,4) < winTop
long my2MousePositions&,4=winBottom
inc modified&
endif
if long(my2MousePositions&,4) > winBottom
long my2MousePositions&,4=winTop
inc modified&
endif
if modified&
modified&=0
setCursorPos(long(my2MousePositions&,0),long(my2MousePositions&,4))
endif
rtlMoveMemory(my2MousePositions&+8,my2MousePositions&,8)
wend
globalFree(my2MousePositions&)
end
Wenn Du die add strecke Zeile dahin änderst: KompilierenMarkierenSeparierenadd strecke&,(long(my2MousePositions&,0)-long(my2MousePositions&,8))+(long(my2MousePositions&,4)-long(my2MousePositions&,12))
(also ohne abs), dann wird die rückwärtsgefahrene Strecke auch von der Streckenlänge subtrahiert statt zur Streckenlänge addiert.
PS: Bei XPSE brauchst die ganzen Standard-APIs nicht deklarieren und es ist sogar sinnvoller es dann auch nicht zu tun da die Aufrufe in deutlich schnellere Calls umgewandelt werden. |
| | | | | |
| | | Schau mal vielleicht so:
Herunterladen
KompilierenMarkierenSeparieren {$cleq}
decimals 2
Windowstyle 31
Windowtitle "Cursorposition ermitteln"
window (maxx-500),(maxy-100)
setcursorpos((winRight-winLeft)\2+winLeft,(winBottom-winTop)\2+winTop)
var speed.realPixelSpeed!=0
var speed.forShow!=0
var tmp&=0
var tmp2&=479
var tme&=getTickCount
var tme.start&=getTickCount
var modified&=0
var strecke&=0
var my2MousePositions&=globalAlloc(gPTR,16)
getCursorPos(my2MousePositions&)
rtlMoveMemory(my2MousePositions&+8,my2MousePositions&,8)
mcls 640,480,0
while 1
if tme&<getTickCount
add tme&,100// nur alle 100ms etwas tun
speed.realPixelSpeed!=(strecke&-tmp&)*0.5+speed.realPixelSpeed!*0.5
speed.forShow!=speed.realPixelSpeed!*0.001
tmp&=strecke&
startpaint -1
usefont "Arial",50,0,0,0,0
textcolor $FFFF,0
drawtext 10,10,"Race: "+str$((getTickCount-tme.start&)\1000)+" Sekunden"
drawtext 10,60,"Strecke: "+str$(strecke&*0.0001)+" Meter"
drawtext 10,110,"Geschw.: "+str$(speed.forShow!)+" km/h"
drawtext 10,160,"ø Geschw.: "+str$((strecke&*0.0001)/(1+(getTickCount-tme.start&)\1000))+" Meter/s "
textcolor $00FF00,-1
drawtext 10,10,"Race:"
drawtext 10,60,"Strecke:"
drawtext 10,110,"Geschw.:"
drawtext 10,160,"ø Geschw.:"
copybmp 1,240 - 640,240 > 0,240;0
usepen 0,0,$00FF00
line 637,tmp2& - 638,(479-speed.realPixelSpeed!*0.02)
tmp2&=479-speed.realPixelSpeed!*0.02
endpaint
mcopysizedbmp 0,0 - 640,480 > 0,0 - width(hWnd),height(hWnd);0
endif
getCursorPos(my2MousePositions&)
settext hWnd,"X:"+str$(long(my2MousePositions&,0))+" Y:"+str$(long(my2MousePositions&,4))+" Strecke:"+str$(strecke&)
add strecke&,abs(long(my2MousePositions&,0)-long(my2MousePositions&,8))+abs(long(my2MousePositions&,4)-long(my2MousePositions&,12))
if long(my2MousePositions&,0) > winRight
long my2MousePositions&,0=winLeft
inc modified&
endif
if long(my2MousePositions&,0) < winLeft
long my2MousePositions&,0=winRight
inc modified&
endif
if long(my2MousePositions&,4) < winTop
long my2MousePositions&,4=winBottom
inc modified&
endif
if long(my2MousePositions&,4) > winBottom
long my2MousePositions&,4=winTop
inc modified&
endif
if modified&
modified&=0
setCursorPos(long(my2MousePositions&,0),long(my2MousePositions&,4))
endif
rtlMoveMemory(my2MousePositions&+8,my2MousePositions&,8)
wend
globalFree(my2MousePositions&)
end
Den Faktor bei: KompilierenMarkierenSeparierenspeed.forShow!=speed.realPixelSpeed!*0.001
bzw. das *0.001 musst halt anpassen so dass es passend wirkt. |
| | | | |
| | funkheld | Jup, danke. Du bist ja ein Mathefreak.
Funktioniert wunderbar.
Danke.
Gruss |
| | | | |
| | | Hier gibts Mathefreaks aber ich bin kein Mathefreak. |
| | | | |
| | funkheld | Vielleicht kann man aus diesen Daten die Geschwindigkeit und die Wegstrecke ausrechnen: Eine Pedalumdrehung hat 41000 Mauspunkte, dabei dreht sich das Schwungrad 5x. Das Schwungrad hat einen Umfang von 75 cm.
Gruss peter |
| | | | |
| | | 5 Schwungraddrehungen metern also 5*75=375cm und dies entspricht dann wohl einer
Pedalumdrehung -
demnach müsstest den Wert in strecke& vlt. nur mit 375/41000/100=0,0091463
multiplizieren und dann hast Du imho die Anzahl der zurückgelegten Meter statt
Pixel. Probiere mal ob dies hier bei Dir passende Werte zurückliefert: KompilierenMarkierenSeparieren {$cleq}
decimals 2
Windowstyle 31
Windowtitle "Cursorposition ermitteln"
window (maxx-500),(maxy-100)
setcursorpos((winRight-winLeft)\2+winLeft,(winBottom-winTop)\2+winTop)
var speed.realPixelSpeed!=0
var speed.forShow!=0
var tmp&=0
var tmp2&=479
var tme&=getTickCount
var tme.start&=getTickCount
var modified&=0
var strecke&=0
var my2MousePositions&=globalAlloc(gPTR,16)
getCursorPos(my2MousePositions&)
rtlMoveMemory(my2MousePositions&+8,my2MousePositions&,8)
mcls 640,480,0
while 1
if tme&<getTickCount
add tme&,100// nur alle 100ms etwas tun
speed.realPixelSpeed!=(strecke&-tmp&)*0.5+speed.realPixelSpeed!*0.5
speed.forShow!=speed.realPixelSpeed!*0.000091463*36
tmp&=strecke&
startpaint -1
usefont "Arial",50,0,0,0,0
textcolor $FFFF,0
drawtext 10,10,"Race: "+str$((getTickCount-tme.start&)\1000)+" Sekunden"
drawtext 10,60,"Strecke: "+str$(strecke&*0.000091463)+" Meter"
drawtext 10,110,"Geschw.: "+str$(speed.forShow!)+" km/h "
drawtext 10,160,"ø Geschw.: "+str$((strecke&*0.000091463)/(1+(getTickCount-tme.start&)\1000))+" Meter/s "
textcolor $00FF00,-1
drawtext 10,10,"Race:"
drawtext 10,60,"Strecke:"
drawtext 10,110,"Geschw.:"
drawtext 10,160,"ø Geschw.:"
copybmp 1,240 - 640,240 > 0,240;0
usepen 0,0,$00FF00
line 637,tmp2& - 638,(479-speed.realPixelSpeed!*0.02)
tmp2&=479-speed.realPixelSpeed!*0.02
endpaint
mcopysizedbmp 0,0 - 640,480 > 0,0 - width(hWnd),height(hWnd);0
endif
getCursorPos(my2MousePositions&)
settext hWnd,"X:"+str$(long(my2MousePositions&,0))+" Y:"+str$(long(my2MousePositions&,4))+" Strecke:"+str$(strecke&)
add strecke&,abs(long(my2MousePositions&,0)-long(my2MousePositions&,8))+abs(long(my2MousePositions&,4)-long(my2MousePositions&,12))
if long(my2MousePositions&,0) > winRight
long my2MousePositions&,0=winLeft
inc modified&
endif
if long(my2MousePositions&,0) < winLeft
long my2MousePositions&,0=winRight
inc modified&
endif
if long(my2MousePositions&,4) < winTop
long my2MousePositions&,4=winBottom
inc modified&
endif
if long(my2MousePositions&,4) > winBottom
long my2MousePositions&,4=winTop
inc modified&
endif
if modified&
modified&=0
setCursorPos(long(my2MousePositions&,0),long(my2MousePositions&,4))
endif
rtlMoveMemory(my2MousePositions&+8,my2MousePositions&,8)
wend
globalFree(my2MousePositions&)
end
|
| | | | |
| | funkheld | Hallo, danke. Jetzt kommt bei einer Pedalumdrehung 3,77Meter raus. Das ist Super.
Aber warum geht die Geschwindigkeitsanzeige nicht höher wie ca 15Km/h ? Ist mir jetzt erst aufgefallen. Wenn ich schneller Trete, wird auch die zurückgelegte Strecke länger in einer Zeiteinheit, also der km-Zähler funktioniert mit steigender Geschwindigkeit.
Danke.
Gruss |
| | | | |
| | | Meinst Du mit Geschwindigkeitsanzeige den Graphen? |
| | | | |
| | funkheld | Ich meine den Zahlenwert und die Grafik.
Gruss peter |
| | | | |
| | | Auf meinem Computer kann ich die Maus so schnell bewegen dass sogar 20 km/h
angezeigt werden. Wie groß ist Dein hWnd? Kann es sein das die von Dir genutzte
Maus einfach nicht schneller erfassen kann? |
| | | | |
| | funkheld | Ich habe jetzt mal : add tme&,200 eingestellt. Jetzt funktioniert es über 15Km/h.
Welchen Einfluss hat das eigentlich?
Gruss |
| | | | |
| | | Nach wievielen Millisekunden die Grafikprozedur ablaufen soll -
bei 100 also 10 mal pro Sekunde und bei 200 5 mal pro Sekunde. |
| | | | |
| | funkheld | Warum erhöht sich dann die Geschwindigkeit? Ist da irgendein Einfluss drin, wenn ich 200 eingebe?
Wie errechnest du die Geshwindigkeit?
Gruss |
| | | | |
|
AntwortenThemenoptionen | 24.338 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |