Deutsch
Forum

Maus am Schwungrad vom Trimmrad: y-Mausposition setzen , abfragen und ausgeben überfordert

 
- 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
 
10.07.2012  
 



« 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&)
end

Wenn Du die add strecke Zeile dahin änderst:
KompilierenMarkierenSeparieren
add 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.

1.247 kB
Hochgeladen:10.07.2012
Ladeanzahl194
Herunterladen
 
10.07.2012  
 




RICOSCH
hat die platine auch die microtaster für 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 über dem schwungrad befestigt ist ?
 
I LOVE TOOLS
10.07.2012  
 



@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:
KompilierenMarkierenSeparieren
add 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.

1.247 kB
Hochgeladen:10.07.2012
Ladeanzahl194
Herunterladen
 
10.07.2012  
 




funkheld


und was soll eigendlich gezählt werden ? wohl nicht die anzahl der tritte ?
wenn es über 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
 
10.07.2012  
 



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 Gründen 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 könnte es helfen wenn Du mit einem "Getriebe" die letztendliche Rotationsgeschwindigkeit des Mausrades reduzierst)
 
10.07.2012  
 




funkheld
Hallo, dein Programm funktioniert schon wesentlich besser, Geschwindigkeit kann schon verdoppelt werden. Danke.

Gruss
 
10.07.2012  
 



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. ^^
 
10.07.2012  
 




funkheld
Jup, habe "Waitinput" rausgenommen und den Bildschirm vergrössert. und habe den Maussensor über 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 für etwas Grafisches

Frage:
Wie kann man jetzt da mal als Test in der Schleife irgendetwas Grafisches reinmachen für 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&)
end

125 kB
Hochgeladen:10.07.2012
Ladeanzahl91
Herunterladen
141 kB
Hochgeladen:10.07.2012
Ladeanzahl101
Herunterladen
 
10.07.2012  
 



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 anzeigen 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&)
end

72 kB
Hochgeladen:10.07.2012
Ladeanzahl86
Herunterladen
 
10.07.2012  
 




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
 
10.07.2012  
 



Na weil die Zeit weiterläuft aber die Strecke gleich bleibt -

ist halt "Durchschnittsgeschwindigkeit " und nicht die aktuelle Tretgeschwindigkeit.
 
10.07.2012  
 




funkheld
Hmm.., wie kann man eigentlich die Geschwindigkeit ermitteln, so ungefähr?

Gruss
 
10.07.2012  
 




Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

26.045 Betrachtungen

Unbenanntvor 0 min.
Ralf Netz22.05.2021
Heltal23.01.2015
Jochen Roxlau04.10.2014
Julian Schmidt22.06.2013
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

funkheld (16x)
iF (15x)
RICOSCH (1x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie