Code : Tout sélectionner
;-Decoders & initialisations
EnableExplicit
UseJPEG2000ImageDecoder()
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseTGAImageDecoder()
UseTIFFImageDecoder()
InitSprite()
; Structure SPRITE
; ID.i
; *Next.SPRITE
; EndStructure
Structure FLAG
Speed.i
Amplitude.i
Period.i
StepX.i
NumOfStep.i
Pole.b
; *Sprite.SPRITE
EndStructure
Declare.b DisplayFlag(*Flag.FLAG)
Define Flag.FLAG,Thread.i,N.i
;-Window
OpenWindow(0,0,0,532,622,"Oscillo",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
OpenWindowedScreen(WindowID(0),10,10,512,512,0,0,0)
TextGadget(0,10,535,60,14,"Vitesse :")
SpinGadget(1,70,532,40,20,1,999,#PB_Spin_Numeric)
TextGadget(2,10,565,60,14,"Amplitude :")
SpinGadget(3,70,562,40,20,1,999,#PB_Spin_Numeric)
TextGadget(4,10,595,60,14,"Période :")
SpinGadget(5,70,592,40,20,2,999,#PB_Spin_Numeric)
TextGadget(6,135,535,60,14,"Morcelage :")
SpinGadget(7,195,532,40,20,1,999,#PB_Spin_Numeric)
CheckBoxGadget(8,135,562,100,20,"Hampe fixe")
TextGadget(9,135,595,60,14,"Drapeau :")
ButtonGadget(10,195,592,30,20,"...")
;-Default flag
CreateImage(0,300,200,32)
If StartDrawing(ImageOutput(0))
For N=0 To 199
Line(0,N,300,0,RGB(32-N/8,64-N/4,255-N))
Next N
For N=1 To 19
Line(0,10*N,300,0,$C0C000)
Line(15*N,0,0,200,$C0C000)
Next N
DrawingMode(#PB_2DDrawing_Outlined)
Box(0,0,300,200,$FFFFFF)
StopDrawing() : EndIf
CopyImage(0,1)
If ImageHeight(1)>ImageWidth(1)/2
ResizeImage(1,ImageWidth(1)*80/ImageHeight(1),80)
Else
ResizeImage(1,160,ImageHeight(1)*160/ImageWidth(1))
EndIf
Flag\Speed=150
Flag\Amplitude=8
Flag\Period=400
Flag\StepX=2
Flag\NumOfStep=ImageWidth(0)/Flag\StepX
Flag\Pole=1
SetGadgetState(1,Flag\Speed)
SetGadgetState(3,Flag\Amplitude)
SetGadgetState(5,Flag\Period)
SetGadgetState(7,Flag\StepX)
SetGadgetState(8,Flag\Pole)
ImageGadget(12,260,532,1,1,ImageID(1))
CreateSprite(0,ImageWidth(0),ImageHeight(0))
If StartDrawing(SpriteOutput(0)) : DrawImage(ImageID(0),0,0) : StopDrawing() : EndIf
Thread=CreateThread(@DisplayFlag(),@Flag)
;-Main loop
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case 0,#WM_MOUSEMOVE
Case 1 : Flag\Speed=GetGadgetState(1)
Case 3 : Flag\Amplitude=GetGadgetState(3)
Case 5 : Flag\Period=GetGadgetState(5)
Case 7 : Flag\StepX=GetGadgetState(7) : Flag\NumOfStep=ImageWidth(0)/Flag\StepX
Case 8 : Flag\Pole=GetGadgetState(8)
Case 10
If LoadImage(1,OpenFileRequester("Choisir une image",GetCurrentDirectory(),"Images|*.bmp;*.jpg;*.jpeg;*.png;*.tga;*.tiff",1))
PauseThread(Thread)
CopyImage(1,0)
If ImageHeight(1)>ImageWidth(1)/2
ResizeImage(1,ImageWidth(1)*80/ImageHeight(1),80)
Else
ResizeImage(1,160,ImageHeight(1)*160/ImageWidth(1))
EndIf
CreateSprite(0,ImageWidth(0),ImageHeight(0))
SetGadgetState(12,ImageID(1))
If StartDrawing(SpriteOutput(0)) : DrawImage(ImageID(0),0,0) : StopDrawing() : EndIf
Flag\NumOfStep=ImageWidth(0)/Flag\StepX
ResumeThread(Thread)
EndIf
EndSelect
Case #PB_Event_CloseWindow : End
EndSelect
ForEver
Procedure.b DisplayFlag(*Flag.FLAG)
Protected Time.i,Count.f,N.i,Y.f,DiffY.f,Point.POINT
Time=ElapsedMilliseconds()
;Screen loop
Repeat
ClearScreen(0)
Delay(10)
Point\X=(512-ImageWidth(0))/2
Point\Y=(512-ImageHeight(0))/2
For N=0 To *Flag\NumOfStep
Y=Sin((*Flag\Speed*Count+128*(N**Flag\StepX)/*Flag\Period)/20)
;Fixed flagpole?
If N=0
If *Flag\Pole
DiffY=Y
EndIf
EndIf
Y-DiffY
ClipSprite(0,N**Flag\StepX,0,*Flag\StepX,ImageHeight(0))
DisplaySprite(0,Point\X+N**Flag\StepX,Point\Y+*Flag\Amplitude*Y)
Next N
Count=(ElapsedMilliseconds()-Time)/1000
FlipBuffers()
ForEver
EndProcedure
Je pensais aussi rajouter un effet d'ombre et de lumière sur les vagues.