Menu
CoddyTech

Vector2

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

位置は2つの数値で表され、速度も同じです。x方向の速さとy方向の速さです。pygame.Vector2は2つの数値をまとめて保持し、両方に同時に算術演算を行います。

pos = pygame.Vector2(240, 180)
vel = pygame.Vector2(150, 90)

pos += vel * dt

vel * dtは両方の値に乗算し、pos += ...は両方の値を加算するため、1行でボールを毎秒右に150ピクセル、下に90ピクセル移動させます。pos.xとpos.yでそれぞれの値を読み取ったり変更したりでき、pygame.draw.circleは中心の指定にVector2を受け取ります。

壁で跳ね返すには、速度の片方の向きを反転させます。横の壁を越えたら、vel.x = -vel.xとしてボールを跳ね返し、上下方向の速さはそのままにします。

if pos.x < 16 or pos.x > 464:
    vel.x = -vel.x

ボールの半径は16なので、16と464の位置では、ボールの端がウィンドウの側面に接します。

challenge icon

チャレンジ

中級
  1. x, yをpos = pygame.Vector2(240, 180)に置き換え、vx, vyをvel = pygame.Vector2(150, 90)に置き換えます。
  2. pos += vel * dtでボールを移動させ、posの位置に描画します。
  3. pos.xが16未満または464を超えたときにvel.xの向きを反転させ、pos.yが16未満または344を超えたときにvel.yの向きを反転させます。

自分で試してみよう

import pygame

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

x, y = 240, 180
vx, vy = 150, 90
dt = 0

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

    x += vx * dt
    y += vy * dt

    screen.fill((30, 30, 46))
    pygame.draw.circle(screen, (80, 160, 255), (x, y), 16)
    pygame.display.flip()
    dt = clock.tick(60) / 1000

pygame.quit()

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

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