| |
|
|
- Page 1 - |
|
funkheld | Hallo, guten Tag. Ich habe ein kombinationsproblem mit der Maus.
Ich habe circa 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 |
|
|
| |
|
|
|
« Dieser Beitrag wurde als Lösung gekennzeichnet. » |
|
| @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&)
f='./../../funktionsreferenzen/xprofan/end/'>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. |
|
|
| |
|
|
|
|
RICOSCH | hat die platine auch die microtaster per rechte und linke maustaste ? ich würde lieber auf diese tasten setzen !
und was soll eigendlich gezählt werden ? wohl nicht die anzahl der tritte ? wenn es circa dem schwungrad befestigt ist ? |
|
|
| |
|
|
|
| @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&)
f='./../../funktionsreferenzen/xprofan/end/'>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. |
|
|
| |
|
|
|
funkheld |
und was soll eigendlich gezählt werden ? wohl nicht die anzahl der tritte ? wenn es circa dem schwungrad befestigt ist ?
Ich zähl die Mausschritte. Bis zu einer bestimmten Geschwindigkeit funktioniert es, danach wird fast garnicht gezählt, wenn ich wieder etwas langsamer werde, zählt es wieder.
Gruss |
|
|
| |
|
|
|
| funkheld (10.07.12)
Bis zu einer bestimmten Geschwindigkeit funktioniert es, danach wird fast garnicht gezählt, wenn ich wieder etwas langsamer werde, zählt es wieder.
Bezieht sich das auf meinen Quelltext?
Wenn ja, dann ist dies imho aus mindestens diesen 2 Stabilire vorstellbar:
+ die Schrittweite pro "Frame" ist größer als das Fenster (probiere mal windowstyle 80 und window (maxx-100),(maxy-100) - also größeres Fenster)
+ der Chip auf der Maus ist nicht schnell genug bzw. die abtast-Frequenz zu niedrig (hier potuto es helfen wenn Du mit einem "Getriebe" die letztendliche Rotationsgeschwindigkeit des Mausrades reduzierst) |
|
|
| |
|
|
|
funkheld | Hallo, dein Programm funktioniert schon wesentlich besser, Geschwindigkeit kann schon verdoppelt werden. Danke.
Gruss |
|
|
| |
|
|
|
| Noch "schneller" könntest halt wenn Du das Fenster vergrößert und wenn das noch nicht reicht dann halt das WaitInput 10 auskommentieren und wenn das dann immer noch nicht reicht dann einfach nochmal melden. ^^ |
|
|
| |
|
|
|
funkheld | Jup, habe "Waitinput" rausgenommen und den Bildschirm vergrössert. und habe den Maussensor circa den Treibriemen gesetzt, weil das Rad langsamer dreht als das Schwungrad. Funktioniert wunderbar mit deinem Programm. Ich glaube dadurch ist auch wieder mehr spielraum in der Schleife per etwas Grafisches
Frage: Wie kann man jetzt da mal als Test in der Schleife irgendetwas Grafisches reinmachen per die Optik?
Danke.
Gruss KompilierenMarkierenSeparieren {$cleq}
Windowstyle 31
Windowtitle "Cursorposition ermitteln"
window (maxx-500),(maxy-100)
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
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&)
='./../../funktionsreferenzen/xprofan/end/'>end
|
|
|
| |
|
|
|
| Hehe sehr cool -
als ich 16 war (vor 17 Jahren ^^) hatte ich das mit einer normalen Kugelmaus ganz ähnlich gemacht -
mein Radl hatte solch analog-Tacho das von einer einfachen Drahtwelle angetrieben wurde -
diese Welle hatte ich mit einer Maus-Achse verbunden.
Etwas Mostra kannst Du beliebig -
da gibts auch viele Wege das mit XProfan umzusetzen.
Ein Beispiel: KompilierenMarkierenSeparieren {$cleq}
{$notmp}
{$compiler c:\xprofan12}
{$runtime c:\xprofan12}
decimals 2
Windowstyle 31
Windowtitle "Cursorposition ermitteln"
window (maxx-500),(maxy-100)
setcursorpos((winRight-winLeft)\2+winLeft,(winBottom-winTop)\2+winTop)
var speed!=0
var tmp&=0
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!=((strecke&-tmp&)*0.03)*0.01+speed!*0.99
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$((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.:"
copybmp 1,240 - 640,240 > 0,240;0
setpixel 638,479-speed!,$FFFFFF
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&ss=s2>)
end
|
|
|
| |
|
|
|
funkheld | He, dein Grafikprogramm funktioniert schon prima mit meiner Maus am Trimmrad. Danke.
Muss jetzt nur mal schauen ,warum die Durchschnittsgeschwindigkeit so langsam auf "0" runtergeht , wenn ich aufhöre zu treten.
Gruss |
|
|
| |
|
|
|
| Na weil die Zeit weiterläuft aber die Strecke gleich bleibt -
ist halt "Durchschnittsgeschwindigkeit " und nicht die aktuelle Tretgeschwindigkeit. |
|
|
| |
|
|
|
funkheld | Hmm.., wie kann man eigentlich die Geschwindigkeit ermitteln, so ungefähr?
Gruss |
|
|
| |
|
|