Vector2
Часть раздела Игровой цикл путешествия по Pygame на Coddy. Урок 20 из 32.
Позиция задаётся двумя числами, как и скорость: скоростью по x и скоростью по y. pygame.Vector2 объединяет два числа и выполняет арифметические операции сразу над обоими:
pos = pygame.Vector2(240, 180)
vel = pygame.Vector2(150, 90)
pos += vel * dtvel * 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 его край касается боковых сторон окна.
Задание
Средне- Замените
x, yнаpos = pygame.Vector2(240, 180), аvx, vy— наvel = pygame.Vector2(150, 90). - Перемещайте мяч с помощью
pos += vel * dtи рисуйте его в точкеpos. - Меняйте направление
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