| |
|
|
- 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 |
|
|
| |
|
|
|
« 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. |
|
|
| |
|
|
|
|
| |
|
- Seite 2 - |
|
| 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. |
|
|
| |
|
|
| |
|
- Seite 3 - |
|
|
funkheld | Warum erhöht sich dann die Geschwindigkeit? Ist da irgendein Einfluss drin, wenn ich 200 eingebe?
Wie errechnest du die Geshwindigkeit?
Gruss |
|
|
| |
|
|
|
| Na es gibt doch strecke& und alle X ms merke ich in tmp& strecke& und damit ist klar wieviel strecke in der Zeit gemacht wurde. Wenn Du nur 5 mal statt 10 mal pro Sekunde rechnest dann kann doppelt so viel Strecke in der Zeit gemacht werden aber die Kalkulation dürfte dann nicht mehr stimmen da auf 100 ms abgestimmt.
Wenn Du alle 200 statt 100 ms rechnest dann müsstest Geschwindigkeit durch 2 nehmen. |
|
|
| |
|
|
|
funkheld | Ach so...., danke für den Hinweiss.
Eine Grafische spielerei: Du hast doch schon viele Sachen in Opengl programmiert. Ich möchte mal eine Geländeplatte ohne Höhen und Tiefen mit Spritebäumen unendlich bewegen, je nach dem wie schnell man in die Pedale tritt.
Wie kann man das realiseren ?
Gruss peter |
|
|
| |
|
|
|
| Ich würde empfehlen das erstmal separat von diesem Programm hier zu realisieren und
das in einem eigenen Thema zu behandeln. |
|
|
| |
|
|
|
funkheld | Hallo, guten Tag. Ich habe ein Programm, wo sich ein Ogl-Sprite je nach Tretgeschwindikeit von unten nach oben bewegt, bis zu der Geschwindigkeit wo das Dateneinlesen der Lasermaus aussetzt. Die Steigerung der Geschwindigkeit ist nicht so deutlich erkennbar beim Sprite. Wie kann man es hier jetzt im Programm pro Zeiteiheit so messen, das beim schnelleren Treten eine deutliche erkennbare Bewegung des Sprites erkennbar ist. Es kommt jetzt nicht auf die genaue Geschwindigkeit an, sondern es kommt jetzt auf die Bewegung des Sprites an.
Danke.
Gruss KompilierenMarkierenSeparieren {$cleq}
declare hWin&,hintergrpic&,vordergrpic&
declare ende&,winkel!,groesse&,dib&,array&
declare bild_auto&,tex.auto&
declare bmi#,ogl_rgb#
declare x1!,y1!,dx!,dy!
declare bereich#
Dim Bereich#, 16
Def &GL_BGR $80E0
DEF CreateDIB(2) !"dib","CreateDIB"
DEF FreeDIB(1) !"dib","FreeDIB"
DEF DrawDIB(4) !"dib","DrawDIB"
DEF CloneDIB(1) !"dib","CloneDIB"
dib&=usedll("dib.dll")
hintergrpic& = create("hNewPic", 400,700,rgb(255,255,0))
vordergrpic& = create("hNewPic", 400,700,rgb(255,255,0))
bild_auto& = create("hNewPic", 128,128,rgb(255,255,0))
array&=CreateDIB(128,128)
groesse&=128*128*4
dim ogl_rgb#,groesse&
Window 20,20-800,800
Cls @RGB(220,220,220)
hWin& = @Create("text", %hWnd, "Test1", 10, 10, 128,128)
oGL("Init", hwin&, 0,0, 0, 0)
oGL("PosMode", 1)
ogl("glReadBuffer",~GL_Back)
tex.auto&=oGL("LoadTextureBMP","data\\auto.bmp",1)
drawglscene
ende&=1
winkel!=90
dx!=100
dy!=600
WHILE ende&
getCursorPos(bereich#)
if long(bereich#,4) > 700
setCursorPos(100,0)
y1!=Sin(-(winkel!)/180.0*pi())*2
x1!=Cos(-(winkel!)/180.0*pi())*2
dx!=dx!+x1!
dy!=dy!+y1!
if dy! < 0.0
dy!=600
endif
endif
if isKey(81)
winkel!=winkel!+1.0
endif
if isKey(69)
winkel!=winkel!-1.0
endif
drawglscene
ENDWHILE
end
proc drawglscene
OGL("Clear")
OGL("origin",0,0,-1.11)
OGL("texture",tex.auto&,1)
OGL("rotate",0,0,winkel!)
OGL("quad",0.5,0.5)
OGL("show")
ogl("glReadPixels",0,0,128,128,&GL_BGR,~GL_UNSIGNED_BYTE,ogl_rgb#)
~setDIBits(%hdc,bild_auto&,0,128,ogl_rgb#,array&,0)
StartPaint vordergrpic&
DrawPic hintergrpic&,0,0;0
drawpic bild_auto&,dx!,dy!;-1
endpaint
DrawPic vordergrpic&, 300,5;0
endproc
|
|
|
| |
|
|
|
| Imho fehlen Dateien wie z.B.:
|
|
|
| |
|
|
|
funkheld | Hallo,ich habe die DIB hier aus dem Forum. Habe sie jetzt drangehängt.
Vielleicht könnte man ja auch ein 2D-Hintergrund herstellen ohne Opengl, der sich je nach Geschwindigkeit bewegt und im Vordergrund eine Fahrradfahrer-Bmp.
Gruss |
|
|
| |
|
|
|
| Das ist ja alles ganz einfach.
Was ist hiermit? [...] |
|
|
| |
|
|
|
funkheld | Jup, es ist jetzt gelöst mit deinem Programm.
Danke.
Gruss |
|
|
| |
|
|