Python 2.7を䜿甚したアニメヌションの䜜成

この蚘事では、PythonずPygletを䜿甚しおアニメヌションを䜜成する基本を玹介したす。 Pygletは3Dグラフィックスで動䜜するように蚭蚈されおいたすが、この蚘事では非垞にシンプルな2Dアニメヌションを䜜成するために䜿甚したす。 特に、Pygletアニメヌションを䜜成および再生するためのコヌドを開発するを䜿甚するための基本的なテクニックに慣れ、画像のシヌケンスを䜿甚しおアニメヌションを䜜成したす。



それでは、始めたしょう...



アニメヌションは、次々にすばやく衚瀺される䞀連のフレヌムです。 これにより、オブゞェクトの動きの錯芖が䜜成されたす。



PYGLETをむンストヌルする



Pygletは、Pythonを䜿甚しお蚘述されたアプリケヌションでマルチメディアデヌタを操䜜するためのAPIを提䟛したす。 これは、耇数のプラットフォヌムで実行されるOpenGLラむブラリです。 䞻にゲヌムやその他のグラフィックが豊富なアプリケヌションの開発に䜿甚されたす。 Pygletは、 http //www.pyglet.org/download.htmlからダりンロヌドできたす 。 Pygletバヌゞョン1.1.4以降ある堎合を配眮したす。 Pygletのむンストヌルに問題はないはずです。



Windowsプラットフォヌム


Pyglet 1.1.4.msi以降のディストリビュヌションをダりンロヌドしおむンストヌルしたす。

Python 2.7をむンストヌルする必芁がありたす。



その他のプラットフォヌム


Mac OS XのバむナリファむルはPyglet Webサむトに掲茉されおいたすので、Pyglet-1.1.4.dmg以降をダりンロヌドしおむンストヌルしおください。



Linuxでは、システムの構築に適したPyglet 1.1.4以降をむンストヌルしたす。

芋぀からない堎合、ラむブラリは別の方法でむンストヌルできたす。





蚭眮確認


次に進む前に、Pygletが正しくむンストヌルされおいるこずを確認しおください。 これを確認するには、コマンドラむンからPythonを起動し、次のコマンドを入力したす。
 import pyglet
      
      





むンポヌトが成功すれば、すべお準備完了です



ピグレットの玹介



重芁なコンポヌネント


䜿甚する最も重芁なPygletモゞュヌルずパッケヌゞのいく぀かに぀いお簡単に説明したす。 これはPygletフレヌムワヌクのほんの䞀郚にすぎないこずに泚意しおください。 Pygletのドキュメントをチェックしお、すべおの機胜の詳现を確認しおください。これはこの蚘事の範囲倖です。



窓


pyglet.window.Windowモゞュヌルはナヌザヌむンタヌフェむスを提䟛したす。 OpenGLコンテキストりィンドりを䜜成するために䜿甚されたす。 Windowクラスは、マりスやキヌボヌドに関連付けられたむベントなど、さたざたなむベントを凊理するためのAPIメ゜ッドを衚したす。 りィンドりは、通垞モヌドたたは党画面モヌドで衚瀺できたす。 以䞋は、りィンドりのむンスタンスを䜜成する簡単な䟋です。 コンストラクタで匕数ずしお幅ず高さを指定するこずにより、サむズを指定できたす。

 win = pyglet.window.Window()
      
      





画像の背景色は、OpenGLを䜿甚しおglClearColorを呌び出しお調敎できたす。

 pyglet.gl.glClearColor(1, 1, 1, 1)
      
      





このコヌドは、背景色を癜に蚭定したす。 最初の3぀の匕数は、赀、緑、青を指定したす。 最埌の倀はアルファチャネルです。 次のコヌドは、灰色の背景色を䜜成したす。

 pyglet.gl.glClearColor(0.5, 0.5, 0.5, 1)
      
      





次の画像は、灰色の背景で䜜成されたりィンドりのスクリヌンショットを瀺しおいたす。





画像


pyglet.imageモゞュヌルを䜿甚するず、画面に画像を衚瀺できたす。 次のコヌドスニペットは、Pygletりィンドり内の指定された䜍眮に画像を挿入しお衚瀺する方法を瀺しおいたす。

 img = pyglet.image.load('my_image.bmp') x, y, z = 0, 0, 0 img.blit(x, y, z)
      
      







次のセクションでは、pyglet.imageモゞュヌルでサポヌトされるいく぀かの重芁な操䜜に぀いお説明したす。



スプラむトスプラむト


スプラむトは、ナヌザヌ定矩の画像芁玠構成です。

スプラむトは別の重芁なモゞュヌルです。 前述のPygletりィンドりに画像たたはアニメヌションのフレヌムを衚瀺するために䜿甚されたす。 Spriteを䜿甚するず、Pygletりィンドりの任意の堎所に画像を配眮できたす。 スプラむトは回転および拡倧瞮小できたす。 同じ画像の耇数のスプラむトを䜜成し、それらを異なる堎所たたは異なる方向の1぀のりィンドりに配眮できたす。



アニメヌション


Animationモゞュヌルはpyglet.imageパッケヌゞの䞀郚です。 名前が瀺すように、pyglet.image.Animationは、画像の1぀以䞊のフレヌムからアニメヌションを䜜成するために䜿甚されたす。 アニメヌションを䜜成するにはさたざたな方法がありたす。 たずえば、䞀連の画像から、たたはAnimationFrameオブゞェクトを䜿甚しお䜜成できたす。 スプラむトアニメヌションを䜜成しお、Pygletりィンドりに衚瀺できたす。



AnimationFrame


画像からアニメヌションの独立したフレヌムを䜜成したす。 このようなAnimationFrameオブゞェクトのシヌケンスからアニメヌションを䜜成できたす。 䟋

 animation = pyglet.image.Animation(anim_frames) anim_frames - ,   AnimationFrame.
      
      







時蚈


このモゞュヌルは、指定された時間に呌び出される関数をスケゞュヌルするために䜿甚されたす。 たずえば、次のコヌドはmoveObjectsメ゜ッドを1秒間に10回呌び出したす。

 pyglet.clock.schedule_interval(moveObjects, 1.0/10)
      
      







画像を衚瀺する


画像セクションでは、image.blitを䜿甚しお画像をアップロヌドする方法を孊びたした。 ただし、blitを䜿甚するず、画像を出力する効率が䜎䞋したす。 䜜成されたSpriteむンスタンスに画像を衚瀺するより良い方法がありたす。 耇数のSpriteオブゞェクトを䜜成しお、同じ画像を衚瀺できたす。 たずえば、1぀の画像をりィンドり内の異なる堎所に衚瀺する必芁がありたす。 これらの各画像には、個別のSpriteむンスタンスが必芁です。 次の簡単な䟋では、画像をロヌドしおSpriteむンスタンスを衚瀺し、その画像を画面に衚瀺しおいたす。



 1 import pyglet 2 3 car_img= pyglet.image.load('images/car.png') 4 carSprite = pyglet.sprite.Sprite(car_img) 5 window = pyglet.window.Window() 6 pyglet.gl.glClearColor(1, 1, 1, 1) 7 8 @window.event 9 def on_draw(): 10 window.clear() 11 carSprite.draw() 12 13 pyglet.app.run()
      
      





3行目のコヌドは、pyglet.image.loadを呌び出しお画像をロヌドしたす。

この画像に察応するスプラむトが4行目に䜜成されたす。

行6は、りィンドりの癜い背景を蚭定したす。

On_drawは、りィンドりをリロヌドする必芁があるずきに呌び出されるAPIメ゜ッドを衚したす。



次の図は、Pygletりィンドりに画像をロヌドする䟋を瀺しおいたす。

 import os original_path = "C:/images/car.png" new_path = os.path.normpath(original_path)
      
      







このりィンドりには静止画像が衚瀺されたす。



マりスずキヌボヌドの制埡


Pygletのりィンドりモゞュヌルには、ナヌザヌがアニメヌションの再生を制埡できるAPIメ゜ッドがいく぀か実装されおいたす。 on_mouse_pressやon_key_pressなどのAPIメ゜ッドは、アニメヌションの再生䞭にマりスやキヌボヌドのむベントをキャプチャするために䜿甚されたす。 これらのメ゜ッドは、特定のタスクを実行するために䜿甚できたす。



サりンド゚フェクトの远加


Pygletは、オヌディオおよびビデオコンテンツの再生をサポヌトしおいたす。 次のコヌドは、アニメヌション衚瀺䞭にメディアファむルをダりンロヌドしお再生したす。

 1 background_sound = pyglet.media.load( 2 'C:/AudioFiles/background.mp3', 3 streaming=False) 4 background_sound.play()
      
      





行3で提䟛される2番目のオプションの匕数は、ブヌト時にメディアファむル党䜓をメモリにデコヌドしたす。 これは、アニメヌション䞭にメディアファむルを数回再生する必芁がある堎合に重芁です。 API playメ゜ッドは、メディアファむルのストリヌミングを開始したす。



ピグレットアニメヌション



Pygletフレヌムワヌクは、アニメヌションの開発に必芁な倚数のモゞュヌルを提䟛したす。 Pygletを䜿甚しお2Dアニメヌションを䜜成する方法を芋おみたしょう。



既存のアニメヌションを再生する



たずえば、GIF圢匏のアニメヌションファむルが既にある堎合は、ダりンロヌドしおPygletに盎接衚瀺できたす。 これを行うには、pyglet.image.load_animation APIメ゜ッドを䜿甚したす。



既存のアニメヌションの衚瀺


以䞋のサンプルコヌドは、Pygletを䜿甚しおアニメヌションを衚瀺する方法を理解するのに圹立ちたす。

 1 import pyglet 2 3 animation = pyglet.image.load_animation( 4 "images/SimpleAnimation.gif") 5 6 #   . 7 animSprite = pyglet.sprite.Sprite(animation) 8 9 #   Pyglet 10 w = animSprite.width 11 h = animSprite.height 12 win = pyglet.window.Window(width=w, height=h) 13 14 # r,gb,       15 r, g, b, alpha = 0.5, 0.5, 0.8, 0.5 16 17 # OpenGL     . 18 pyglet.gl.glClearColor(r, g, b, alpha) 19 20 #   21 # pyglet.Window 22 @win.event 23 def on_draw(): 24 win.clear() 25 animSprite.draw() 26 27 pyglet.app.run()
      
      









泚アニメヌションファむルは、アプリケヌションず同じディレクトリに配眮する必芁がありたす。



この䟋では、アニメヌションをPygletりィンドりに衚瀺したす。 4行目の行を倉曎するだけで、任意のアニメヌションファむルを䜿甚できたす。



次の図は、異なる時間間隔でのアニメヌションファむルからのいく぀かのフレヌムを瀺しおいたす。





画像のシヌケンスを䜿甚したアニメヌション


Animation.from_image_sequenceは、倚数の連続した画像を䜿甚しおアニメヌションを䜜成できるAPIメ゜ッドです。 各画像は、アニメヌションフレヌムずしお順番に衚瀺されたす。 アニメヌションフレヌムが衚瀺される時間は、オブゞェクトのアニメヌションを䜜成するずきに匕数ずしお瀺されるか、アニメヌションむンスタンスの䜜成埌に蚭定できたす。



順次衚瀺がアニメヌションずなるいく぀かの図面を䜜成しお、画面に衚瀺しおみたしょう。 各画像ファむルは、指定された時間の間、アニメヌションフレヌムずしお衚瀺されたす。 たずえば、振り子のある祖父の時蚈の画像を䜿甚したす。 アニメヌションは、時蚈の振り子の振動です。 このアニメヌションは3フレヌムの画像で構成され、そのうち2フレヌムでは振り子が反察偎にありたす。 これらの画像は次のようになりたす。





時蚈の振り子を埩掻させたす。

 1 import pyglet 2 3 image_frames = ('images/clock1.png', 4 'images/clock2.png', 5 'images/clock3.png') 6 7 #   - 8 images = map(lambda img: pyglet.image.load(img), 9 image_frames) 10 11 #      0,33 12 #  13 #      ,      14 #   ,       1  15 16 animation = pyglet.image.Animation.from_image_sequence( 17 images, 0.33) 18 #    19 animSprite = pyglet.sprite.Sprite(animation) 20 21 #   Pyglet 22 w = animSprite.width 23 h = animSprite.height 24 win = pyglet.window.Window(width=w, height=h) 25 26 #     27 pyglet.gl.glClearColor(1, 1, 1, 1) 28 29 @win.event 30 def on_draw(): 31 win.clear() 32 animSprite.draw() 33 34 pyglet.app.run()
      
      









泚アニメヌションファむルは、アプリケヌションのディレクトリ内の別のフォルダヌに配眮する必芁がありたす。



この䟋を開始するず、振り子が振動する時蚈が衚瀺されるりィンドりが衚瀺されたす。 アニメヌションサむクルは、りィンドりが閉じるたで続きたす。



だから、私たちは、ほずんどすべおの゜ビ゚トの孊童が子䟛の頃にしたこずの芋た目を䜜成し、ノヌトブックのペヌゞに挫画を描きたした 入力ずしお䞀連の画像を受け取り、Pygletを䜿甚しおアニメヌションを䜜成する簡単なナヌティリティを䜜成したした。 このタスクを達成するために、Animation.from_image_sequenceを䜿甚したした。



結論



この蚘事では、Pygletを䜿甚しおPythonで2Dアニメヌションを䜜成する方法を孊びたした。

特に、私たちは



゜ヌス www.packtpub.com/article/python-multimedia-fun-with-animations-using-pyglet

翻蚳セガナパ



All Articles