Почему анимация PyGame мерцает

avatar
piddi24
31 мая 2020 в 18:27
496
1
2

Итак, я запускаю код, и он просто начинает глючить. Я новичок в pygame.

Вот код:

import pygame

pygame.init()
# Screen (Pixels by Pixels (X and Y (X = right and left Y = up and down)))
screen = pygame.display.set_mode((1000, 1000))
running = True
# Title and Icon
pygame.display.set_caption("Space Invaders")
icon = pygame.image.load('Icon.png')
pygame.display.set_icon(icon)
# Player Icon/Image
playerimg = pygame.image.load('Player.png')
playerX = 370
playerY = 480

def player(x, y):
    # Blit means Draw
    screen.blit(playerimg, (x, y))


# Game loop (Put all code for pygame in this loop)
while running:
    screen.fill((225, 0, 0))
    pygame.display.update()

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
    # if keystroke is pressed check whether is right or left
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                print("Left arrow is pressed")

            if event.key == pygame.K_RIGHT:
                print("Right key has been pressed")


            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                print("kEYSTROKE RELEASED")

    # RGB (screen.fill) = red green blue

    player(playerX, playerY)
    pygame.display.update()

Изображение не является глючным, так как я не смог опубликовать видео, но это то, что делает мой код

enter image description here

Источник

Ответы (1)

avatar
Rabbid76
31 мая 2020 в 18:31
1

Проблема вызвана несколькими вызовами pygame.display.update(). Достаточно обновления дисплея в конце цикла приложения. Множественные вызовы pygame.display.update() или pygame.display.flip() вызывают мерцание.

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

while running:
    screen.fill((225, 0, 0))
    # pygame.display.update() <---- DELETE

    # [...]

    player(playerX, playerY)
    pygame.display.update()

Если вы обновите дисплей после screen.fill(), на короткое время дисплей будет заполнен фоновым цветом. Затем отрисовывается игрок (blit), и на дисплее отображается игрок поверх фона.

Rabbid76
31 мая 2020 в 19:15
0

@piddi24 Имя enemy — это имя функции, а не имя поверхности. Это должно быть screen.blit(enemyimg, (x, y)), а не screen.blit(enemy, (x, y))