Как отобразить текст в PyGame? - PullRequest
1 голос
/ 07 марта 2020

Я пытаюсь создать игру, и мне нужно отображать текст в разных областях, поэтому я попытался создать класс для отображения текста, но мне нужно вызвать pygame.display.set_mode, чтобы иметь возможность перетаскивать мой текст, но я уже have:

black = (0, 0, 0)
white = (255, 255, 255)
gold = (250, 175, 50)
blue = (50, 50, 250)


class Display:
    def __init__(self, width, height, colour):
        self.width = width
        self.height = height
        self.colour = colour
        canvasW, canvasH = width, height
        canvas = pygame.display.set_mode((canvasW, canvasH), pygame.NOFRAME)
        canvas.fill(colour)


class Text:
    def __init__(self, text, size, colour, bg, font, bold, italic, x, y, width, height, col):
        self.text = text
        self.size = size
        self.colour = colour
        self.bg = bg
        self.font = font
        self.bold = bold
        self.italic = italic
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.col = col

        Display(width, height, col)
        pygame.font.init()
        myFont = pygame.font.SysFont(font, size, bold, italic)
        textSurf = myFont.render(text, False, colour, bg)
        Display.canvas.blit(textSurf, (x, y))


class DrawDisplay:
    def __init__(self, width, height, col, intro):
        self.width = width
        self.height = height
        self.col = col
        self.intro = intro

        os.environ['SDL_VIDEO_CENTERED'] = '1'
        pygame.init()

        Display(self.width, self.height, self.col)
        # canvasW, canvasH = width, height
        pygame.display.set_caption("TRAVELLER")

        # canvas = pygame.display.set_mode((canvasW, canvasH), pygame.NOFRAME)
        clock = pygame.time.Clock()
        pygame.display.flip()

        if intro:
            # Text('TRAVELLER', 50, black, 'freesansbold.ttf')
            Text('TRAVELLER', 50, black, white, 'freesansbold.ttf', True, False, 10, 100, width, height, col)
            # Text('TRAVELLER', 48, white, 'freesansbold.ttf')
            pygame.display.update()
            clock.tick(120)
            pygame.display.flip()
            time.sleep(7.5)
            pygame.quit()
        else:
            while True:
                for event in pygame.event.get():
                    if event.type == pygame.QUIT:
                        pygame.quit()
                        sys.exit()
            canvas.fill(gold)
            clock.tick(120)
            pygame.display.flip()


class Load(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        width = 450
        height = 250
        DrawDisplay(width, height, gold, True)


class User(threading.Thread):
    def __init__(self):
        threading.Thread.__init__(self)
        width = 1920
        height = 1080
        DrawDisplay(width, height, blue, False)


LoaderThread = Load()
UserThread = User()

LoaderThread.start()
LoaderThread.stop()
UserThread.start()

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

1 Ответ

0 голосов
/ 07 марта 2020

Читать о Объектах экземпляра и Атрибут экземпляра .

Создать экземпляры Display и Text:

display = Display(self.width, self.height, self.col)
text1 = Text('TRAVELLER', 50, black, white, 'freesansbold.ttf', True, False, 10, 100, width, height, col)

Класс Display нуждается в методе для рисования фона и обновления отображения:

class Display:
    def __init__(self, width, height, colour):
        self.width = width
        self.height = height
        self.colour = colour
        canvasW, canvasH = width, height
        self.canvas = pygame.display.set_mode((canvasW, canvasH), pygame.NOFRAME)
        pygame.display.set_caption("TRAVELLER")
    def drawbackground(self):
        self.canvas.fill(self.colour)
    def update(self):
        pygame.display.flip()

Текст класса создает текстовую поверхность в конструкторе. Он получает метод draw, который может blit текст (self.textSurf) на поверхность дисплея (canvas), который является аргументом метода draw:

class Text:
    def __init__(self, text, size, colour, bg, font, bold, italic, x, y, width, height, col):
        self.text = text
        self.size = size
        self.colour = colour
        self.bg = bg
        self.font = font
        self.bold = bold
        self.italic = italic
        self.x = x
        self.y = y
        self.width = width
        self.height = height
        self.col = col

        myFont = pygame.font.SysFont(font, size, bold, italic)
        self.textSurf = myFont.render(text, False, colour, bg)
    def draw(self, canvas):
        canvas.blit(self.textSurf, (self.x, self.y))

Не используйте time.sleep. У вас есть основное приложение l oop, так что используйте его. Нарисуйте сцену в зависимости от состояния self.intro. Пропустите вступление, если нажата клавиша или промежуток времени истек. Используйте pygame.time.get_ticks(), чтобы получить время в миллисекундах. например:

class DrawDisplay:
    def __init__(self, width, height, col, intro):
        self.width = width
        self.height = height
        self.col = col
        self.intro = intro

        os.environ['SDL_VIDEO_CENTERED'] = '1'
        pygame.init()
        pygame.font.init()

        display = Display(self.width, self.height, self.col)
        text1 = Text('TRAVELLER', 50, black, white, 'freesansbold.ttf', True, False, 10, 100, width, height, col)

        clock = pygame.time.Clock()    
        start_time = pygame.time.get_ticks()
        run = True
        while run:
            clock.tick(120)

            # handel events
            current_time = pygame.time.get_ticks()
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    run = False
                if self.intro and event.type == pygame.KEYDOWN:
                    run = False
            # change game states
            if self.intro and current_time > start_time + 7500: # 7.5 seconds 
                run = false

            # draw dispaly
            display.drawbackground()

            # draw scene 
            if self.intro:
                text1.draw(display.canvas) #
            else:
                # draw game objects
                # [...]
                pass      

            # update display
            display.update()
...