Python (パイソン) であそぼう 2
〜 pygame で Matrix のアレ 〜
2022-03-21 作成 福島
TOP > asob > pygame-anime
[ TIPS | TOYS | OTAKU | LINK | MOVIE | CGI | AvTitle | ConfuTerm | HIST | AnSt | Asob | Shell ]

アニメーションとは

知っている人も多いと思いますが、少しずつ異なる複数枚の絵を定期的に入れ替えると絵が動いて見えます。
それがアニメーションです。よくパラパラマンガに例えられます。

これと同じように、コンピュータでもいくつかの絵を用意し、定期的に切り替えることによってアニメーションを作ることが出来ます。
ビデオゲームも、同じ原理で作られます。

絵を用意するのは大変なうえ、ここではコンピュータの使い方を説明するので、「文字を使った疑似画*」を切り替えることによって、アニメーションを実現します。
この疑似画を、もっと細かくしたのが「CG アニメーション」と呼ばれるものになります。
*アスキーアートとも呼ばれます。

映画 Matrix のオープニングで有名な、文字が上から流れる画面を真似てみます。
かなりカクカクとした表示ですが、基本の学習にはちょうど良いでしょう。
ぜひ、滑らかに表示される方法を考えてみてください。


0. 事前準備

0-1. この章では、pygame を使います。
インストールがまだなら、ここ (Windows10)ここ (CentOS) を参考にしてインストールしておいてください。
0-2. この章では、テキストエディタを使います。
Linux なら付属の「Vim」や「gedit」で十分です。
(Vim の初心者向け使い方はここにあります)

Windows なら「メモ帳」でも構いませんが、本格的なテキストエディタをお勧めします。
(強力なアンドゥや、キーマクロが使えるようになります)
インストールがまだなら、ここ (秀丸エディタ) を参考にしてインストールしておいてください。
また、プログラムを起動するには拡張子が重要となるので、エクスプローラーで拡張子が表示されるようにしておいてください。
0-3. 未経験者向けの情報を省いています。
プログラミング未経験の方は、予めこちら (Python であそぼう 1) を学習しておくことを推奨します。


1. 文字のアニメーションプログラム

' ' は空白文字 (スペースキーで入力) です。TAB 文字とは異なるので注意してください。
page = [
[   # 1
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
],
[   # 2
"              z  ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
],
[   # 3
"    Z         i  ",
"              z  ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
],
[   # 4
"G  _[   mS  ( = 3",
"    Z         i  ",
"              z  ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
],
[   # 5
":  pGy  YQ  y ] H",
"G  _[   mS  ( = 3",
"    Z         i  ",
"              z  ",
"                 ",
"                 ",
"                 ",
"                 ",
"                 ",
],
[   # 6
"B VgU8S(E* V/ eu@",
":  pGy  YQ  y ] H",
"G  _[   mS  ( = 3",
"    Z         i  ",
"              z  ",
"                 ",
"                 ",
"                 ",
"                 ",
],
[   # 7
"b 2E;XsLT9 xP M!w",
"B VgU8S(E* V/ eu@",
":  pGy  YQ  y ] H",
"G  _[   mS  ( = 3",
"    Z         i  ",
"              z  ",
"                 ",
"                 ",
"                 ",
],
[   # 8
"PFRpx(Y_%| 742Oy=",
"b 2E;XsLT9 xP M!w",
"B VgU8S(E* V/ eu@",
":  pGy  YQ  y ] H",
"G  _[   mS  ( = 3",
"    Z         i  ",
"              z  ",
"                 ",
"                 ",
],
[   # 9
"WrBj*B_Q5;+87u5:p",
"PFRpx(Y_%| 742Oy=",
"b 2E;XsLT9 xP M!w",
"B VgU8S(E* V/ eu@",
":  pGy  YQ  y ] H",
"G  _[   mS  ( = 3",
"    Z         i  ",
"              z  ",
"                 ",
],
[   # 10
"n_k(z0q@uxV:tY|7p",
"WrBj*B_Q5;+87u5:p",
"PFRpx(Y_%| 742Oy=",
"b 2E;XsLT9 xP M!w",
"B VgU8S(E* V/ eu@",
":  pGy  YQ  y ] H",
"G  _[   mS  ( = 3",
"    Z         i  ",
"              z  ",
],
[   # 11
"=DbX=U5sUK1dO6I'P",
"n_k(z0q@uxV:tY|7p",
"WrBj*B_Q5;+87u5:p",
"PFRpx(Y_%| 742Oy=",
"b 2E;XsLT9 xP M!w",
"B VgU8S(E* V/ eu@",
":  pGy  YQ  y ] H",
"G  _[   mS  ( = 3",
"    Z         i  ",
],
[   # 12
"!F;p6vbv<XTRiOKNi",
"=DbX=U5sUK1dO6I'P",
"n_k(z0q@uxV:tY|7p",
"WrBj*B_Q5;+87u5:p",
"PFRpx(Y_%| 742Oy=",
"b 2E;XsLT9 xP M!w",
"B VgU8S(E* V/ eu@",
":  pGy  YQ  y ] H",
"G  _[   mS  ( = 3",
],
[   # 13
"Hsa3_51Iqq]w<)+8[",
"!F;p6vbv<XTRiOKNi",
"=DbX=U5sUK1dO6I'P",
"n_k(z0q@uxV:tY|7p",
"WrBj*B_Q5;+87u5:p",
"PFRpx(Y_%| 742Oy=",
"b 2E;XsLT9 xP M!w",
"B VgU8S(E* V/ eu@",
":  pGy  YQ  y ] H",
],
[   # 14
"ab:D3myzTJ|EDZx*Z",
"Hsa3_51Iqq]w<)+8[",
"!F;p6vbv<XTRiOKNi",
"=DbX=U5sUK1dO6I'P",
"n_k(z0q@uxV:tY|7p",
"WrBj*B_Q5;+87u5:p",
"PFRpx(Y_%| 742Oy=",
"b 2E;XsLT9 xP M!w",
"B VgU8S(E* V/ eu@",
],
[   # 15
")0k>JS$jjvTl8j)gC",
"ab:D3myzTJ|EDZx*Z",
"Hsa3_51Iqq]w<)+8[",
"!F;p6vbv<XTRiOKNi",
"=DbX=U5sUK1dO6I'P",
"n_k(z0q@uxV:tY|7p",
"WrBj*B_Q5;+87u5:p",
"PFRpx(Y_%| 742Oy=",
"b 2E;XsLT9 xP M!w",
],
[   # 16
"F*wz0eU;1;_1FgQ*M",
")0k>JS$jjvTl8j)gC",
"ab:D3myzTJ|EDZx*Z",
"Hsa3_51Iqq]w<)+8[",
"!F;p6vbv<XTRiOKNi",
"=DbX=U5sUK1dO6I'P",
"n_k(z0q@uxV:tY|7p",
"WrBj*B_Q5;+87u5:p",
"PFRpx(Y_%| 742Oy=",
],
[   # 17
"vG+m/[I*od'_6C;T'",
"F*wz0eU;1;_1FgQ*M",
")0k>JS$jjvTl8j)gC",
"ab:D3myzTJ|EDZx*Z",
"Hsa3_51Iqq]w<)+8[",
"!F;p6vbv<XTRiOKNi",
"=DbX=U5sUK1dO6I'P",
"n_k(z0q@uxV:tY|7p",
"WrBj*B_Q5;+87u5:p",
],
]


# 画面を描画する関数 def display(page): screen.fill((0,0,0)) # グラフィック画面を黒色で塗りつぶす。 rasterCnt = 0 font = pygame.font.SysFont('msgothic', 32) for line in page: # 1 行を取得する。 for column in range(len(line)): # 1 行分繰り返す。 c = font.render(line[column], False, (0,255,0)) # 1 文字を取り出す。 screen.blit(c, (column*16, rasterCnt*32)) # 取り出した 1 文字を描画する。 rasterCnt += 1 pygame.display.update()
# グラフィック画面 (と clock オブジェクト) を準備する。 import pygame pygame.init() screen = pygame.display.set_mode((320,240)) pgclock = pygame.time.Clock() pageMax = len(page) # 表示ページ数を取得する。 pageCnt = 0 # 表示のインデックスを初期化する。 running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False # × で終了する。 display(page[pageCnt]) # 画面をひとつ描画する。 pageCnt = (pageCnt + 1) % pageMax # 表示のインデックスを次へ進める。 pgclock.tick(5) # WAIT を入れる。
この章は、ここで終了です。