This code is rendering text to the screen in a sine wave pattern. The text will fade in and out, and the vertical position of the text will wobble. The text will also have a gradient color effect, with the color changing from blue to purple. The text is displayed in the center of the screen, and will continue to animate until the space key or escape key is pressed.

PlayBASIC Code:
; PROJECT : Xand Y sine wave text renering test
; AUTHOR  : Kev Picone - http://PlayBASIC.com
; CREATED : 30/12/2021
; EDITED  : 30/12/2021
; ---------------------------------------------------------------------


         if GetFontStatus(50)=false
            LoadFont   "Agency FB",50,148,1,8
            FontDrawmode 50,1
         endif
         
            
setfps 20
      screen=newfximage(getscreenwidth(),getscreenheight())
      
      Message$="Sine Wave X&Y Axis"
      FadeLevel#=1
   Do
      ;cls 
      rendertoimage screen
      cls $112233
         setfont 50
      ShadedText(Screen,100,Message$, FadeLevel#)
   rendertoscreen
   
      fadeangle#=wrapangle(fadeangle#,0.5)
   FadeLevel#= 0.5+sin(fadeangle#)   
      drawimage screen,0,0,false

      sync
   loop spacekey()=true or esckey()=true

   
   end




Function ShadedText(Screen,Ypos,Message$, FadeLevel#)
   oldSurface   =getSurface()

  Static WobbleAngle#
  Static WobbleAngle2#


    Static VertialWobbleAngle#
 
      rendertoimage screen
      
      
      //FadeLevel#=cliprange(FadeLevel#,0,1)
      
      screenwidth   =GetSurfaceWidth()
      screenHeight=GetSurfaceHeight()
      
      
      imageviewport Screen,0,0,screenWidth,ScreenHeight

      TW=GetTextWidth(Message$)

      Xpos=(ScreenWidth/2)-(TW/2)

      ThisRGB=rgb(50,50,50)


      
      Level = Cliprange( ($90*FadeLevel#) , 0,255)
      if level>0
         for lp =0 to 2      
            ink rgbfade(ThisRgB,50) or Argb(Level,0,0,0)
            text Xpos,Ypos,Message$
            Level+=$16
            Xpos+=2
            Ypos+=1
         next
      endif   
      Rgb1=rgb(20,70,170)
      Rgb2=rgb(220,230,250)

      Rows=GetTextHeight("|")   
      
      Alpha = Cliprange( ($ff*FadeLevel#) , 0,255)
      
      if Alpha>0
      TextWidthInPixels = GetTextWidth(Message$)
      VerticalWaveChunkSize = 4   
      
      VerticalRows=Rows+16
      For lp =0 to VerticalRows   ;Rows+16
         scaler#=float(lp)/VerticalRows
         
         scaler#*= cos(WobbleAngle#)+0.5
         
         ThisRGB=RgbAlphaBlend(Rgb1,RGB2,Scaler#*100) and $00ffffff
         ink lsl32(Alpha,24) or ThisRGB
         
         
         Ypos2=Ypos+lp
         
         OffsetX   =Cos(WobbleAngle#+(lp*1))*5
         OffsetX   +=Sin(WobbleAngle2#-(lp/5))*3
         
         
         //  draw this strip with 
         
      for xwave=0 to TextWidthInPixels step VerticalWaveChunkSize
         
         
            VerticalOffset =sin(VertialWobbleAngle#+(Xwave*0.5))*20
         ;   VerticalOffset+=cos(VertialWobbleAngle#+(Xwave*0.3))*4
            
            ;cosradius(WobbleAngle#,12)

            ScreenX1 = xwave+xpos+OffsetX               
            ScreenX2 = ScreenX1+VerticalWaveChunkSize
            FinalYpos =Ypos2+VerticalOffset   
            imageviewport Screen,ScreenX1,ypos2,ScreenX2,Ypos2+1

            text Xpos+OFFSETX,ypos+VerticalOffset,Message$
         next   
   next
   
   endif   

      imageviewport Screen,0,0,screenWidth,ScreenHeight
      
      WobbleAngle#=wrapangle(WobbleAngle#,2.5)
      WobbleAngle2#=wrapangle(WobbleAngle2#,1.5)
      
      
      VertialWobbleAngle#= wrapangle(VertialWobbleAngle#,0.5)
      
   rendertoimage oldSurface

   
endFunction




PlayBASIC - Code Snippet - Sine Wave Scroller - 18th June 2006


This is classic source code example from way back in 2006. The demo shows a simple right to left scrolling message with sine wave distortions applied. First we start with the basic scroller, next we add sine distortion on the X axis, then the Y axis finishing off by combining them..


VIDEO:




music by: https://BenSound.com


Code:


PlayBASIC Code:
; PROJECT : Sine_Scrollers
; AUTHOR : Kevin Picone
; CREATED : 18/06/2006
; EDITED : 18/06/2006
; ---------------------------------------------------------------------

 ; load the Courier New font
Loadfont "Courier New",1,32,0
MakeBitmapFont 1,$ff0000

 ; load the Courier New font
Loadfont "Courier New",2,64,0
MakeBitmapFont 2,$8f70a0
setfont 2

; Make a type to hold the various bits of info ab

SineWaveWidth=32
ScrollHeight=GetTextHeight("Y")


; CReate an array to hold the Scroll text in charater form
Dim ScrollText(0)
  Read_Text_To_Scroller_Array(ScrollText())
 

; Original Scroll buffer
ScrollBuffer=NewImage(800+(SineWaveWidth*2)+GetFontWidth(2),ScrollHeight)

ScrollBuffer2=NewImage(800+(SineWaveWidth*2)+GetFontWidth(2),ScrollHeight)


setfps 60
RendertoScreen
Do
Cls 0

; Update the Scroll Buffer
setfont 2
UpdateScroller(ScrollText(),ScrollBuffer)


; select What effect render 
Select Effect
case 0
; draw the scroll messagae
Drawimage ScrollBuffer,0,280,true
EffectName$="Standard Scroller"

case 1
 Draw_XSine_Image(ScrollBuffer,0,280,32)
EffectName$="Scroller with sine X distortion"

case 2
Draw_YSine_Image(ScrollBuffer,0,280,270)
EffectName$="Scroller with sine Y distortion"

case 3
rendertoimage Scrollbuffer2
Draw_XSine_Image(ScrollBuffer,0,0,24)
rendertoscreen
Draw_YSine_Image(ScrollBuffer2,0,280,270)
EffectName$="Scroller with combined X&Y distortion"
endselect




if Spacekey() 
Inc Effect
If effect>3 then effect=0
flushkeys
endif

Setfont 1
x=getscreenwidth()/2
y=GetScreenheight()/2+200
centertext x,y,EffectName$ 
centertext x,y+50,"Press Space"


Sync
loop


; ---------------------------------------------------------------------
; Copy an Image width a X sine wave applied
; ---------------------------------------------------------------------

Function Draw_XSine_Image(ThisImage,Xpos,Ypos,XwaveRAdius)
Static BaseAngle# 

OutputBuffer=getsurface()

IW=GetImageWidth(ThisImage)
IH=GetImageheight(ThisImage)

For Angle#=BaseAngle# to Baseangle#+IH
X=SinRadius(Angle#,XwaveRadius)
CopyStripH ThisImage,y,0,iw,OutPutBuffer,Xpos-XwaveRAdius+X,ypos 
inc Y
inc Ypos
next

BaseAngle#=wrapangle(BaseAngle#,0.5)
rendertoscreen
EndFUnction




; ---------------------------------------------------------------------
; Copy an Image with a Y sine wave applied
; ---------------------------------------------------------------------

Function Draw_YSine_Image(ThisImage,Xpos,Ypos,WaveRAdius)
Static BaseAngle# 

OutputBuffer=getsurface()

IW=GetImageWidth(ThisImage)
IH=GetImageheight(ThisImage)

Angle#=baseangle#
if iw>GetImageWidth(Outputbuffer) then iw=GetImageWidth(Outputbuffer)
For x=0 to iw-1
Y=SinRadius(Angle#,waveRadius)
; to reduce the number of blits
CopyRect ThisImage,x,0,x+2,ih,OutPutBuffer,Xpos,ypos+Y 
inc xpos
inc xpos
Angle#=wrapangle(Angle#,0.5)
next

BaseAngle#=wrapangle(BaseAngle#,2)
rendertoscreen
EndFUnction







; ---------------------------------------------------------------------
; Refresh Scroll Text/ Buffer
; ---------------------------------------------------------------------

Function UpdateScroller(ChrBuffer(),ScrollBuffer)
; use static variables to keep track of the displacement
Static PixelShifts,CurrentChr
CurrentSurface=getSurface()

; get the current fonts + width & height
ThisFont=GetCurrentFOnt()
FontWidth=GetFontWidth(ThisFont)
FontHeight=GetFontHeight(ThisFont)

; Get the Scroll Buffers Width and Height
IW=GetImagewidth(ScrollBuffer)
IH=GetImageHeight(ScrollBuffer)


; Move the Scroll buffer 1 pixel to the left 
 CopyRect ScrollBuffer,1,0,IW,IH,ScrollBuffer,0,0

 Inc PixelShifts
 if PixelShifts=>GetFontWidth(GetCurrentFont())
 PixelShifts=0

 rendertoimage scrollbuffer
; clear any left over pixels 
boxc iw-fontwidth,0,iw,ih,true,0
; draw a new character on the end of the scroll image buffer
 text iw-FontWidth,0,chr$(ChrBuffer(CurrentChr))

; bump the current character index
inc CurrentChr
; check if the current character index is inside the buonds
; of the Scroll text array
if CurrentChr=>GetArrayElements(Chrbuffer(),1)
CurrentChr=0
endif
 endif

; restore old render surface
RenderToImage CurrentSurface

EndFunction



Function Read_Text_To_Scroller_Array(Buffer())
Dim buffer(0)
repeat
Size=GetArrayElements(Buffer(),1)
t$=readdata$()
if t$<>""
redim Buffer(Size+Len(t$))
For c=1 to len(t$)
buffer(size+c-1)=mid(t$,c)
next
endif
until t$=""
EndFUnction


 data "Hello World... Here's some old skool scroll text" 
 Data "......................."
 data "" ; end of scroll text