Menu
CoddyTech

目標に向かって移動する

CoddyのPygameジャーニー「サウンドとゲームの手応え」セクションの一部。レッスン 16/23。

クリックすると、円がそこへ瞬間移動します。滑らかに位置へ移動するもののほうが見栄えがします。最初は速く、その後は遅くなり、目的の位置にそっと落ち着きます。それを実現するのは1行だけです。各フレームで、残りの距離の一部だけ移動します。

x += (target_x - x) * 0.1
y += (target_y - y) * 0.1

target_x - xは、移動すべき距離です。その10分の1だけ移動すると、200ピクセルの移動の最初のフレームでは20ピクセル進みます。次のフレームでは残りが180ピクセルなので18ピクセル進み、次は16.2ピクセルというように続きます。円が近づくにつれて移動幅が小さくなるため、急に止まるのではなく、滑らかに減速します。

これは一般にlerpと呼ばれ、linear interpolation(線形補間)の略です。この割合で動きの印象が決まります。0.1は滑らか、0.3はキビキビ、0.02はゆっくりと浮遊するような動きです。目標地点に正確に到達することはありませんが、1秒後には1ピクセル未満の距離まで近づくため、誰にも見えません。

xとyは、それぞれ別の変数に小数として保持してください。Rectは整数を格納するため、0.4ピクセルの移動量は0に切り捨てられ、目標に届く前に移動が止まってしまいます。

challenge icon

チャレンジ

簡単

円はクリックするたびに跳びます。滑らかに移動させましょう。x = target_xとy = target_yを、各フレームでxとyを目標までの距離の10分の1だけ移動させる行に置き換えてください。

自分で試してみよう

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Follow the Click")
clock = pygame.time.Clock()

x, y = 240, 180
target_x, target_y = 240, 180

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            target_x, target_y = event.pos

    x = target_x
    y = target_y

    screen.fill((30, 30, 46))
    pygame.draw.line(screen, (90, 90, 110), (target_x - 8, target_y), (target_x + 8, target_y), 2)
    pygame.draw.line(screen, (90, 90, 110), (target_x, target_y - 8), (target_x, target_y + 8), 2)
    pygame.draw.circle(screen, (80, 200, 220), (x, y), 12)
    pygame.display.flip()
    clock.tick(60)

pygame.quit()

サウンドとゲームの手応えのすべてのレッスン

自分で練習してみよう: Pygameプレイグラウンド