Code : Tout sélectionner
;****************************************************************
; Program: WindowedScreen + GUI Eventhandling Demo
; Author: netmaestro
; Date: March 22, 2007
; License: Free, unrestricted, credit appreciated
; but not required
;****************************************************************
; changed by LJ on 8.7.2008, trying to make it run on Linux
; Ajout Mesa
Declare CreaCurseur()
Declare _2DStarfield()
If InitSprite()=0:MessageRequester("Oops!","Video could not be initialized, quitting!"):End:EndIf
If InitKeyboard()=0:MessageRequester("Oops!","Keyboard could not be initialized, quitting!"):End:EndIf
If InitMouse()=0:MessageRequester("Oops!","Mouse could not be initialized, quitting!"):End:EndIf
Enumeration Souris
#CURSEUR
EndEnumeration
#ScreenW=640 ; résolution x de l'écran
#ScreenH=480 ; résolution y de l'écran
#numstars=128; nombre d'étoiles par plan
#starplan=3 ; nombre de plans
Structure StarVars
star_x.l
star_y.l
star_speed.F
star_colour.l
EndStructure
Global Dim Stars.StarVars(#starplan,#numstars)
Global MX, MY
Procedure.i GestionAltTab()
ReleaseMouse(#True)
CloseScreen ()
OpenWindow (1,1,1,1,1, "Starfield" , #PB_Window_Minimize )
Repeat
Ev= WaitWindowEvent(1)
Until Ev= #PB_Event_ActivateWindow
CloseWindow (1)
; Il faut tout refaire
OpenScreen(#ScreenW,#ScreenH,32,"Starfield",#PB_Screen_WaitSynchronization,60)
CreaCurseur()
_2DStarfield()
ReleaseMouse(#False)
ProcedureReturn #True
EndProcedure
; Il vaut mieux placer les procédures avant l'ouverture de la fenêtre
Procedure _2DStarfield()
For S=1 To #starplan
For F=0 To #numstars-1
Stars(S,F)\star_x=Random(#ScreenW)
Stars(S,F)\star_y=Random(480,0)
Next F
Next S
For F=0 To #numstars-1
Stars(1,F)\star_speed=3 : Stars(1,F)\star_colour=RGB(64,64,64)
Stars(2,F)\star_speed=4 : Stars(2,F)\star_colour=RGB(128,128,128)
Stars(3,F)\star_speed=5 : Stars(3,F)\star_colour=RGB(255,255,255)
Next F
EndProcedure
Procedure CreaCurseur()
CreateSprite(#CURSEUR,5,5,#PB_Sprite_AlphaBlending)
StartDrawing(SpriteOutput(#CURSEUR))
Box(0,0,5,5,$FFFFFF)
StopDrawing()
EndProcedure
Procedure ShowCurseur()
DisplaySprite(#CURSEUR,MX,MY)
EndProcedure
;Marge autour du screen
#LeftOffset = 20
#TopOffset = 20
;***********************
Global FS=0
;***********************
If FS=0
OpenWindow(0,0,0,#ScreenW,#ScreenH,"Starfield",#PB_Window_ScreenCentered|#PB_Window_WindowCentered|#PB_Window_SystemMenu)
OpenWindowedScreen(WindowID(0),0,0,#ScreenW,#ScreenH)
CreaCurseur()
Else
OpenScreen(#ScreenW,#ScreenH,32,"Starfield",#PB_Screen_WaitSynchronization,60)
CreaCurseur()
EndIf
_2DStarfield() ; creation du starfield
Procedure bouge2DStarfield(inscreen)
ClearScreen(0)
;
; Display your screen stuff
StartDrawing(ScreenOutput())
For S=1 To #starplan
For F=0 To #numstars-1
Box(Stars(S,F)\star_x,Stars(S,F)\star_y,1,1,Stars(S,F)\star_colour)
Stars(S,F)\star_x-Stars(S,F)\star_speed
If Stars(S,F)\star_x<=0:Stars(S,F)\star_x=#ScreenW:EndIf
Next F
Next S
StopDrawing()
;
If inscreen Or FS=1
ExamineMouse()
StartDrawing(ScreenOutput())
DrawText(250,200," Souris capturée ",#Yellow, #Black)
DrawText(260,230,"( "+RSet(Str(MouseX()),3,"0")+", "+RSet(Str(MouseY()),3,"0")+" )",#White,#Black)
If MouseButton(#PB_MouseButton_Left)
Debug "clic left"
EndIf
If MouseButton(#PB_MouseButton_Middle)
Debug "clic Middle"
EndIf
If MouseButton(#PB_MouseButton_Right)
Debug "clic Right"
EndIf
StopDrawing()
DisplaySprite(0,MouseX(),MouseY())
EndIf
EndProcedure
Repeat
If inscreen
If MouseX()>#ScreenW-2 Or MouseY()>#ScreenH-2 Or MouseX()<1 Or MouseY()<1
ReleaseMouse(1); La souris est libérée de l'écran
inscreen = #False
EndIf
Else
If FS=0
Repeat
;Gestion des évènements de la fenêtre
;====================================
;Essayez les 3 possibilités mais une seule à la fois
Ev = WindowEvent() ; Animation
;Ev = WaitWindowEvent() ; Blocage de l'animation
;Ev = WaitWindowEvent(1) ; Animation mais délai d'1 ms inutile et de plus c'est une mauvaise
; façon de programmer car la pile des évènements n'est pas vidée
;Attention, si la fenêtre devait avoir des gadgets (buttongadget,...), il faudrait utiliser une autre façon de faire avec WaitWindowEvent(). VOir l'aide de WaitWindowEvent()
Select Ev
Case #PB_Event_CloseWindow
End
EndSelect
Until Ev=0
mx = WindowMouseX(0):my = WindowMouseY(0)
If Bool(mx < #ScreenW+#LeftOffset And mx > #LeftOffset And my > #TopOffset And my < #TopOffset+#ScreenH)
ReleaseMouse(0) ;La souris est capturée dans l'écran
MouseLocate(mx-#LeftOffset,my-#TopOffset)
inscreen = #True
EndIf
EndIf
EndIf
bouge2DStarfield(inscreen)
FlipBuffers()
If IsScreenActive() = 0
If FS=1
GestionAltTab()
Else
SetWindowState(0, #PB_Window_Minimize)
EndIf
EndIf
ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
M.