malgres ralentissement volontaire ..
Code : Tout sélectionner
Enumeration
#win
#sprite_pluie
#sprite_eclair
#police
EndEnumeration
; ***********************************
Declare.f RotationX(x, angle.f, dist)
Declare.f RotationY(y, angle.f, dist)
Declare.s arc(x.s,y.s,niv)
Structure pluie
x.i
y.i
pas.i
EndStructure
Global Dim pluie.pluie(500)
Structure eclair
x.i
y.i
EndStructure
Global Dim eclair.eclair(1)
Resultat = InitSprite()
FontID = LoadFont(#Police, "arial", 50, #PB_Font_Bold )
ExamineDesktops()
EcranX =DesktopWidth(0);=largeur de l'ecran
EcranY = DesktopHeight(0):;=hauteur de l'ecran
x1=EcranX/2
y1=10
; ********* prepare la puie ****************
For i=0 to 500-1
pluie(i)\x.i=Random(EcranX)
pluie(i)\y.i=Random(EcranY)
pluie(i)\pas.i=Random(30,10)
Next i
; ***************************************
; ********* prepare les eclairs****************
For i=0 to 1
eclair(i)\x.i=0; Random(EcranX)
eclair(i)\y.i=0; Random(EcranY)
Next i
; ***************************************
WindowID = OpenWindow(#win, 0, 0, Ecranx,Ecrany, "click bouton droit pour quitter", #PB_Window_BorderLess |#PB_Window_ScreenCentered )
InitKeyboard()
WindowID = WindowID(#win)
Result = OpenWindowedScreen(WindowID,0,0, EcranX, EcranY, 1, 0,0)
Resultat = InitMouse()
; *** creation sprite pluie ***************
CreateSprite(#sprite_pluie,32,32)
StartDrawing(SpriteOutput(#sprite_pluie))
LineXY(16,1,8,32,rgb(125,125,125))
StopDrawing()
; ***********************************
; *** creation sprite eclair ***************
CreateSprite(#sprite_eclair,EcranX,EcranY)
; ***********************************
FrameTime.f = 0
Repeat
TimeStart = elapsedMilliseconds()
ExamineMouse() :ExamineKeyboard()
Event=WaitWindowEvent(20)
if flag_clear2=1
flag_clear2=0
endif
co=co+1
; ************** les eclairs ******************************
if co>random(800,150)
If ElapsedMilliseconds() - timer_eclair > 40
x1=EcranX/2 ; remise a zero
y1=0
co=0
StartDrawing(SpriteOutput(#sprite_eclair))
for u=1 to 50
dist= random(80,30)
angle.f=random(130,30)
angle_x.f=random(130,30)
ret$=arc(str(x1),str(y1),3)
x1=val(StringField(ret$,1,","))
y1=val(StringField(ret$,2,","))
next u
StopDrawing()
timer_eclair = ElapsedMilliseconds()
Endif
DisplaySprite(#sprite_eclair,eclair(0)\x.i,eclair(0)\y.i)
FlipBuffers():; affiche l'ecran
flag_clear=flag_clear+1
if flag_clear>2
StartDrawing(SpriteOutput(#sprite_eclair))
box(1,1,SpriteWidth(#sprite_eclair),SpriteHeight(#sprite_eclair),rgb(0,0,0))
StopDrawing()
flag_clear=0
Endif
Endif
; ********** pluie ****************
If ElapsedMilliseconds() - timer_pluie > 10
for i=0 to 500-1
;X + Vitesse * FrameTime
;Y + Vitesse * FrameTime
pluie(i)\y.i=pluie(i)\y.i+pluie(i)\pas.i
pluie(i)\x.i=pluie(i)\x.i-pluie(i)\pas.i/2
if pluie(i)\y.i>=EcranY
pluie(i)\y.i=0
Endif
if pluie(i)\x.i<=0
pluie(i)\x.i=Ecranx
Endif
next i
timer_pluie = ElapsedMilliseconds()
Endif
for i=0 to 500-1
DisplayTransparentSprite(#sprite_pluie,pluie(i)\x.i,pluie(i)\y.i)
next i
FlipBuffers():; affiche l'ecran
if flag_clear2=0
ClearScreen(rgb(0,0,0)) :;efface l'ecran
endif
; **********************************
;}
If MouseButton(2) or KeyboardPushed(#PB_Key_Space)
End
EndIf
;delay(60)
Until Event=#PB_Event_CloseWindow
Procedure.f RotationX(x, angle.f, dist)
; on fourni le X actuel plus un angle, et une distance
; ça retourne le nouveau X
ProcedureReturn x + Cos (angle.f* #PI /180)*dist
EndProcedure
Procedure.f RotationY(y, angle.f, dist)
; on fourni le Y actuel plus un angle, et une distance
; ça retourne le nouveau Y
ProcedureReturn y + Sin (angle.f* #PI /180)*dist
EndProcedure
procedure.s arc(x.s,y.s,niv)
; Recursif power
; By Dobro
x1=val(x.s)
y1=val(y.s)
For o=1 to niv
de=random(2,1)
dist=random(80,1)
disty= dist
angle.f=random(130,1)
angle_x.f=random(130,30)
If de=2
angle_x.f=-angle_x.f
Endif
x2=RotationX(x1, angle_x.f, dist)
y2=RotationY(y1, angle.f, disty)
lineXY(x1+2, y1-2,x2+2,y2-2,RGB(50,0,150))
lineXY(x1+1, y1+1,x2+1,y2+1,RGB(50,0,200))
lineXY(x1, y1,x2,y2,RGB(100,150,255))
lineXY(x1-1, y1-1,x2-1,y2-1,RGB(50,0,200))
lineXY(x1-2, y1+2,x2-2,y2+2,RGB(50,0,150))
x.s=str(x2) :y.s=str(y2)
x_s.s=x.s :y_s.s=y.s
Next o
x.s=x_s.s:y.s=y_s.s
niv=niv-1
if niv>0
ret$=arc(x.s,y.s,niv)
x.s=StringField(ret$,1,",")
y.s=StringField(ret$,2,",")
Endif
ProcedureReturn x.s+","+y.s
Endprocedure
;
;
; EPB