Menu
CoddyTech

Vector2

Часть раздела Игровой цикл путешествия по Pygame на Coddy. Урок 20 из 32.

Позиция задаётся двумя числами, как и скорость: скоростью по x и скоростью по y. pygame.Vector2 объединяет два числа и выполняет арифметические операции сразу над обоими:

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

pos += vel * dt

vel * dt умножает обе составляющие, а pos += ... складывает обе составляющие, поэтому одна строка перемещает шар вправо на 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. Меняйте направление vel.x, когда pos.x меньше 16 или больше 464, а vel.y — когда pos.y меньше 16 или больше 344.

Попробуйте сами

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