Menu
CoddyTech

Vector2

Thuộc phần Vòng lặp trò chơi trong hành trình Pygame của Coddy. Bài học 23 trên 35.

Vị trí gồm hai số, vận tốc cũng vậy: tốc độ theo trục x và tốc độ theo trục y. pygame.Vector2 giữ hai số cùng nhau và thực hiện phép tính trên cả hai cùng lúc:

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

pos += vel * dt

vel * dt nhân cả hai thành phần, còn pos += ... cộng cả hai thành phần, vì vậy một dòng lệnh giúp bóng di chuyển sang phải 150 pixel mỗi giây và đi xuống 90 pixel mỗi giây. pos.x và pos.y đọc hoặc thay đổi từng thành phần, còn pygame.draw.circle nhận một Vector2 làm tâm.

Để bóng bật khỏi tường, hãy đổi chiều một thành phần của vận tốc. Khi bóng vượt qua một cạnh, vel.x = -vel.x đưa bóng bật ngược lại mà không ảnh hưởng đến tốc độ đi lên và đi xuống:

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

Bán kính của bóng là 16, nên ở vị trí 16 và 464, mép bóng vừa chạm hai cạnh của cửa sổ.

challenge icon

Thử thách

Trung bình

Cho quả bóng nảy quanh cửa sổ bằng hai Vector2.

  1. Thay x, y bằng pos = pygame.Vector2(240, 180) và vx, vy bằng vel = pygame.Vector2(150, 90).
  2. Di chuyển quả bóng bằng pos += vel * dt và vẽ nó tại pos.
  3. Đảo chiều vel.x khi pos.x nhỏ hơn 16 hoặc lớn hơn 464, và đảo chiều vel.y khi pos.y nhỏ hơn 16 hoặc lớn hơn 344.

Nhấn Chơi: quả bóng nảy quanh cửa sổ. Sau đó nhấn Kiểm tra.

Tự làm thử

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()

Tất cả bài học trong Vòng lặp trò chơi

Tự luyện tập: Playground Pygame