Экран Pygame не заполняется - PullRequest
       2

Экран Pygame не заполняется

1 голос
/ 29 февраля 2020

Только что начал python кодирование, так что я не настолько хорош, но я пытаюсь воссоздать Pacman, и у меня появляется эта ошибка при запуске, когда экран не заполняется, и я понятия не имею, почему ?? Я прошел через это, и все выглядит хорошо? Это мой код до сих пор. Ошибка должна быть во вступительном разделе, но я не могу ее найти. BLACK = (0, 0, 0).

import pygame as pg
import sys
from settings import *

pg.init()
pvec = pg.math.Vector2


class Main:
    def __init__(self):
        self.screen = pg.display.set_mode((WIDTH, HEIGHT))
        self.clock = pg.time.Clock()
        self.running = True
        self.state = 'startscreen'
        self.cellwidth = WIDTH//28
        self.cellheight = HEIGHT//38

        self.load()

    def run(self):
        while self.running:
            if self.state == 'startscreen':
                self.intro_events()
                self.intro_update()
                self.intro_draw()
            elif self.state == 'play':
                self.play_events()
                self.play_update()
                self.play_draw()
            elif self.state == 'highscore':
                self.high_events()
                self.high_update()
                self.high_draw()
            else:
                self.running = False
            self.clock.tick(FPS)
        pg.quit()
        sys.exit()

    def draw_text(self, text, screen, pos, size, color, fontname, centered=False):
        font = pg.font.SysFont(fontname, size)
        scrtext = font.render(text, False, color)
        text_size = scrtext.get_size()
        if centered:
            pos[0] = pos[0]-text_size[0]//2
            pos[1] = pos[1] - text_size[1] // 2
        screen.blit(scrtext, pos)

    def draw_grid(self):
        for x in range(WIDTH//self.cellwidth):
            pg.draw.line(self.background, GRAY, (x*self.cellwidth, 0), (x*self.cellwidth, HEIGHT))
        for x in range(HEIGHT//self.cellheight):
            pg.draw.line(self.background, GRAY, (0, x*self.cellheight), (WIDTH, x*self.cellheight))

    def load(self):
        self.background = pg.image.load('background2.png')
        self.background = pg.transform.scale(self.background, (WIDTH, HEIGHT))

# INTRO

    def intro_events(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.running = False
            if event.type == pg.KEYDOWN and event.key == pg.K_SPACE:
                self.state = 'play'
            if event.type == pg.KEYDOWN and event.key == pg.K_BACKSLASH:
                self.state = 'highscore'

    def intro_update(self):
        pass

    def intro_draw(self):
        self.screen.fill(BLACK)
        self.draw_text('PLAY GAME', self.screen, [WIDTH//2, HEIGHT//2+150],
                       INTRO_TEXT_SIZE, ORANGE, INTRO_FONT, centered=True)
        self.draw_text('HIGH SCORES', self.screen, [WIDTH//2, HEIGHT//2+200],
                       INTRO_TEXT_SIZE, ORANGE, INTRO_FONT, centered=True)
        self.draw_text('PACMAN PORTAL', self.screen, [WIDTH//2, HEIGHT//2-250],
                       LOGO, ORANGE, LOGO_FONT, centered=True)


# HIGH SCORE

    def high_events(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.running = False
            if event.type == pg.KEYDOWN and event.key == pg.K_BACKSLASH:
                self.state = 'startscreen'

    def high_update(self):
        pass

    def high_draw(self):
        self.screen.fill(BLACK)
        self.draw_text('HIGH SCORES', self.screen, [WIDTH // 2, HEIGHT // 2 - 250],
                       INTRO_TEXT_SIZE, ORANGE, INTRO_FONT, centered=True)
        pg.display.update()

# PLAYING

    def play_events(self):
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.running = False

    def play_update(self):
        pass

    def play_draw(self):
        self.screen.fill(BLACK)
        self.screen.blit(self.background, (0, 0))
        self.draw_text('SCORE: ', self.screen, (30, 750), 35, WHITE, INTRO_FONT, centered=False)
        self.draw_grid()
        pg.display.update()

1 Ответ

1 голос
/ 29 февраля 2020

Вы пропустили обновление дисплея. Обратите внимание, что дисплей обновляется в play_draw, но не обновляется в intro_draw. Я рекомендую вызывать pg.display.update() в конце основного приложения l oop, а не в методах *_draw, потому что дисплей должен быть обновлен в любом случае:

class Main:
    # [...]

    def run(self):
        while self.running:
            if self.state == 'startscreen':
                self.intro_events()
                self.intro_update()
                self.intro_draw()
            elif self.state == 'play':
                self.play_events()
                self.play_update()
                self.play_draw()
            elif self.state == 'highscore':
                self.high_events()
                self.high_update()
                self.high_draw()
            else:
                self.running = False
            pg.display.update() # <--------
            self.clock.tick(FPS)
...