Seite 1 von 3

[Code] WinScreen_Mouse

Verfasst: 20.12.2006 19:41
von Kaeru Gaman
aus aktuellem anlass hier mal das Skelett für einen Mauszeiger im WindowedScreen,
inclusive Focus- und OffScreen-Handling

Code: Alles auswählen

;**************************************** 
;*** WinScreen_Mouse.pb
;***
;*** Skeleton for Mouse-Pointer Handling
;*** within a WindowedScreen.
;***
;*** by Kaeru Gaman, Dec.20th,2006
;*** PB Ver 4.02 Win
;**************************************** 

EnableExplicit

If Not InitSprite()
  MessageRequester("Error","No Sprite, Man!", #MB_ICONERROR)
  End
EndIf
If Not InitSound()
  MessageRequester("Error","No Sound, Man!", #MB_ICONERROR)
  End
EndIf
If Not InitKeyboard()
  MessageRequester("Error","No Keys, Man!", #MB_ICONERROR)
  End
EndIf
If Not OpenWindow(0, 0, 0, 800, 600, "WinScreen_Mouse" , #PB_Window_ScreenCentered | #PB_Window_MinimizeGadget )
  MessageRequester("Error","No Window, Man!", #MB_ICONERROR)
  End
EndIf
If Not OpenWindowedScreen(WindowID(0), 0, 0, 800, 600, 0,0,0 )
  MessageRequester("Error","No Screen, Man!", #MB_ICONERROR)
  End
EndIf

;*************************************
;**** Prepare Main
;*************************************

Define WinEventID.l

Define EXIT.l       = 0     ;Exit-Flag
Define MCur.l       = 0     ;Show/Hide Status MousePointer
Define Focus.l      = 1     ;Focus-Flag of Game-Window

Define MPOS.COORD           ;MousePos
Define MLC.l     = 0        ;Mouse LeftClick
Define MRC.l     = 0        ;Mouse RightClick

Define Col.l     = 0        ;Color for Action
;**************************************************************************
;**** M A I N - L O O P
;**************************************************************************
Repeat
  ExamineKeyboard()
  WinEventID   = WindowEvent()

;{*** Focus-Test ***
  If Not IsScreenActive()
  ;If GetFocus_()<>WindowID(0) 
    Focus = 0 
  Else 
    Focus = 1 
  EndIf
;}

;{*** Mouse Status ***
  If WindowMouseX(0)>=0 And Focus
    MPOS\X = WindowMouseX(0)
    MPOS\Y = WindowMouseY(0)
    MLC = GetAsyncKeyState_(#VK_LBUTTON)
    MRC = GetAsyncKeyState_(#VK_RBUTTON)
    If MCur = 0
      ShowCursor_(0)
      MCur = 1
    EndIf
  ElseIf MCur = 1
    ShowCursor_(1)
    MCur = 0
  EndIf
;}

;*****************************************************
;**** Focus-Check and NoFocus Display
;*****************************************************
If Not Focus
  ClearScreen($404040)
  StartDrawing(ScreenOutput())
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawText(100,100,"NoFocus",$C0C0C0)
  StopDrawing()
  Delay(100)
;*****************************************************
;**** Focus-Only 
;*****************************************************
Else
  ClearScreen($201008)

;{*** Action ***
  If KeyboardPushed(#PB_Key_Space) Or MLC Or MRC
    If MLC
      Col = $2010C0
    ElseIf MRC
      Col = $10C020
    Else
      Col = $808080
    EndIf
    StartDrawing(ScreenOutput())
      FrontColor(Col)
      Circle(MPOS\X,MPOS\Y,32)
    StopDrawing()
  EndIf
;}

;{*** Mouse-Pointer Display ***
  If MCur = 1
    StartDrawing(ScreenOutput())
      FrontColor($20C0C0)
      Line(MPOS\X   ,MPOS\Y   , 24, 16)
      Line(MPOS\X   ,MPOS\Y   , 16, 24)
      Line(MPOS\X+24,MPOS\Y+16,-16, -8)
      Line(MPOS\X+16,MPOS\Y+24, -8,-16)
    StopDrawing()
  EndIf
;}

;{*** Escape - Test ***
  If KeyboardPushed(#PB_Key_Escape)
    EXIT = 1
  EndIf
  If WinEventID = #PB_Event_CloseWindow : EXIT=1 : EndIf
;}

;*****************************************************
;**** E N D  of Focus-Only 
;*****************************************************
EndIf

;**************************************************************************
;**** M A I N - L O O P - E N D
;**************************************************************************
  FlipBuffers()
  Delay(0)
Until EXIT = 1
;*************************************
End
wenns irgendwo (PB4.02 for Windows) nicht läuft, bitte rückmeldung...
sollte wasserdicht sein...

[edit2]Fenstertitel korrigiert...
[edit3]typo korrigiert...

Re: [Code] WinScreen_Mouse

Verfasst: 20.12.2006 19:55
von a14xerus
Kaeru Gaman hat geschrieben:sollte wasserdicht sein...
Toll, und jetz is mein PC wegen dir Kaputt
Ne, also bei mir klappt alles :allright:

//exit wg TS:
Ich benutze WIN und noch PB 4.0, alles super

Verfasst: 20.12.2006 19:58
von ts-soft
>> wenns irgendwo nicht läuft, bitte rückmeldung... sollte wasserdicht sein...
Fehler über Fehler, Konstanten #MB_ICONERROR nicht bekannt, Structure
COORD nicht definiert usw.

Werde es später nochmal unter Windows testen, ich denke da gehts besser.

Verfasst: 20.12.2006 20:00
von Kaeru Gaman
@ts

:mrgreen: du blöder Scherzkeks... *knuff*

..ok.. ich spezifiziere das "irgendwo" mal genauer...

...außerdem steht PB4.02 im kommentarkopf....

Verfasst: 20.12.2006 20:51
von edel
Schreib noch rein das es nur unter Windows laeuft, dann halten
auch diese Linux-Juenger ihren Schnabel ... :roll:

Warum nutzt du eigentlich API ?

Verfasst: 20.12.2006 21:33
von Kaeru Gaman
> Warum nutzt du eigentlich API ?

öhm..
eine entsprechung von ShowCursor_() in reinem PB ist mir nicht bekannt...

und die lösung für die MausButtons über VK fand ich recht komfortabel,
geht ja auch, wenn man den fokus-check mit drin hat.

wenn man das über #WM_LButtonDown machen will,
fallen ja die buttons komplett aus dem Maus-Status raus,
und stehen in der Event-Bearbeitung...
kann auch sein, dass ich damit nicht so super zurechtgekommen bin...

...der code ist jetzt zusammengeklaubt aus nem älteren projekt,
weil ich nach gefragt worden war....

Verfasst: 20.12.2006 21:40
von edel
Machen die Funktionen ReleaseMouse und MouseButton(x) nicht genau das ?

Verfasst: 20.12.2006 21:45
von Kaeru Gaman
aber mit ReleaseMouse hab ich das problem, dass ich dann nicht einfach den
Fensterbereich verlassen kann um auf die kopfleiste des fenster zu gehen.

ich müsste dann einen randbereich definieren, dass der mauszeiger bereits
im letzten pixel vor dem rand umgeschaltet werden kann.
dieser 1pixel breite rand kann dann nicht ingame genutzt werden.

außerdem fällt dan auch die einfache abfrage per

Code: Alles auswählen

If WindowMouseX(0)>=0
flach, ich muss jeden rand abfragen.
zusätzlich kann es zu verzögerungen beim umschalten kommen.

so herum empfinde ich es als einfacher.

und da ich aufgrund von ShowCursor_() sowieso nicht komplett auf WinAPI verzichten kann,
kann ich es auch gleich richtig ausnutzen.

[edit;23:15]
hm.. nicht ganz.. ReleaseMouse versteckt den systemmauszeiger...
ok.. also, es ginge auch komplett ohne API...

nur leider besteht dann immernoch das problem,
dass es beim verlassen des screens zu verzögerungen käme.
und das wieder zurückkehren zum screen... hm...
IsScreenActive() und WindowMouseX() >= 0... ja ok, ginge...

Verfasst: 21.12.2006 07:24
von NNSoft
Was habt Ihr immer alle gegen die Api-Nutzung? Ist "geil" das Teil, Kaeru. :allright:

Verfasst: 21.12.2006 07:47
von ts-soft
>> Was habt Ihr immer alle gegen die Api-Nutzung?
Nichts, nur es läuft unter Linux nicht :mrgreen:
Für mich im moment die falsche API, macht aber nichts :wink: