web-dev-qa-db-fra.com

Comment afficher du texte en pygame?

Je n'arrive pas à afficher le texte en pygame.
Je sais que je ne peux pas utiliser l’impression comme en python IDLE mais je ne sais pas comment

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)

CECI n'est que la première partie de l'ensemble du programme.
S'il existe un format qui me permettra d'afficher le texte que je tape dans la fenêtre Pygame, ce serait bien. Donc, au lieu d'utiliser l'impression, j'utiliserais autre chose. Mais je ne sais pas ce que c'est que quelque chose d'autre:/Quand j'exécute mon programme en pygame il ne montre rien.
Je veux que le programme s'exécute dans la fenêtre Pygame au lieu de simplement s'exécuter en mode veille.

18
user3146817

Vous pouvez créer une surface avec du texte dessus. Pour cela, jetez un œil à ce court exemple:

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)

Cela crée un nouvel objet sur lequel vous pouvez appeler la méthode render.

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

Cela crée une nouvelle surface avec du texte déjà dessiné dessus. À la fin, vous pouvez simplement effacer la surface du texte sur votre écran principal.

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

Gardez à l'esprit que chaque fois que le texte change, vous devez recréer la surface à nouveau pour voir le nouveau texte.

26

Lors de l'affichage, je crée parfois un nouveau fichier appelé Funk. Cela aura la police, la taille, etc. Voici le code de la classe:

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

Ensuite, lorsque cela a été importé lorsque je veux afficher du texte, il met à jour le score E.G que je fais:

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

S'il s'agit uniquement de texte normal qui n'est pas mis à jour:

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

Vous remarquerez peut-être {0} dans le premier exemple. En effet, lorsque .format (peu importe) est utilisé, c'est ce qui sera mis à jour. Si vous avez quelque chose comme Score, puis le score cible, vous feriez {0} pour le score puis {1} pour le score cible puis .format (score, score cible)

6
GhostFrag1

Il y a aussi le module pygame.freetype qui est plus moderne, fonctionne avec plus de polices et offre des fonctionnalités supplémentaires.

Créez un objet de police avec pygame.freetype.SysFont() ou pygame.freetype.Font si la police se trouve dans votre répertoire de jeu.

Vous pouvez rendre le texte soit avec la méthode render de manière similaire à l'ancienne pygame.font.Font.render Soit directement sur la surface cible avec 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
skrx