"""animation loading and manipulating functions.
please note that this file is alpha, and is subject to modification in
future versions of pgu!
"""
print 'pgu.ani','This module is alpha, and is subject to change.'
import math
import pygame
def _ani_load(tv,name,parts,frames,shape):
l = len(frames)
#print name,parts,l
n = parts.pop()
if len(parts):
s = l/n
for i in xrange(0,n):
_ani_load(tv,name + ".%d"%i,parts[:],frames[s*i:s*(i+1)],shape)
return
for i in xrange(0,n):
tv.images[name+".%d"%i] = frames[i],shape
def ani_load(tv,name,img,size,shape,parts):
"""load an animation from an image
ani_load(tv,name,image,size,shape,parts)
- tv
- vid to load into
- name
- prefix name to give the images
- image
- image to load anis from
- size
- w,h size of image
- shape
- shape of image (usually a subset of 0,0,w,h) used for collision detection
- parts
- list of parts to divide the animation into
for example parts = [4,5] would yield 4 animations 5 frames long, 20 total
for example parts = [a,b,c] would yield ... images['name.a.b.c'] ..., a*b*c total
"""
parts = parts[:]
parts.reverse()
w,h = size
frames = []
for y in xrange(0,img.get_height(),h):
for x in xrange(0,img.get_width(),w):
frames.append(img.subsurface(x,y,w,h))
_ani_load(tv,name,parts,frames,shape)
def image_rotate(tv,name,img,shape,angles,diff=0):
"""rotate an image and put it into tv.images
image_rotate(tv,name,image,shape,angles,diff=0)
- tv
- vid to load into
- name
- prefix name to give the images
- image
- image to load anis from
- shape
- shape fimage (usually a subset of 0,0,w,h) used for collision detection
- angles
- a list of angles to render in degrees
- diff
- a number to add to the angles, to correct for source image not actually being at 0 degrees
"""
w1,h1 = img.get_width(),img.get_height()
shape = pygame.Rect(shape)
ps = shape.topleft,shape.topright,shape.bottomleft,shape.bottomright
for a in angles:
img2 = pygame.transform.rotate(img,a+diff)
w2,h2 = img2.get_width(),img2.get_height()
minx,miny,maxx,maxy = 1024,1024,0,0
for x,y in ps:
x,y = x-w1/2,y-h1/2
a2 = math.radians(a+diff)
#NOTE: the + and - are switched from the normal formula because of
#the weird way that pygame does the angle...
x2 = x*math.cos(a2) + y*math.sin(a2)
y2 = y*math.cos(a2) - x*math.sin(a2)
x2,y2 = x2+w2/2,y2+h2/2
minx = min(minx,x2)
miny = min(miny,y2)
maxx = max(maxx,x2)
maxy = max(maxy,y2)
r = pygame.Rect(minx,miny,maxx-minx,maxy-miny)
#print r
#((ww-w)/2,(hh-h)/2,w,h)
tv.images["%s.%d"%(name,a)] = img2,r