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 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 : 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
