Подтвердить что ты не робот

Как отобразить текст в pygame?

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

import pygame, sys
from pygame.locals import *

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

pygame.init()
size = (700, 500)
screen = pygame.display.set_mode(size)

DISPLAYSURF = pygame.display.set_mode((400, 300))
pygame.display.set_caption('P.Earth')
while 1: # main game loop
    for event in pygame.event.get():
        if event.type == QUIT:           
            pygame.display.update() 

import time

direction = ''
print('Welcome to Earth')
pygame.draw.rect(screen, RED, [55,500,10,5], 0)
time.sleep(1)

Это только начальная часть всей программы.
Если есть формат, который позволит мне показать текст, который я набираю в окне pygame, это было бы здорово. Поэтому вместо использования печати я бы использовал что-то еще. Но я не знаю, что это такое:/ Когда я запускаю свою программу в pygame, она ничего не показывает.
Я хочу, чтобы программа запускалась в окне pygame, а не просто в режиме ожидания.

4b9b3361

Ответ 1

Вы можете создать поверхность с текстом на ней. Для этого взгляните на этот короткий пример:

pygame.font.init() # you have to call this at the start, 
                   # if you want to use this module.
myfont = pygame.font.SysFont('Comic Sans MS', 30)

Это создает новый объект, по которому вы можете вызвать метод render.

textsurface = myfont.render('Some Text', False, (0, 0, 0))

Это создает новую поверхность с уже нарисованным текстом. В конце вы можете просто развернуть поверхность текста на главном экране.

screen.blit(textsurface,(0,0))

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

Ответ 2

При отображении иногда я делаю новый файл под названием Funk. Это будет шрифт, размер и т.д. Это код для класса:

import pygame

def text_to_screen(screen, text, x, y, size = 50,
            color = (200, 000, 000), font_type = 'data/fonts/orecrusherexpand.ttf'):
    try:

        text = str(text)
        font = pygame.font.Font(font_type, size)
        text = font.render(text, True, color)
        screen.blit(text, (x, y))

    except Exception, e:
        print 'Font Error, saw it coming'
        raise e

Затем, когда это было импортировано, когда я хочу отображать текстовые обновления taht E.G, я делаю:

Funk.text_to_screen(screen, 'Text {0}'.format(score), xpos, ypos)

Если это обычный текст, который не обновляется:

Funk.text_to_screen(screen, 'Text', xpos, ypos)

Вы можете заметить {0} в первом примере. Это потому, что когда используется .format(независимо), это то, что будет обновляться. Если у вас есть что-то вроде Score, то таргетинг-показатель вы бы сделали {0} для оценки, затем {1} для целевого балла, затем .format(score, targetcore)

Ответ 3

Также имеется модуль pygame.freetype, который является более современным, работает с большим количеством шрифтов и предлагает дополнительные функции.

Создайте объект шрифта с помощью pygame.freetype.SysFont() или pygame.freetype.Font, если шрифт находится внутри каталога вашей игры.

Вы можете визуализировать текст либо с помощью метода render аналогично старому pygame.font.Font.render, либо непосредственно на поверхность мишени с помощью render_to.

import pygame
import pygame.freetype  # Import the freetype module.


pygame.init()
screen = pygame.display.set_mode((800, 600))
GAME_FONT = pygame.freetype.Font("your_font.ttf", 24)
running =  True

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

    screen.fill((255,255,255))
    # You can use 'render' and then blit the text surface ...
    text_surface, rect = GAME_FONT.render("Hello World!", (0, 0, 0))
    screen.blit(text_surface, (40, 250))
    # or just 'render_to' the target surface.
    GAME_FONT.render_to(screen, (40, 350), "Hello World!", (0, 0, 0))

    pygame.display.flip()

pygame.quit()

Ответ 4

Это немного более независимый от ОС способ:

# do this init somewhere
import pygame
pygame.init()
screen = pygame.display.set_mode((640, 480))
font = pygame.font.Font(pygame.font.get_default_font(), 36)

# now print the text
text_surface = font.render('Hello world', antialias=True, color=(0, 0, 0))
screen.blit(text_surface, dest=(0,0))