Seite 1 von 1

Mausfunktionen

Verfasst: 11.09.2004 13:46
von RolandIV
Ich hab mir mal die Mühe gemacht, und einige Mausfunktionen für den Screen geschrieben, die den Umgang mit ihr vereinfachen.
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
Und hier eine Demonstration der Funktionen.
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)

Verfasst: 10.10.2005 00:37
von AND51
Hallo!

Sorry, dass ich erst jetzt schreibe, aber ich habe diesen Beitrag erst jetzt gesehen!

ich muss sagen, ich bin (noch) Anfänger in PB und kann daher diesen code gut gebrauchen. Meine fragen:
Darf ich ihn überall einsetzen, ohne deinen namen hinzusetzen zu müssen? Ich will mir um gottes Willen *NICHT* dein Werk aneignen - oh nein! Aber trotzdem mal so nur ne frage.

Meine 2. Frage: Könntest du mal eine Hilfe erstellen, mit allen "Befehlen", die es gibt, welche Parameter man ihnen übergeben muss und ob amn vor den befehlen noch irgendetwas aufrufen muss?

Muss keine Seitenlange Dokumentation sein, aber schon so dass auch Anfänger wie ich das möglichst alles verstehen... DANKE!

Gruß, André

P.S.: Nochmal ein Lob von mir, dieser Code ist gut!

Verfasst: 23.11.2005 21:07
von Nero
Ich schließe mich da mal AND51 an den es würde mich auch interessieren.