Well after some research i seemed to need a Perlin noise algorithm.
Writing that for pb was not really an option for a beginner like me so
i ended up with randomized sin calls actually.
to show you an example i made this screensaver that mimics the SpongeBob titlecard gif
https://www.youtube.com/watch?v=A-WZOA6Fwng
as close as possible, it does the job:
Code: Select all
InitSprite()
InitSound()
InitKeyboard()
;------------------------------------------------
#w = 800
#h = 600
OpenScreen(#w, #h, 32, "SB-129")
LoadSound(0, "loop.wav")
PlaySound(0, #PB_Sound_Loop)
LoadSprite(0, "Titlecard.bmp")
LoadSprite(1, "sb-129.bmp")
;--------------------------------------------------------------------------------------------------------
; ProgramParameter()
; /s = normal start
; /c = configure window
; /p = little preview window
; they can be followed by the windo ID:
; /c:1024
; use WinAPI to display a graphic in the preview window when the 'P' parameter is passed to the program
;--------------------------------------------------------------------------------------------------------
xmid = #w / 2 - SpriteWidth(1) / 2
ymid = #h / 2 - SpriteHeight(1) / 2
;------------------------------------------------
XmaxSpd = 300 ; / 100
XminSpd = 100 ; / 100
XmaxDis = 500 ; / 100
XminDis = 300 ; / 100
YmaxSpd = 300 ; / 100
YminSpd = 200 ; / 100
YmaxDis = 1500 ; / 100
YminDis = 1000 ; / 100
RmaxSpd = 400 ; / 100
RminSpd = 100 ; / 100
RmaxDis = 200 ; / 100
RminDis = 50 ; / 100
;------------------------------------------------
x.f = 0
y.f = 0
r.f = 0
Xdis = XmaxDis ; how far from middle / 100
Ydis = YmaxDis ; how far from middle / 100
Rdis = RmaxDis ; how far from middle / 100
XnewDis = Xdis ; walk to random distance point
YnewDis = Ydis ; walk to random distance point
RnewDis = Rdis ; walk to random distance point
Xdeg.f = 0 ; 1 - 360
Ydeg.f = 0 ; 1 - 360
Rdeg.f = 0 ; 1 - 360
Xspd = XmaxSpd ; how much pixels per frame / 100
Yspd = YmaxSpd ; how much pixels per frame / 100
Rspd = RmaxSpd ; how much pixels per frame / 100
XnewSpd = Xspd ; walk to random speed point
YnewSpd = Yspd ; walk to random speed point
RnewSpd = Rspd ; walk to random speed point
;------------------------------------------------
snip = ElapsedMilliseconds()
time = 1000
duration = SoundLength(0)
;--------------------------------------------------------------------------------------------------------
Repeat
ExamineKeyboard()
FlipBuffers()
;--------------------------------
r = Sin(Radian(Rdeg)) * (Rdis / 100)
If Rdis = Rnewdis
Rnewdis = Random(RmaxDis, RminDis)
ElseIf Rdis < Rnewdis
Rdis + 1
Else
Rdis - 1
EndIf
Rdeg + Rspd / 100
If Rdeg > 360 : Rdeg = 0 : EndIf
If Rspd = Rnewspd
Rnewspd = Random(RmaxSpd, RminSpd)
ElseIf Rspd < Rnewspd
Rspd + 1
Else
Rspd - 1
EndIf
;--------------------------------
x = Sin(Radian(Xdeg)) * (Xdis / 100)
If Xdis = Xnewdis
Xnewdis = Random(XmaxDis, XminDis)
ElseIf Xdis < Xnewdis
Xdis + 1
Else
Xdis - 1
EndIf
Xdeg + Xspd / 100
If Xdeg > 360 : Xdeg = 0 : EndIf
If Xspd = Xnewspd
Xnewspd = Random(XmaxSpd, XminSpd)
ElseIf Xspd < Xnewspd
Xspd + 1
Else
Xspd - 1
EndIf
;--------------------------------
Y = Sin(Radian(Ydeg)) * (Ydis / 100)
If Ydis = Ynewdis
Ynewdis = Random(YmaxDis, YminDis)
ElseIf Ydis < Ynewdis
Ydis + 1
Else
Ydis - 1
EndIf
Ydeg + Yspd / 100
If Ydeg > 360 : Ydeg = 0 : EndIf
If Yspd = Ynewspd
Ynewspd = Random(YmaxSpd, YminSpd)
ElseIf Yspd < Ynewspd
Yspd + 1
Else
Yspd - 1
EndIf
;--------------------------------
If ElapsedMilliseconds() - snip > time
snip = ElapsedMilliseconds()
SetSoundPosition(0, duration - Random(duration))
SetSoundFrequency(0, Random(54100, 34100))
EndIf
;--------------------------------
DisplaySprite(0,0,0)
RotateSprite(1, r, #PB_Absolute)
DisplayTransparentSprite(1, xmid + x, ymid + y)
Until KeyboardInkey()