Спрайт не рендеринг в Pygame - PullRequest
2 голосов
/ 08 октября 2019

Я прочитал несколько примеров по спрайтам, но я упустил небольшой, ключевой момент. Этот код не вызывает ошибок, но предполагаемый спрайт не будет отображаться. Вместо этого я просто вижу пустой белый фон. То, что я должен увидеть, это зеленый квадрат с цифрой 7 в центре. Этот блок должен двигаться вправо.

import sys
import pygame

pygame.init()

RED   = (255,   0,   0)
GREEN = (  0, 255,   0)
BLUE  = (  0,   0, 255)
WHITE = (255, 255, 255)

main_surface = pygame.display.set_mode((500,500), 0, 32)
clock = pygame.time.Clock()
fps = 30
SYS_FONT = pygame.font.SysFont(None, 95)

class Block(pygame.sprite.Sprite):
    def __init__(self, color, text):
        pygame.sprite.Sprite.__init__(self)
        self.image = pygame.Surface((80, 80))
        self.rect = self.image.get_rect()
        self.image.fill(color)
        self.text_surf = SYS_FONT.render(text, False, WHITE)
        self.text_rect = self.text_surf.get_rect(center=self.rect.center)
        self.image.blit(self.text_surf, self.text_rect)

    def update(self):
        self.rect.x += 5

sprites = pygame.sprite.Group()
block_7 = Block(GREEN, '7')
sprites.add(block_7)

sprites.draw(main_surface)

while True:
    main_surface.fill(WHITE)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()
    sprites.update()
    clock.tick(fps)

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Есть 2 вопроса. Как уже упоминалось в другом ответе, вы должны позвонить sprites.draw(main_surface). См. Документацию pygame.sprite.Group.draw():

Отрисовывает содержащиеся спрайты в аргумент Поверхность. При этом используется атрибут Sprite.image для поверхности источника и Sprite.rect для позиции.

Но порядок имеет значение. Когда вы непрерывно визуализируете сцену в главном цикле приложения, вам необходимо выполнить следующие шаги в указанном порядке:

Если дисплей обновляется сразу последисплей очищается, тогда вы ничего не увидите, кроме очищенного дисплея.

Итак, основной цикл должен быть:

while True:

    # handle events
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()

    # update sprite positions
    sprites.update()

    # clear display
    main_surface.fill(WHITE)

    # draw scene (draw sprites)
    sprites.draw(main_surface)

    # update the disaplye
    pygame.display.update()

    # limit FPS
    clock.tick(fps)

0 голосов
/ 08 октября 2019

Вам также нужно будет позвонить sprites.draw(main_surface) в цикле:

while True:
    main_surface.fill(WHITE)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
    pygame.display.update()
    sprites.update()
    sprites.draw(main_surface)  # <-- added
    clock.tick(fps)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...