#!/usr/bin/python from __future__ import division, generators import pygame,Image,sys,popen2,math from random import random import random as randmod import sys from Numeric import * import pygamedv ang=0 ttfpath='/usr/X11R6/lib/X11/fonts/TTF/' larpath=lambda fname: "/home/drewp/larabie/"+fname white=array([255,255,255]) _getfont={} # (name,size):font def getfont(name,size): global _getfont key=name,size if key not in _getfont: _getfont[key]=pygame.font.Font(name, size*dvsurf.scaling) return _getfont[key] for txt,pos,frames in [ # ("come to bed",(389,148),90), # ("click",(150,274),20), # ("whoosh",(386,87),220), ("drip1",(298,236),21), ("drip2",(342,233),21), ("drip3",(146,103),21), # ("creak",(300,268),42), # ("end1",(0,0),373), # ("end2",(0,0),184), # ("zzz",(500,63),285), ("credits",(0,0),150), ]: dvsurf=pygamedv.Dvsurf(scaling=2, # increase for more sampling (larger img) preview=1, # changes mode to the on-screen, 30fps preview filename='txt/txt-%s.dv'%txt.replace(' ','') ) img=dvsurf.image pos=array(pos)*dvsurf.scaling fnt=pygame.font.Font(ttfpath+'trebuc.ttf',45*dvsurf.scaling) #array(fnt.size(titletext)) if txt in ('end1','end2'): fnt=pygame.font.Font(ttfpath+'trebuc.ttf',30*dvsurf.scaling) words="knock vroom twang squish splat drip ring bark meow whirr clank murmur step creak bang tap blip thump squeak poof pow rustle squeak whisper snore beep".split() fonts="colourbb engeboit euphorig guanine_ junegull lesserco mufferaw overload pakenham pupcat__ screenge steelfib teen____ teenbdit torkb___ velvendc".split() words=words*4 wordpos=[] cent=(336,312) if txt=='end2': cent=(204,171) for i in range(len(words)): pos=array([random(),random()])*(640-90,480-40)+(10,10) v=pos-cent dist=sqrt(v[0]**2+v[1]**2) if dist<200+150*(txt=='end2'): pos=pos+(pos-cent)/dist*100 wordpos.append(pos*dvsurf.scaling) wordstart=[int(pow(random(),.6)*frames) for w in words] wordfont=[randmod.choice(fonts) for w in words] wordvib=[array([random(),random()])*(7,4)*dvsurf.scaling for w in words] for framenum in range(frames): dvsurf.startframe() frac=framenum/(frames-1) img.fill((0,0,0)) if txt.startswith('drip'): txt="drip" def dropshape(x,pointy): return pow(min(1,max(0,x)),1+2*pointy)*(1-x)/(.5-.44*pointy) fnt=pygame.font.Font(larpath('screenge.ttf'),70*dvsurf.scaling) lets=fnt.render(txt,1,white*(1-10*max(0,(frac-.9)))) # slices of the writing get stretched into the drop shape for y in range(lets.get_height()-1): fntslice=lets.subsurface((0,y,lets.get_width(),1)) yfrac=y/lets.get_height() enter = min(1,2*(frac+.2)) # /~ fall = max(0,(frac*2-1)) # _/ slicewidth = 230*dvsurf.scaling*dropshape(yfrac-1+enter, pointy=1-pow(frac,1)) fntslice = pygame.transform.scale(fntslice,(int(slicewidth),1)) img.blit(fntslice,pos+(-slicewidth/2, # center 150*dvsurf.scaling*pow(fall,2)+y+(enter-1)*lets.get_height())) elif txt=='creak': fnt=getfont(larpath("screenge.ttf"),100) # draw in scaled columns lets=fnt.render(txt,1,white) fracnoise=.2+.8*frac+random()*.1 for x in range(lets.get_width()-1): xfrac=x/lets.get_width() fntslice=lets.subsurface((x,0,1,lets.get_height())) ht=fntslice.get_height() ht=ht*(.1+.9*xfrac)*fracnoise fntslice=pygame.transform.scale(fntslice,(1,ht)) img.blit(fntslice,pos+(-50+x,40-ht)) elif txt=='click': fnt=getfont(larpath("mufferaw.ttf"),80) x=0 for i,l in enumerate(txt): lets=fnt.render(l,1,white) z=framenum*20-ord(l) if z>0 and not 60(1251-1114): pos=array([366,396]) x=frac*3+.1 ohs=sin(x*9)+sin(x*5)+.5*(sin(x*12)+sin(x*20)+sin(x*30)) ohs=4+1.5*ohs fnt=pygame.font.Font(larpath("pakenham.ttf"),60*dvsurf.scaling) txt2='wh'+'o'*int(ohs)+'sh' f=fnt.render(txt2,1,white) lpos=pos+array([sin(ang)*3-.2*f.get_width(),cos(ang)*3]) ang2=0 for let in txt2: f=fnt.render(let,1,white) img.blit(f,lpos) lpos=lpos+(f.get_width(),0)+array([sin(ang+ang2)*(3*ang2), cos(ang+ang2)*(3*ang2)]) ang2+=.3 ohs+=.1*(random()*2-1) elif txt=="come to bed": fnt=pygame.font.Font(larpath("torkb___.ttf"),30*dvsurf.scaling) img.blit(fnt.render("Come to bed!",1,white),pos+array([sin(ang)*3,cos(ang)*3])) elif txt in ('end1','end2'): for i,w in enumerate(words): pos=wordpos[i] if framenum>wordstart[i] or txt=='end2': fnt=getfont(larpath(wordfont[i]+".ttf"), (30+30*wordstart[i]/frames)) wordpos[i]=wordpos[i]+wordvib[i]*(random()*2-1)*.2 img.blit(fnt.render(w,1,white),pos) elif txt=='zzz': pos=(415,288) if framenum>(3268-3188): pos=(494,338) for i in range(15): f2=frac-i/15 if f2>0: letsize=45 col=array([255,255,255]) if framenum>(3268-3188): # later shot has smaller letters letsize=25 if f2<.1: # letters grow from nothing letsize=letsize*(f2/.1) col=col*(f2/.1) else: # size warbles letsize+=6*sin((f2-.1)*30) let=pygame.font.Font(ttfpath+'trebuc.ttf', int(letsize*dvsurf.scaling)).render('Z',1,col) off=array([30*sin(f2*10),-800*f2]) img.blit(let,pos+off) elif txt=="credits": fnt=getfont(larpath("teenbold.ttf"),50) id=0 for line,y in [("By Drew Perttula",100), ("Kelsi Hooper",180), ("and Micky",260)]: x=120*dvsurf.scaling y=y*dvsurf.scaling for ix,char in enumerate(line): off=(id)/40*.3 # some letters come later f = pow(max(0,1-((frac-off)*6)),2) c=fnt.render(char,1,clip(white*(1-f),0,255)) start=array([5*sin(id*4)+(25*f)*sin(30), cos(id*4)+(25*f)*cos(30) ])*100 img.blit(c,array([x,y])+f*start) x=x+c.get_width() id+=1 else: img.blit(fnt.render(txt,1,white),pos+array([sin(ang)*5,cos(ang)*5])) ang+=.5*1/30*6.28 #img.blit(fnt.render(str(framenum),1,white),(5,5)) dvsurf.writeframe()