加速度と摩擦
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ピクセルになります。
チャレンジ
中級- ループ内で、
vel = pygame.Vector2(0, 0)をacc = pygame.Vector2(0, 0)に置き換え、各矢印キーでacc.xまたはacc.yに600または-600を設定します。 - パックを動かす前に、
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プレイグラウンド