Also man kann mit meinen Funktionen die Mausgeschwindigkeit festlegen, den Bewegungsbereich der Maus festlegen, Mausgrafik festlegen, und erweiterte Mausbutton funktionen, welche überprüfen z.B. überprüfen, ob Maus vom drücken LOSGELASSEN wurde. Dneke, das ist schon recht nützlich.
Wenn jemand verbesserte Funktionen ur Mausteuerung im Screen braucht:
Mausfunktionen:
Code: Alles auswählen
;/**************************************************
;Dateiname: inc_mouse.pb
;Autor: Baptist Piest
;Beschreibung: Enthält Befehle zur Maussteuerung
; im Screen
;***************************************************/
;/*Pendant zu RECT, nur statt left /top/buttom usw. wird x, y, width, height benutzt
Structure _RECT
x.l
y.l
Width.l
Height.l
EndStructure
;*/
;/*Speichert Eigenschaften einer Maus
Structure mouse
MouseFaktorX.l ;Speichert den Bewegungsfaktor auf der X-Achse
MouseFaktorY.l ;Speichert den Bewegungsfaktor auf der Y-Achse
MouseX.l ;Speichert die X-Position
MouseY.l ;Speichert die Y-Position
Area._RECT ;Speichert das Gebiet, indem sich die Maus bewegen darf
Sprite.l ;Handle auf das Sprite für dden Mauszeiger
EndStructure
;*/
;/*Funktionsprototypen
Declare.b MouseStatus()
Declare.b MouseButtonEx(button.l)
Declare SetMouseFaktorX(iFaktor.l)
Declare SetMouseFaktorY(iFaktor.l)
Declare.l GetMouseFaktorX()
Declare.l GetMouseFaktorY()
Declare MouseLocateEx(y.l,x.l)
Declare.l MouseXEx()
Declare.l MouseYEx()
Declare SetMouseArea(*Area._RECT)
Declare GetMouseArea(*Buffer._RECT)
Declare.b MouseIsOverArea(x.l,y.l,iWidth.l,iHeight.l)
Declare SetMouseSprite(hSprite.l)
Declare.l GetMouseSprite()
;*/
;Globale Variable, welche Funktionsübergreifend die Eigenschaften der Maus enthält
Global __MYMOUSE.mouse
__MYMOUSE\Sprite=-1 ;Kein Sprite für den Anfang benutzen
Dim __MOUSEBUTTONSTATUS(1) ;Speichert Mousebuttonstati
;MouseStatus()
;Statt ExamineMouse() zu benutzen, benötigt für eigene Funktionen.
;Muss vor Aufruf vor allen Mausbefehlen aufgerufen werden.
;Aktualisiert die Mauskoordinaten und die MouseButton-Routinen
;Sollte direkt vor FlipBuffers() stehen für den gewünschten Effekt,
;da auch Mauszeiger mit angezeigt wird, wenn angegeben.
;--------------------------------------------------------------------
;Rückgabewert: Gibt 0 zurück, wenn Maus nicht aktualisiert werden kann.
Procedure.b MouseStatus()
_Return=ExamineMouse()
;Positionsvariablen mit Werten belegen
__MYMOUSE\MouseX=__MYMOUSE\MouseX+MouseDeltaX()*GetMouseFaktorX()
__MYMOUSE\MouseY=__MYMOUSE\MouseY+MouseDeltaY()*GetMouseFaktorY()
;Sicherstellen, dass Maus nicht über das erlaubte Areal hinausgehen kann
If __MYMOUSE\MouseX <= __MYMOUSE\Area\x
__MYMOUSE\MouseX = __MYMOUSE\Area\x
ElseIf __MYMOUSE\MouseX >= __MYMOUSE\Area\x+__MYMOUSE\Area\Width
__MYMOUSE\MouseX = __MYMOUSE\Area\x+__MYMOUSE\Area\Width
EndIf
If __MYMOUSE\MouseY <= __MYMOUSE\Area\y
__MYMOUSE\MouseY = __MYMOUSE\Area\y
ElseIf __MYMOUSE\MouseY >= __MYMOUSE\Area\y+__MYMOUSE\Area\Height
__MYMOUSE\MouseY = __MYMOUSE\Area\y+__MYMOUSE\Area\Height
EndIf
;Mousebutton abfragen, kein Comment
For i=0 To 1
If __MOUSEBUTTONSTATUS(i) = 2
__MOUSEBUTTONSTATUS(i) = 0
EndIf
If __MOUSEBUTTONSTATUS(i) = 0
If MouseButton(i+1)
__MOUSEBUTTONSTATUS(i) = 1
EndIf
ElseIf __MOUSEBUTTONSTATUS(i) = 1
If MouseButton(1+i) = 0
__MOUSEBUTTONSTATUS(i) = 2
EndIf
EndIf
Next
;Mousesprite anzeigen
If __MYMOUSE\Sprite>-1
DisplayTransparentSprite(__MYMOUSE\Sprite,__MYMOUSE\MouseX,__MYMOUSE\MouseY)
EndIf
;Gibt zurück, ob ExamineMouse() geklappt hatte
ProcedureReturn _Return
EndProcedure
;MouseButtonEx(button.l)
;Gibt zurück, ob Maustaste gedrückt,
;losgelassen, oder nicht gedrückt wird.
;Muss nach MouseStatus() aufgerufen werden.
;--------------------------------------
;button.l Gibt die Mausbutton ID an:
; 1=linker Button
; 2=rechter Button
;Rückgabewert: Byte.
; 0, wenn angegebener Button nicht gedrückt wird.
; 1, wenn angegebener Button gerade gedrückt wird.
; 2, wenn angegebener Button gerade losgelassen wird.
Procedure.b MouseButtonEx(button.l)
;Owerflows verhindern
If button<1 : button=1
ElseIf button>2 : button=2
EndIf
button-1 ;weil Array die Elemente 0 und 1 hat,
;und nicht 1 und 2.
;Wert von __MOUSEBUTTONSTATUS(button) zurückgeben.
ProcedureReturn __MOUSEBUTTONSTATUS(button)
EndProcedure
;SetMouseSprite(hSprite.l)
;Setzt das Sprite für den Mauscursor
;Wenn Man keinen Cursor haben möchte,
;gibt man als Argument -1 an.
;------------------------------------
;hSprite.l Handle auf das Sprite
;Rückgabewert: void
Procedure SetMouseSprite(hSprite.l)
__MYMOUSE\Sprite=hSprite
If hSprite<0 ;Wenn kleiner 0 ist, nehme -1 als ID
__MYMOUSE\Sprite=-1
EndIf
EndProcedure
;GetMouseSprite()
;Gibt das Handle auf das Sprite des
;Mauszeigers zurück. Wenn kein Sprite
;angezeigt wird, gibt die Funktion -1
;zurück.
;------------------------------------
;Rückgabewert: SpriteHandle
Procedure.l GetMouseSprite()
ProcedureReturn __MYMOUSE\Sprite
EndProcedure
;GetMouseFaktorX()
;Gibt den Bewegungsfaktor der Maus
;auf der X-Achse des Bildschirms zurück
;Muss nach MouseStatus() aufgerufen werden.
;--------------------------------------
;Rückgabewert: long, X-Faktor
Procedure.l GetMouseFaktorX()
ProcedureReturn __MYMOUSE\MouseFaktorX
EndProcedure
;GetMouseFaktorY()
;Gibt den Bewegungsfaktor der Maus
;auf der Y-Achse des Bildschirms zurück
;Muss nach MouseStatus() aufgerufen werden.
;--------------------------------------
;Rückgabewert: long, Y-Faktor
Procedure.l GetMouseFaktorY()
ProcedureReturn __MYMOUSE\MouseFaktorY
EndProcedure
;MouseLocateEx(y.l,x.l)
;Setzt die Mausposition auf dem Bildschirm
;------------------------------------------
;x.l Parameter, der die y-Position festlegt
;y.l Parameter, der die x-Position festlegt
;Rückgabewert: void
Procedure MouseLocateEx(y.l,x.l)
__MYMOUSE\Mousex=x
__MYMOUSE\Mousey=y
EndProcedure
;MouseXEx()
;Gibt die X-Position der Maus zurück
;Muss nach MouseStatus() aufgerufen werden.
;-----------------------------------
;Rückgabewert: long, X-Position
Procedure.l MouseXEx()
ProcedureReturn __MYMOUSE\MouseX
EndProcedure
;MouseYEx()
;Gibt die Y-Position der Maus zurück
;Muss nach MouseStatus() aufgerufen werden.
;-----------------------------------
;Rückgabewert: long, Y-Position
Procedure.l MouseYEx()
ProcedureReturn __MYMOUSE\MouseY
EndProcedure
;SetMouseFaktorX(iFaktor.l)
;Setzt den Bewegungsfaktor der Maus
;auf der X-Achse des Bildschirms.
;Muss nach MouseStatus() aufgerufen werden.
;------------------------------------------
;iFaktor.l Parameter, der den Faktor festlegt
;Rückgabewert: void
Procedure SetMouseFaktorX(iFaktor.l)
__MYMOUSE\MouseFaktorX=iFaktor
EndProcedure
;SetMouseFaktorY(iFaktor.l)
;Setzt den Bewegungsfaktor der Maus
;auf der Y-Achse des Bildschirms.
;Muss nach MouseStatus() aufgerufen werden.
;------------------------------------------
;iFaktor.l Parameter, der den Faktor festlegt
;Rückgabewert: void
Procedure SetMouseFaktorY(iFaktor.l)
__MYMOUSE\MouseFaktorY=iFaktor
EndProcedure
;SetMouseArea(*Area._RECT)
;Füllt die Struktur der Maus mit den Werten
;der angegenen Struktur Area._RECT aus.
;------------------------------------------
;*Area._RECT Parameter, der die Speicheradresse
; der Variable enthält, aus welcher
; der erlaubte Bereich der Mausbewegung
; ausgelesen wird.
;Rückgabewert: void
Procedure SetMouseArea(*Area._RECT)
__MYMOUSE\Area\x = *Area\x
__MYMOUSE\Area\y = *Area\y
__MYMOUSE\Area\Width = *Area\Width
__MYMOUSE\Area\Height = *Area\Height
EndProcedure
;GetMouseArea(*Buffer._RECT)
;Füllt die angegebene Variable Buffer mit
;den Eigenschaften
;des erlaubten Mausgebiets.
;----------------------------------------
;*Buffer._RECT Parameter, der die Speicheradresse
; der Variablen enthält, welche mit Werten gefüllt
; werden soll
;Rückgabewert: void
Procedure GetMouseArea(*Buffer._RECT)
*Buffer=@__MYMOUSE\Area
EndProcedure
;MouseIsOverArea(x.l,y.l,iWidth.l,iHeight.l)
;Berechnet, ob sich Maus innerhalb der angegebenen
;Koordinaten befindet.
;Muss nach MouseStatus() aufgerufen werden.
;---------------------------------------------------
;x.l Parameter, der die X-Position festlegt
;y.l Parameter, der die Y-Position festlegt
;iWidth.l Parameter, der die Breite des Gebiets festlegt
;iHeight.l Parameter, der die Höhe des Gebiets festlegt
;Rückgabewert: byte; 1, wenn sich Maus innerhalbd er Koordinaten befindet,
; andernfalls 0.
Procedure.b MouseIsOverArea(x.l,y.l,iWidth.l,iHeight.l)
If MouseXEx()>=x And MouseYEx()>=y And MouseXEx()<=x+iWidth And MouseYEx()<=y+iHeight
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
Man speichert einfach den obigen Code als inc_mouse.pb ab, und das folgende Programm im selben Ordner abspeichern:
Code: Alles auswählen
InitSprite()
InitMouse()
InitKeyboard()
XIncludeFile "inc_mouse.pb"
Screenwidth=1024
Screenheight=768
OpenScreen(Screenwidth,Screenheight,32,"")
;Sprite erstellen für den Mauszeiger
CreateSprite(0,16,16)
StartDrawing(SpriteOutput(0))
LineXY(0,0,15,15,RGB(255,255,0))
StopDrawing()
;Sprite als Mauszeiger verwenden
;Wenn man keinen Mauszeiger haben will, gibt man -1 an.
;Sonst die ID des Sprites
SetMouseSprite(0)
;"Gültigkeitsbereich" der Maus festlegen
Area._RECT
Area\x=300
Area\y=0
Area\Width=500
Area\Height=500
SetMouseArea(@Area)
;Mausgeschwindigkeit festlegen(minuswerte wird bewegung umgedreht, bei NULL keine Bewegung)
faktorx=1
faktory=1
SetMouseFaktorX(faktorx)
SetMouseFaktorY(faktory)
;Fonts laden für schönere Darstellung
LoadFont(0,"Arial",20,#PB_FONT_ITALIC)
LoadFont(1,"Arial",13,#PB_FONT_BOLD)
Repeat
ExamineKeyboard()
ClearScreen(0,0,0)
;Text anzeigen
;---------------------------
StartDrawing(ScreenOutput())
Box(Area\x,Area\y,Area\Width,Area\Height,RGB(100,100,100))
FrontColor(255,255,255)
DrawingMode(1)
DrawingFont(UseFont(0))
x=Screenwidth/2-TextLength("Maus - Funktionen")/2
Locate(x,Screenheight/2-100) : DrawText("Maus - Funktionen")
DrawingFont(UseFont(1))
Locate(0,0) : DrawText("MouseButtonEx(1): "+Str(MouseButtonEx(1)))
Locate(0,20): DrawText("MouseButtonEx(2): "+Str(MouseButtonEx(2)))
Locate(0,60): DrawText("Zur Demonstration der MouseBUTTON funktionen:")
Locate(0,80): DrawText("Hält man beide Maustasten gedrückt, und lässt dann die Linke los")
Locate(0,100):DrawText("Während die rechte noch gedrückt bleibt, wird das Programm beendet.")
Locate(200,0) : DrawText("MouseXEx(): "+Str(MouseXEx()))
Locate(200,20) : DrawText("MouseYEx(): "+Str(MouseYEx()))
Locate(x,Screenheight/2-70) : DrawText("Mouse-SpeedX [1/2]: ")
Locate(x,Screenheight/2-55) : DrawText("Mouse-SpeedY [3/4]: ")
Locate(x,Screenheight/2-40) : DrawText("AreaX [q/w]: ")
Locate(x,Screenheight/2-25) : DrawText("AreaY [e/r]: ")
Locate(x,Screenheight/2-10) : DrawText("AreaWidth [a/s]: ")
Locate(x,Screenheight/2+05) : DrawText("AreaHeight [d/f]: ")
Locate(x+200,Screenheight/2-70) : DrawText(Str(faktorx))
Locate(x+200,Screenheight/2-55) : DrawText(Str(faktory))
Locate(x+200,Screenheight/2-40) : DrawText(Str(Area\x))
Locate(x+200,Screenheight/2-25) : DrawText(Str(Area\y))
Locate(x+200,Screenheight/2-10) : DrawText(Str(Area\Width))
Locate(x+200,Screenheight/2+05) : DrawText(Str(Area\Height))
StopDrawing()
;---------------------------
;Mausgeschwindigkeitstasten überprüfen
If KeyboardReleased(#PB_KEY_1) : faktorx+1 : EndIf
If KeyboardReleased(#PB_KEY_2) : faktorx-1 : EndIf
If KeyboardReleased(#PB_KEY_3) : faktory+1 : EndIf
If KeyboardReleased(#PB_KEY_4) : faktory-1 : EndIf
SetMouseFaktorX(faktorx)
SetMouseFaktorY(faktory)
;Mausarea-Tasten überprüfen
If KeyboardPushed(#PB_KEY_ALL)
If KeyboardPushed(#PB_KEY_q) : Area\x+1 : EndIf
If KeyboardPushed(#PB_KEY_w) : Area\x-1 : EndIf
If KeyboardPushed(#PB_KEY_e) : Area\y+1 : EndIf
If KeyboardPushed(#PB_KEY_r) : Area\y-1 : EndIf
If KeyboardPushed(#PB_KEY_a) : Area\Width+1 : EndIf
If KeyboardPushed(#PB_KEY_s) : Area\Width-1 : EndIf
If KeyboardPushed(#PB_KEY_d) : Area\Height+1 : EndIf
If KeyboardPushed(#PB_KEY_f) : Area\Height-1 : EndIf
SetMouseArea(@Area)
EndIf
;Sollte vor FlipBuffers() aufgerufen werden, weil Mauszeiger
;durch diese Funktion zusätzlich angezeigt wird.
MouseStatus()
FlipBuffers()
Until KeyboardPushed(1) Or (MouseButtonEx(1)=2 And MouseButtonEx(2)=1)