Si votre écran est mal paramètre , l'effet 2 et 4 ont un rendu "dégalace".
Attention, programme gourmand en resource.
Code : Tout sélectionner
Global lg=640
Global ht=400
Global time.f=0.0
Global amp.f=8.0
Global freq.f=4.0
Global z1.f
Global z2.f
Global z3.f
Global Dim screen(lg,ht)
; ------------------------------------------------------------
Macro clamp(x)
If x>255 : x=255 : EndIf
If x<0 : x=0: EndIf
EndMacro
;------------------------------------------------------------
#c1=0.99940307
#c2=-0.49558072 + 0.09079168
#twopi=2.0*#PI
#two_over_pi= 2.0/#PI
#halfpi=#PI/2.0
Procedure.f fcos(x.f)
;x=Mod(x, #twopi);
v.f=x/#twopi
x = ((( v-(Int(v)) )*#twopi))
If(x<0):x=-x:EndIf
quad=Int(x * #two_over_pi)
If quad=0
x=(#c1 + x * x * #c2 )
EndIf
If quad=1
x=#PI-x
x=-(#c1 + x * x * #c2 )
EndIf
If quad=2
x=x-#PI
x=-(#c1 + x * x * #c2 )
EndIf
If quad=3
x=#twopi-x
x=(#c1 + x * x * #c2 )
EndIf
ProcedureReturn x
EndProcedure
Procedure.f fsin(x.f)
x = #halfpi-x
;x=Mod(x, #twopi);
v.f=x/#twopi
x = ((( v-(Int(v)) )*#twopi))
If(x<0):x=-x:EndIf
quad=Int(x * #two_over_pi)
If quad=0
x=(#c1 + x * x * #c2 )
EndIf
If quad=1
x=#PI-x
x=-(#c1 + x * x * #c2 )
EndIf
If quad=2
x=x-#PI
x=-(#c1 + x * x * #c2 )
EndIf
If quad=3
x=#twopi-x
x=(#c1 + x * x * #c2 )
EndIf
ProcedureReturn x
EndProcedure
Procedure.f rfcos(x.f)
x = x / 180 * #PI ; radian
;x=Mod(x, #twopi);
v.f=x/#twopi
x = ((( v-(Int(v)) )*#twopi))
If(x<0):x=-x:EndIf
quad=Int(x * #two_over_pi)
If quad=0
x=(#c1 + x * x * #c2 )
EndIf
If quad=1
x=#PI-x
x=-(#c1 + x * x * #c2 )
EndIf
If quad=2
x=x-#PI
x=-(#c1 + x * x * #c2 )
EndIf
If quad=3
x=#twopi-x
x=(#c1 + x * x * #c2 )
EndIf
ProcedureReturn x
EndProcedure
Procedure.f rfsin(x.f)
x = x / 180 * #PI ; radian
x = #halfpi-x
;x=Mod(x, #twopi);
v.f=x/#twopi
x = ((( v-(Int(v)) )*#twopi))
If(x<0):x=-x:EndIf
quad=Int(x * #two_over_pi)
If quad=0
x=(#c1 + x * x * #c2 )
EndIf
If quad=1
x=#PI-x
x=-(#c1 + x * x * #c2 )
EndIf
If quad=2
x=x-#PI
x=-(#c1 + x * x * #c2 )
EndIf
If quad=3
x=#twopi-x
x=(#c1 + x * x * #c2 )
EndIf
ProcedureReturn x
EndProcedure
;------------------------------------------------------------
Procedure update_fx1()
rx.f=0
gx.f=0
bx.f=0
dx.f=0
dy.f=0
time = time + 0.005
If time>=314 : time=0 : EndIf
For fy=0 To ht-1
For fx=0 To lg-1
dx=fx/lg
dy=(fy/lg - 0.3) * amp
rx=1-Abs(dy - fSin((dx - time)*freq))
gx=1-Abs(dy - fSin((dx + time)*freq))
bx=1-Abs(dy - fSin((dx - time +0.5)*freq))
rx=(rx*1.0)+(gx*0.5)+(bx*0.5)
gx=(rx*0.5)+(gx*1.0)+(bx*0.5)
bx=(rx*0.5)+(gx*0.5)+(bx*1.0)
m=128
r=(rx*m)+0
g=(gx*m)+0
b=(bx*m)+0
clamp(r)
clamp(g)
clamp(b)
var = r<<16 + g<<8 + b
screen(fx,fy)=var
Next
Next
EndProcedure
;------------------------------------------------------------
Procedure update_fx2()
z1.f=z1+0.4
z2.f=z2+0.8
z3.f=z3+0.6
For y=0 To ht-1
For x=0 To lg-1
f1=120-Abs(rfSin(x+z1+rfSin(y*4+z1)*120)*120)
f2=120-Abs(rfCos(y-z2+rfSin(x*4-z1)*120)*120)
f3=Int(120-Abs(rfSin(x*4+z2+rfSin(x+y+z3)*40)*120))*256
f4=Int(120-Abs(rfCos(y*4-z2+rfSin(x-y-z1)*40)*120))*256
f5=Int(120-Abs(rfSin(y*4+z1+rfSin(x-y+z2)*40)*120))*65536
f6=Int(120-Abs(rfCos(x*4-z1+rfSin(x+y-z2)*40)*120))*65536
screen(x,y)=f1+f2+f3+f4+f5+f6
Next
Next
EndProcedure
;------------------------------------------------------------
Procedure update_fx3()
freq.f=4.0
time = time + 0.02
If t>=314 : t=0 : EndIf
For fy=0 To ht-1
For fx=0 To lg-1
dx.f=fx/lg
dy.f=(fy/lg)
a.f=(fSin((dy *1.5 - time *0.1)*freq)/2)-0.5
b.f=(fCos((dy *1.5 - time *0.2)*freq)/2)-0.5
c.f=(fSin((dy *1.5 - time *0.3)*freq)/2)-0.5
d.f=(fCos((dy *3.5 + time *0.5)*freq)/3)-0.5
If (dx+a)<>0 : rx.f=0.1/Abs(dx+a) : EndIf
If (dx+b)<>0 : gx.f=0.1/Abs(dx+b) : EndIf
If (dx+c)<>0 : bx.f=0.1/Abs(dx+c) : EndIf
If (dx+d)<>0 : aa.f=0.1/Abs(dx+d) : EndIf
rx=(rx*1.0)+(gx*0.3)+(bx*0.1)
gx=(rx*0.1)+(gx*1.0)+(bx*0.3)
bx=(rx*0.3)+(gx*0.1)+(bx*1.0)
m=aa*200
r=(rx*m)+0
g=(gx*m)+0
b=(bx*m)+0
Clamp(r)
Clamp(g)
Clamp(b)
var = r<<16 + g<<8 + b
screen(fx,fy)=var
Next
Next
EndProcedure
;------------------------------------------------------------
Procedure update_fx4()
z1=z1+0.01
z2=z2+0.03
z3=z3+0.02
For y=0 To ht-1
For x=0 To lg-1
x1.f=x/lg
y1.f=y/ht
f1=120-Abs(fSin(x1+z1+fSin(y1+z1)*6)*120)
f2=120-Abs(fCos(y1-z2+fSin(x1-z1)*6)*120)
f3=Int(120-Abs(fSin(x1*4+z2+fSin(x1+y1+z3)*4)*120))*256
f4=Int(120-Abs(fCos(y1*4-z2+fSin(x1-y1-z1)*4)*120))*256
f5=Int(120-Abs(fSin(y1*4+z1+fSin(x1-y1+z2)*4)*120))*65536
f6=Int(120-Abs(fCos(x1*4-z1+fSin(x1+y1-z2)*4)*120))*65536
var = f1+f2+f3+f4+f5+f6
screen(x,y)=var
Next
Next
EndProcedure
;------------------------------------------------------------
Procedure copy()
StartDrawing(ImageOutput(1))
buf=DrawingBuffer()
StopDrawing()
For y=0 To ht-1
For x=0 To lg-1
pos= ((y*lg) + x)<<2
PokeL( buf + pos, (screen(x,y)))
Next
Next
EndProcedure
;------------------------------------------------------------
If OpenWindow(0, 0, 0, lg+20, ht+40, "Exemple...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
Global img = CreateImage(1, lg,ht,32)
ComboBoxGadget(2, 10, 5, 100, 20)
For i=0 To 3
AddGadgetItem (2,-1,"FX"+Str(i+1))
Next
Repeat
var=GetGadgetState(2)
Event = WindowEvent()
Select var
Case 0
update_fx1()
Case 1
update_fx2()
Case 2
update_fx3()
Case 3
update_fx4()
EndSelect
copy()
StartDrawing(WindowOutput(0))
DrawImage(img,10,30)
StopDrawing()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case 1
CloseWindow(0)
End
EndSelect
EndSelect
Until Event = #PB_Event_CloseWindow
EndIf