質問: K_ESCAPE: pygame.quit() sys.exit() main() ``` ### 試したこと 初心者なりに試行錯誤していますができていません
回答: ジェネレーターを用いた実装例です。 1 tick 毎に next 関数で読み出す事で、 フレーム毎の座標を返す関数として記述できます。 range() 関数 例えば、y: 0 -> 100 迄 10 単位で移動する y の変化は、range(0, 100, 10) と表現できるので、 [0, 10, 20, ..., 90] という、座標の遷移を表す数列が作れます。※ 終点は含みません。 この数列をジェネレーターにして、1フレーム毎に1つづつ読み出す事で アニメーション処理(座標の移動)を実現できます。 zip() 関数 2つ以上のリストを組み合わせるのに使います。x, y の掛け合わせに利用。 `zip([1, 2, 3], [4, 5, 6]) -> [(1, 4), (2, 5), (3, 6)]` ``` ... # 略 def move_image(x=0, y=0, vx=2, vy=2): # NOTE: サンプル提示が目的の為、コードを簡略化して境界チェックを省いてますが、 # 終点座標に誤差はあります。range(0, 100, 10) は 100 を含みません # 下方向の移動 y軸を変化 for y in range(y, 100, vy): yield x, y # 右方向の移動 x軸を変化 for x in range(x, 100, vx) yield x, y # 斜めに移動 ... x/y の移動を zip で掛け合わせる # 注意点: 移動する「フレーム数」が同じになる様に、移動量は事前に調整・計算しておく for x, y in zip(range(x, 0, -vx), range(y, 0, -vy)): yield x, y pos = 0, 0 animation = move_image(*pos) while True: click.tick(60) screen.fill((0, 0, 0)) pos = next(animation, pos) screen.blit(img, pos) pygame.display.update() ... # 略 ```