四角形を動かしてみます。まずは、ソースを載せます。
import pygame
import time
# 初期化
pygame.init()
pygame.display.set_caption("pygame アプリ")
surf = pygame.display.set_mode((480, 480))
# 色を定義しておく (タプル:固定)
COLOR_MAIN = (255, 196, 0)
COLOR_BG = (32, 32, 32)
# 座標, サイズ (リスト:変更可)
pos = [20, 80]
size = [64, 64]
speed = 2
# 閉じるを押すまでループ
running = True
while running:
# 座標更新
pos[0] += speed
# もし画面端にたどり着いた場合は反転
if pos[0] > (480 - size[0]) or pos[0] < 0:
speed *= -1
# 描画
surf.fill(COLOR_BG)
pygame.draw.rect(surf, COLOR_MAIN, (*pos, *size))
pygame.display.update()
# ウェイト
time.sleep(0.015)
# イベント
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
上記を実行すると次のようになります。
前回との差分箇所を説明します。
# 色を定義しておく (タプル:固定)
COLOR_MAIN = (255, 196, 0)
COLOR_BG = (32, 32, 32)
今回はあらかじめ使用する色を定義することにしました。なお、要素を ( )
で囲むとタプルとなります。変更ができないオブジェクトです。
# 座標, サイズ (リスト:変更可)
pos = [20, 80]
size = [64, 64]
speed = 2
座標とサイズもそれぞれ定義しました。[ ]
で囲むとリストとなります。こちらは変更ができます。また、speed
を追加しています。後に使用します。
while running:
# 座標更新
pos[0] += speed
# もし画面端にたどり着いた場合は反転
if pos[0] > (480 - size[0]) or pos[0] < 0:
speed *= -1
# 描画
surf.fill(COLOR_BG)
pygame.draw.rect(surf, COLOR_MAIN, (*pos, *size))
pygame.display.update()
「動かす」とはつまり、「毎描画毎に座標を動かす」こと他なりません。pos[0]
を毎描画毎に書き換えて、位置を更新しています。リストは [0]
というような記述を後ろに足して、要素を指定して処理します。
「画面端で反転」はつまり、「座標が 480-自身の大きさ となったら、速度の符号を反転させる」です。
さて、pygame.draw.rect(surf, COLOR_MAIN, (*pos, *size))
が前回の書き方と異なることに着目してください。COLOR_MAIN
は最初に生成した RGB が 3 つ格納されたタプルです。
*pos
と *size
は座標とサイズです。さて、*
はなんなのでしょうか。説明します。
* なし
([20, 80], [64, 64])
* あり
(20, 80, 64, 64)
要は、* を付けると [ ]
が外される訳です。関数の引数の型に合わせる際に使うことがあります。