[pukiwiki]
[[昨日の記事のつづき:http://boxheadroom.com/2009/05/20/py_animated_gif]]
ありがちですけれども、マウスでイラストを描いた様子をアニメで再現するツール。
たとえばこんなGIFアニメを作れます
http://boxheadroom.com/wp/wp-content/uploads/2009/05/ehenmusi.gif
若い人は[[エヘン虫>ググる:エヘン虫 ヴィックスドロップ]]って知らないかも(汗
[/pukiwiki]
[pukiwiki]
ほんとはTkinterに移植したかったのですけれども、、、いまだにTkinterがよくわからないので、PyGameで(汗
—-
つかいかた
-動作させると、ボタンも何も無い、真っ白なPyGameのウィンドウが開きます。
-マウスボタンを押して絵を描きます
-ウィンドウを閉じるとGIFアニメを保存します。
-4分の1に縮小されます。
ファイル名は animated.gif 固定。
-ロード、修正機能など一切ありません。書き損なったら最初から(^^;
—-
動作 Vista , Python2.5
使用ライブラリ PIL , PyGame
参考ページ
[[Pythonでゲーム作りますが何か?:http://pygame.skr.jp/index.php?FrontPage]]
まだまだ未完成ですが、たぶん、改良する時間がとれないかも(汗
[/pukiwiki]
# -*- coding: utf-8 -*- import pygame from pygame.locals import * import Image import easygui import sys from gifmaker2 import GifMaker W,H=640,480 W4,H4=W//4,H//4 SCR_RECT = Rect(0, 0, W,H) def load_image(filename): image = pygame.image.load(filename) return image.convert_alpha() class Pen(pygame.sprite.Sprite): def __init__(self): #ペン用の画像を作成 pygame.sprite.Sprite.__init__(self, self.containers) image=pygame.Surface((16,16)) image.fill((255, 255, 255)) pygame.draw.ellipse(image,(0,0,0),(1,1,14,14)) self.image1 = image.convert() colorkey = image.get_at((0,0)) self.image1.set_colorkey(colorkey, RLEACCEL) image=pygame.Surface((16,16)) image.fill((255, 255, 255)) pygame.draw.ellipse(image,(0,0,0),(1,1,14,14),1) self.image2 = image.convert() colorkey = image.get_at((0,0)) self.image2.set_colorkey(colorkey, RLEACCEL) self.image=self.image2 self.rect=self.image.get_rect() self.pos=self.rect.center=SCR_RECT.center def move(self,pos): self.rect.center=self.pos=pos def update(self): self.rect.center=self.pos self.rect.clamp_ip(SCR_RECT) def save(): fname=easygui.filesavebox(msg="Save as Animated GIF", title="Input Save File Name", default="animated.gif",filetypes=["gif"]) def deco(f): return f() def test(fname="animated.gif", speed=8,wait=3000): global gm gm=GifMaker(mode="1",duration=0,loop=0,cls=GifMaker.cls_bg,trans=False) @deco def eventhandler(): def case_QUIT (event): if event.type == QUIT: pygame.quit() raise "QUIT" #sys.exit() @deco def case_KEYDOWN(): def case_K_ESCAPE(event): pygame.quit() raise "QUIT" def case_K_DELETE(event): gm.writeframe(Image.fromstring( "RGBA",(W,H),str(sc.get_buffer().raw)).resize((W4,H4),0), duration=100) sc.fill((255,255,255)) gm.writeframe(Image.fromstring( "RGBA",(W,H),str(sc.get_buffer().raw)).resize((W4,H4),0), duration=100) case={K_ESCAPE:case_K_ESCAPE, K_DELETE:case_K_DELETE} def keyhandler(event): case.get(event.key,default)(event) return keyhandler def case_MOUSEMOTION(event): #print event.pos, event.rel, event.buttons pen.move(event.pos) def case_MOUSEBUTTONDOWN(event): #print event.pos, event.button pen.image=pen.image1 def case_MOUSEBUTTONUP(event): #print event.pos, event.button pen.image=pen.image2 def default(event): return #for k in dir(event) : #print getattr(event,k) case={QUIT:case_QUIT, KEYDOWN:case_KEYDOWN, MOUSEMOTION:case_MOUSEMOTION, MOUSEBUTTONDOWN:case_MOUSEBUTTONDOWN, MOUSEBUTTONUP:case_MOUSEBUTTONUP } def eventhandler(): for event in pygame.event.get(): c=event.type if c in case : case[c](event) else : for k in dir(event) : print getattr(event,k) default(event) return eventhandler pygame.init() screen = pygame.display.set_mode(SCR_RECT.size) # スプライトグループを作成して登録 all = pygame.sprite.RenderUpdates() Pen.containers = all # スプライトの画像を登録 pen=Pen() clock = pygame.time.Clock() f=0 x,y=screen.get_rect().center sc=pygame.Surface((W,H)) sc.fill((255, 255, 255)) lastpos=None skip=0 gm.writeframe(Image.fromstring("RGBA",(W,H), str(sc.get_buffer().raw)).resize((W4,H4),0)) try: while True: clock.tick(60) if pen.image==pen.image1 and lastpos!=pen.pos: sc.blit(pen.image,pen.rect) lastpos=pen.pos if not skip: gm.writeframe(Image.fromstring( "RGBA",(W,H),str(sc.get_buffer().raw)).resize((W4,H4),0)) skip=(skip+1)%speed screen.fill((255, 255, 255)) #f=(f+1)%60 #if f : continue #print plane.rect.center eventhandler() #print [stick.direction,stick.button] screen.blit(sc,(0,0)) all.update() all.draw(screen) pygame.display.update() except "QUIT": gm.save(fname,wait=wait) if __name__=="__main__": test()
<<デバッグ記録>>
2009-05-21
-キーイベント処理 (規定外のキーを押したとき)
-何も描かないうちにウィンドウを閉じたときの対処