Как сделать гравитацию и прыжок в флаппи-бёрд на pygame?
Пишу свой Flappy Bird. Птица рисуется, но не пойму, как сделать так, чтобы она падала сама, а по нажатию пробела подпрыгивала вверх. У меня она либо стоит, либо мгновенно улетает. Как сделать плавную гравитацию?
2 ответа
Секрет в том, что у птицы есть вертикальная скорость, которую гравитация постоянно увеличивает вниз, а прыжок резко задаёт вверх (отрицательное значение).
bird_y = 250
bird_speed = 0
GRAVITY = 0.5
JUMP = -8
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:
bird_speed = JUMP # резкий толчок вверх
bird_speed += GRAVITY # гравитация тянет вниз каждый кадр
bird_y += bird_speed # двигаем птицу
screen.fill((100, 180, 255))
pygame.draw.circle(screen, (255, 220, 0), (120, int(bird_y)), 18)
pygame.display.flip()
clock.tick(60)
Каждый кадр гравитация прибавляется к скорости, скорость — к позиции. Поэтому без нажатий птица разгоняется вниз (плавное падение), а пробел мгновенно даёт скорость вверх, и она по дуге взлетает и снова начинает падать. Подбери GRAVITY и JUMP под себя.
Прыжок лови именно через KEYDOWN (одно нажатие), а не через key.get_pressed() — иначе при зажатом пробеле птица будет «прилипать» к потолку. Для движения держим get_pressed, для разовых действий типа прыжка/выстрела — KEYDOWN.