You can make an array that holds all the information you need for each graphic.
This code snip creates 20 boxes that fall at different rates using the "timer()" command:
` Dimensionalize the array
dim Boxes(20,4)
` Boxes(xx,0) = Box timer() (what timer() was after last movement)
` Boxes(xx,1) = Fall Delay (miliseconds till next movement)
` Boxes(xx,2) = Fall Rate (# of pixels to add to the y coordinate)
` Boxes(xx,3) = x coordinate
` Boxes(xx,4) = y coordinate
` Make the boxes and define the array
for t=1 to 20
ink rgb(rnd(255),rnd(255),rnd(255)),0
box 0,0,50,50
ink rgb(255,255,255),0
center text 25,15,str$(t)
get image t,0,0,50,50,1
Boxes(t,0)=timer() :` Current timer()
Boxes(t,1)=rnd(100) :` Random Delay
Boxes(t,2)=rnd(4)+1 :` This must not be zero (fall rate in pixels)
Boxes(t,3)=rnd(640) :` Random x coordinate
Boxes(t,4)=-50-rnd(150) :` Makes sure that they all don't start right at zero
next t
cls
do
for t=1 to 20
` Show the sprite at the current x and y coordinates
sprite t,Boxes(t,3),Boxes(t,4),t
` Check if the current timer() is more than
` the timer() in Boxes(xx,0) + the delay in Boxes(xx,1)
if timer()>Boxes(t,0)+Boxes(t,1)
` Increase the y coordinate in Boxes(xx,4) by the number in Boxes(xx,2)
Boxes(t,4)=Boxes(t,4)+Boxes(t,2)
` Check if the sprite goes off the screen and reset
` the starting x and y coordinates which are Boxes(xx,3)
` being x and Boxes(xx,4) being y
if Boxes(t,4)>=480
Boxes(t,3)=rnd(640)
Boxes(t,4)=-50-rnd(150)
endif
` Reset the Boxes(t,0) timer to the current timer()
Boxes(t,0)=timer()
endif
next t
loop