I don't know if this is of any help, but I once wrote some code to get a (what I thought was a) sonic boom effect. It also looks a bit like a water ripple effect. It is done by using copyRect to copy a piece of the background to a spot a bit further on, giving the ripple effect. This is done for a number of spots that move outwards in a circle.
However I noticed in my own game that this effect is also quite heavy (probably because of all the calls to copyRect). (The trick is to make the objects move fast or restrict their life time, and especially their size.) Otherwise just see it as a funny demo. The code still needs a bitmap (with some image on it) as large as the screen ("somebitmap.png").
However I noticed in my own game that this effect is also quite heavy (probably because of all the calls to copyRect). (The trick is to make the objects move fast or restrict their life time, and especially their size.) Otherwise just see it as a funny demo. The code still needs a bitmap (with some image on it) as large as the screen ("somebitmap.png").
; "sonic boom" effect demo by Foppy Const SCREENWIDTH = 800 Const SCREENHEIGHT = 600 Graphics(SCREENWIDTH,SCREENHEIGHT) SetBuffer(BackBuffer()) Global g_gfx_background = LoadImage("somebitmap.png") ; this is the distance used when copying from source to target location (see sonic draw function) Const DISPLACEMENT = 4 ;##################################################################################################### ; SONIC TYPE DEFINITION AND RELATED FUNCTIONS ;##################################################################################################### Type SONIC Field f_x# Field f_y# Field f_size Field f_dx# Field f_dy# Field f_life End Type Function SONIC_launch (p_x#,p_y#,p_size,p_dx#,p_dy#,p_life) sonic.SONIC = New SONIC sonic\f_x = p_x sonic\f_y = p_y sonic\f_size = p_size sonic\f_dx = p_dx sonic\f_dy = p_dy sonic\f_life = p_life End Function Function SONIC_actionAll () For sonic.SONIC = Each SONIC sonic\f_x = sonic\f_x + sonic\f_dx sonic\f_y = sonic\f_y + sonic\f_dy sonic\f_life = sonic\f_life - 1 If (sonic\f_life <= 0) Then Delete(sonic) End If Next End Function Function SONIC_drawAll () For sonic.SONIC = Each SONIC ; using copyRect() we copy what is under the sonic object to a ; spot a bit further away, in the direction the object is moving sourceX# = sonic\f_x sourceY# = sonic\f_y targetX# = sourceX + sonic\f_dx * DISPLACEMENT targetY# = sourceY + sonic\f_dy * DISPLACEMENT CopyRect(sourceX,sourceY,sonic\f_size,sonic\f_size,targetX,targetY) Next End Function Function SONIC_launchWave (p_centerX,p_centerY,p_count,p_size,p_life,p_speed#) x# = p_centerX - p_size/2.0 y# = p_centerY - p_size/2.0 ; here we launch a collection of sonics from one location, each of them ; moving in a different (calculated) direction, so that we get an outwards ; moving circle For i = 1 To p_count angle# = 360.0/p_count * i dx# = Cos(angle) * p_speed dy# = Sin(angle) * p_speed SONIC_launch(x,y,p_size,dx,dy,p_life) Next End Function ;##################################################################################################### ; MAIN LOOP ;##################################################################################################### Color(255,255,255) While(Not(KeyHit(1))) ; move all "sonics" SONIC_actionAll() ; check user input If (MouseHit(1)) Then ; launch wave of "sonics" when left mouse button is hit, use random values SONIC_launchWave(MouseX(),MouseY(),Rand(100,200),Rand(5,10),Rand(20,50),Rnd(1,2)) End If Cls ; draw background DrawImage(g_gfx_background,0,0) ; draw all "sonics" SONIC_drawAll() Plot(MouseX(),MouseY()) Flip Wend Delete Each SONIC End