Menu
CoddyTech

Vector2

Parte da seção O loop do jogo do Journey de Pygame da Coddy. Lição 20 de 32.

Uma posição é composta por dois números, assim como uma velocidade: a velocidade em x e a velocidade em y. pygame.Vector2 mantém dois números juntos e faz operações aritméticas com ambos ao mesmo tempo:

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

pos += vel * dt

vel * dt multiplica as duas partes e pos += ... soma as duas partes, então uma linha move a bola 150 pixels por segundo para a direita e 90 para baixo. pos.x e pos.y leem ou alteram uma das partes, e pygame.draw.circle recebe um Vector2 como centro.

Para rebater em uma parede, inverta uma das partes da velocidade. Ao passar de um dos lados, vel.x = -vel.x manda a bola de volta e mantém sua velocidade para cima e para baixo inalterada:

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

O raio da bola é 16, então, em 16 e 464, sua borda encosta nas laterais da janela.

challenge icon

Desafio

Médio
  1. Substitua x, y por pos = pygame.Vector2(240, 180) e vx, vy por vel = pygame.Vector2(150, 90).
  2. Mova a bola com pos += vel * dt e desenhe-a em pos.
  3. Inverta vel.x quando pos.x estiver abaixo de 16 ou acima de 464, e vel.y quando pos.y estiver abaixo de 16 ou acima de 344.

Experimente você mesmo

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

Todas as lições de O loop do jogo

Pratique por conta própria: Playground de Pygame