Menu
CoddyTech

加速度と摩擦

CoddyのPygameジャーニー「ゲームループ」セクションの一部。レッスン 21/32。

パックは最初から最高速度で動き、キーを離すとすぐに止まります。氷の上では、速度が増して滑るようにしたいところです。そのために、2つ変更します。

加速度とは、速度が毎秒どれだけ変化するかをピクセル単位で表したものです。キーによって加速度が設定され、加速度によって速度が変化します。

acc = pygame.Vector2(0, 0)
if keys[pygame.K_RIGHT]:
    acc.x = 600

vel += acc * dt
vel -= vel * 2 * dt
pos += vel * dt

キーが押されていないときに加速度がゼロになるよう、各フレームでaccを新しく作ります。速度はフレームごとに値を保つので、パックは滑り続けます。

摩擦は2行目です。vel * 2 * dtは速度の一部で、パックが速いほど大きくなります。毎フレームこれを差し引くと、速いパックはすぐに、遅いパックはゆっくり減速し、やがて止まります。2より大きな数にすると、床の滑りが悪くなります。

押し続けると、押す力と摩擦が釣り合い、最高速度は毎秒600 / 2 = 300ピクセルになります。

challenge icon

チャレンジ

中級
  1. ループ内で、vel = pygame.Vector2(0, 0)をacc = pygame.Vector2(0, 0)に置き換え、各矢印キーでacc.xまたはacc.yに600または-600を設定します。
  2. パックを動かす前に、acc * dtをvelに加え、次にvel * 2 * dtをそこから引きます。

自分で試してみよう

import pygame

pygame.init()
screen = pygame.display.set_mode((480, 360))
pygame.display.set_caption("Ice Puck")
clock = pygame.time.Clock()

pos = pygame.Vector2(240, 180)
vel = pygame.Vector2(0, 0)
dt = 0

running = True
while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    keys = pygame.key.get_pressed()
    vel = pygame.Vector2(0, 0)
    if keys[pygame.K_LEFT]:
        vel.x = -200
    if keys[pygame.K_RIGHT]:
        vel.x = 200
    if keys[pygame.K_UP]:
        vel.y = -200
    if keys[pygame.K_DOWN]:
        vel.y = 200

    pos += vel * dt
    pos.x = max(14, min(pos.x, 466))
    pos.y = max(14, min(pos.y, 346))

    screen.fill((200, 225, 240))
    pygame.draw.circle(screen, (40, 50, 70), pos, 14)
    pygame.display.flip()
    dt = clock.tick(60) / 1000

pygame.quit()

ゲームループのすべてのレッスン

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