Отставание/телепортация объекта при простой стимуляции pygame

Я пытаюсь создать простую программу, стимулирующую вращение звезд в бинарной системе, но когда я запускаю программу, одна из «звезд» глючит, практически телепортируясь по заданному пути в разные места. Как я могу это исправить? Вот код:

import pygame, sys, math, keyboard

run = True
black = (255, 255, 255)
white = (0, 0, 0)
angle = 0
size = width, height = 1550, 800
screen = pygame.display.set_mode(size)
clock = pygame.time.Clock()
screen.fill(black)

while run:
    msElapsed = clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    def star1():
        global angle
        screen.fill(white)
        x = int(math.cos(angle) * 70) + 775
        y = int(math.sin(angle) * 100) + 400
        pygame.draw.circle(screen, black, (x, y), 10)
        pygame.display.flip()
        angle += 0.05


    def star2():
        global angle
        screen.fill(white)
        x = int(math.cos(angle) * 100) + 775
        y = int(math.sin(angle) * 70) + 400
        pygame.draw.circle(screen, black, (x, y), 10)
        pygame.display.flip()
        angle += 0.05

    star1()
    star2()

    if keyboard.is_pressed('Esc'):
        print("System Terminated ('ESC')")
        sys.exit(0)

pygame.quit()

person Dante    schedule 15.01.2021    source источник
comment
@anurag на обзоре кода, это было бы закрыто как не по теме в мгновение ока. Код, который не работает должным образом, не по теме.   -  person Heslacher    schedule 15.01.2021


Ответы (1)


Проблема вызвана screen.fill(white) и многочисленными вызовами pygame.display.flip(). Функция fill() заполняет всю поверхность Surface. сплошным цветом. Вызовите fill один раз в начале цикла приложения. Достаточно обновления дисплея в конце цикла приложения. Множественные вызовы pygame.display.update() или pygame.display.flip() вызывают мерцание.

Удалите все вызовы pygame.display.flip() из кода, но вызовите его один раз в конце цикла приложения.

Вам вообще не нужен пакет keboard. Вместо этого используйте pygame.key.get_pressed().

while run:
    msElapsed = clock.tick(60)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
    def star1():
        global angle
        # screen.fill(white)                           <--- DELTE
        x = int(math.cos(angle) * 70) + 775
        y = int(math.sin(angle) * 100) + 400
        pygame.draw.circle(screen, black, (x, y), 10)
        # pygame.display.flip()                        <--- DELTE
        angle += 0.05

    def star2():
        global angle
        # screen.fill(white)                           <--- DELTE
        x = int(math.cos(angle) * 100) + 775
        y = int(math.sin(angle) * 70) + 400
        pygame.draw.circle(screen, black, (x, y), 10)
        # pygame.display.flip()                        <--- DELTE
        angle += 0.05

    screen.fill(white)                               # <--- ADD
    star1()
    star2()
    pygame.display.flip()                            # <--- ADD

    keys = pygame.key.get_pressed()                  # <--- CHANGE
    if keys[pygame.K_ESCAPE]:
        print("System Terminated ('ESC')")
        sys.exit(0)

Обратите внимание, вы используете один и тот же angle для обоих объектов. Следовательно, angle увеличивается дважды в каждом кадре.

person Rabbid76    schedule 15.01.2021