this was just my test.... I love yours. i have not included the background image here. the png for sprites has also been changed to let the image go over the background and be see through.
SCREEN _NEWIMAGE(1366, 768, 32): DIM CIRCLOOP1(17, 3)
DIM SHARED SPRITES AS LONG, BACKIMAGE AS LONG
SPRITES = _LOADIMAGE("inva.png"): BACKIMAGE = _LOADIMAGE("s.png")
_FULLSCREEN
FOR I = 1 TO 16: READ CIRCLOOP1(I, 1), CIRCLOOP1(I, 2): NEXT I: CL$ = "1000100010001000"
DATA 3,1,4,1,5,1,6,2,7,3,7,4,7,5,6,6,5,7,4,7,3,7,2,6,1,5,1,4,1,3,2,2
CLS: frame = 1: RR% = 60: XX% = 8: D = 1
DO
_PUTIMAGE (0, 0)-(1366, 768), BACKIMAGE
FOR I = 1 TO 16: B$ = MID$(CL$, I, 1)
SELECT CASE frame
CASE 1: IF B$ = "1" THEN _PUTIMAGE (CIRCLOOP1(I, 1) * 48 + RR%, CIRCLOOP1(I, 2) * 48 + RR%), SPRITES, , (0, 0)-(63, 63)
CASE 2: IF B$ = "1" THEN _PUTIMAGE (CIRCLOOP1(I, 1) * 48 + RR%, CIRCLOOP1(I, 2) * 48 + RR%), SPRITES, , (64, 0)-(127, 63)
'CASE 1: IF B$ = "1" THEN _PUTIMAGE (CIRCLOOP1(I, 1) * 48 + RR%, CIRCLOOP1(I, 2) * 48 + RR%), SPRITES, , (128, 0)-(191, 63)
'CASE 2: IF B$ = "1" THEN _PUTIMAGE (CIRCLOOP1(I, 1) * 48 + RR%, CIRCLOOP1(I, 2) * 48 + RR%), SPRITES, , (192, 0)-(255, 63)
END SELECT: NEXT I: _DISPLAY: _LIMIT 3
frame = frame + 1: IF frame > 2 THEN frame = 1: PLAY "T255L32O1G" ELSE PLAY "T255L32O1C"
i$ = INKEY$: RR% = RR% + XX%: IF RR% > 700 THEN XX% = -8 ELSE IF RR% < 50 THEN XX% = 8
IF D = 1 THEN B$ = RIGHT$(CL$, 1): CL$ = B$ + LEFT$(CL$, 15)
IF D = 2 THEN B$ = LEFT$(CL$, 1): CL$ = RIGHT$(CL$, 15) + B$
IF RND(1) > 20 THEN D = D + 1: IF D > 2 THEN D = 1
LOOP WHILE i$ <> " "
_FREEIMAGE BACKIMAGE
_FREEIMAGE SPRITES
SCREEN _NEWIMAGE(1366, 768, 32): DIM CIRCLOOP1(17, 3)
DIM SHARED SPRITES AS LONG, BACKIMAGE AS LONG
SPRITES = _LOADIMAGE("inva.png"): BACKIMAGE = _LOADIMAGE("s.png")
_FULLSCREEN
FOR I = 1 TO 16: READ CIRCLOOP1(I, 1), CIRCLOOP1(I, 2): NEXT I: CL$ = "1000100010001000"
DATA 3,1,4,1,5,1,6,2,7,3,7,4,7,5,6,6,5,7,4,7,3,7,2,6,1,5,1,4,1,3,2,2
CLS: frame = 1: RR% = 60: XX% = 8: D = 1
DO
_PUTIMAGE (0, 0)-(1366, 768), BACKIMAGE
FOR I = 1 TO 16: B$ = MID$(CL$, I, 1)
SELECT CASE frame
CASE 1: IF B$ = "1" THEN _PUTIMAGE (CIRCLOOP1(I, 1) * 48 + RR%, CIRCLOOP1(I, 2) * 48 + RR%), SPRITES, , (0, 0)-(63, 63)
CASE 2: IF B$ = "1" THEN _PUTIMAGE (CIRCLOOP1(I, 1) * 48 + RR%, CIRCLOOP1(I, 2) * 48 + RR%), SPRITES, , (64, 0)-(127, 63)
'CASE 1: IF B$ = "1" THEN _PUTIMAGE (CIRCLOOP1(I, 1) * 48 + RR%, CIRCLOOP1(I, 2) * 48 + RR%), SPRITES, , (128, 0)-(191, 63)
'CASE 2: IF B$ = "1" THEN _PUTIMAGE (CIRCLOOP1(I, 1) * 48 + RR%, CIRCLOOP1(I, 2) * 48 + RR%), SPRITES, , (192, 0)-(255, 63)
END SELECT: NEXT I: _DISPLAY: _LIMIT 3
frame = frame + 1: IF frame > 2 THEN frame = 1: PLAY "T255L32O1G" ELSE PLAY "T255L32O1C"
i$ = INKEY$: RR% = RR% + XX%: IF RR% > 700 THEN XX% = -8 ELSE IF RR% < 50 THEN XX% = 8
IF D = 1 THEN B$ = RIGHT$(CL$, 1): CL$ = B$ + LEFT$(CL$, 15)
IF D = 2 THEN B$ = LEFT$(CL$, 1): CL$ = RIGHT$(CL$, 15) + B$
IF RND(1) > 20 THEN D = D + 1: IF D > 2 THEN D = 1
LOOP WHILE i$ <> " "
_FREEIMAGE BACKIMAGE
_FREEIMAGE SPRITES