The reason comes with get_palette and set_palette functions and gif image with 8 bits.
Of course, I could use pygame.PixelArray but is not the purpose of this tutorial.
The python script comes with one surface screen, one surface for image and also one surface of a blur.
I set the resolution to be sized at 640,480. I have motion vectors for two directions and with this I make a circle follow path from sin and cos.
The path come from x and y variables ( width and height).
With angle_xd and angle_yd I increment the angles.
This is the result:
This is the source code:
import pygame, pygame.transform, pygame.image
from pygame.surfarray import *
from pygame.locals import *
from numpy import *
resolution = array((640,480))
PI = 3.14159
DEG2RAD = PI/180
print resolution[0], resolution[1]
def main():
pygame.init()
screen = pygame.display.set_mode(resolution,0,8)
sprite = pygame.image.load("test_random.gif")
sprite.set_palette(sprite.get_palette())
sprite.set_colorkey((255,255,255))
screen.set_palette(sprite.get_palette())
area_work = pygame.Surface(resolution,0,8)
area_work.set_palette(sprite.get_palette())
angle_xd = 0
angle_yd = 0
while 1:
for e in pygame.event.get():
if e.type in (QUIT,KEYDOWN,MOUSEBUTTONDOWN):
return
x = ((resolution[0])/5)*cos((angle_xd*DEG2RAD))+((resolution[0])/2-128)
print x
y = ((resolution[1])/5)*sin((angle_yd*DEG2RAD))+((resolution[1])/2-128)
angle_xd += 1
angle_yd += 1
area_work = pygame.transform.scale(screen, (resolution[0]+8,resolution[1]+8))
tmp = pygame.surfarray.array2d(area_work)
blur = array(tmp)
blur[1:,:] += tmp[:-1,:]*32
blur[:-1,:] += tmp[1:,:]*32
blur[:,1:] += tmp[:,:-1]*32
blur[:,:-1] += tmp[:,1:]*32
blur /= 31
blit_array(screen, blur[8:resolution[0]+32,8:resolution[1]+32])
screen.blit(sprite,(x,y))
pygame.display.update()
if __name__ == '__main__': main()