Hoe toon ik tekst in pygame?

Ik kom er niet uit om tekst in pygame weer te geven.
Ik weet dat ik print niet kan gebruiken zoals in normale Python IDLE, maar ik weet niet hoe.

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)

Dit is slechts het begin van het hele programma.
Als er een formaat is waarmee ik de tekst die ik typ in het pygame-venster kan tonen, zou dat geweldig zijn. Dus in plaats van print zou ik iets anders gebruiken. Maar ik weet niet wat dat iets anders is.
Als ik mijn programma in pygame start, wordt er niets weergegeven.
Ik wil dat het programma in het pygame-venster wordt uitgevoerd in plaats van dat het alleen inactief is.


Antwoord 1, autoriteit 100%

Je kunt een oppervlak maken met tekst erop. Bekijk hiervoor dit korte voorbeeld:

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)

Hiermee wordt een nieuw object gemaakt waarop u de methode render kunt aanroepen.

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

Hiermee wordt een nieuw oppervlak gemaakt waarop al tekst is getekend.
Aan het einde kun je het tekstoppervlak gewoon op je hoofdscherm blazen.

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

Houd er rekening mee dat elke keer dat de tekst verandert, je het oppervlak opnieuw moet creëren om de nieuwe tekst te zien.


Antwoord 2, autoriteit 32%

Er is ook de module pygame.freetype die moderner is, met meer lettertypen werkt en extra functionaliteit biedt.

Maak een lettertype-object met pygame.freetype.SysFont() of pygame.freetype.Font als het lettertype zich in je gamedirectory bevindt.

Je kunt de tekst weergeven met de render methode vergelijkbaar met de oude pygame.font.Font.render of direct op het doeloppervlak met 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()

Antwoord 3, autoriteit 16%

Bij het weergeven maak ik soms een nieuw bestand aan met de naam Funk. Dit heeft het lettertype, de grootte enz. Dit is de code voor de klas:

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

Als dat vervolgens is geïmporteerd wanneer ik tekst wil weergeven die de E.G-score bijwerkt, doe ik:

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

Als het gewoon normale tekst is die niet wordt bijgewerkt:

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

Misschien ziet u {0} in het eerste voorbeeld. Dat komt omdat wanneer .format (wat dan ook) wordt gebruikt, dat wordt bijgewerkt. Als je zoiets hebt als Score, dan doelscore, zou je {0} doen voor score en vervolgens {1} voor doelscore en vervolgens .format(score, targetscore)


Antwoord 4, autoriteit 7%

Dit is een iets meer OS-onafhankelijke manier:

# 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))

Antwoord 5

Hier is mijn antwoord:


    def draw_text(text, font_name, size, color, x, y, align="nw"):
        font = pg.font.Font(font_name, size)
        text_surface = font.render(text, True, color)
        text_rect = text_surface.get_rect()
        if align == "nw":
            text_rect.topleft = (x, y)
        if align == "ne":
            text_rect.topright = (x, y)
        if align == "sw":
            text_rect.bottomleft = (x, y)
        if align == "se":
            text_rect.bottomright = (x, y)
        if align == "n":
            text_rect.midtop = (x, y)
        if align == "s":
            text_rect.midbottom = (x, y)
        if align == "e":
            text_rect.midright = (x, y)
        if align == "w":
            text_rect.midleft = (x, y)
        if align == "center":
            text_rect.center = (x, y)
        screen.blit(text_surface, text_rect)

Natuurlijk moet je pygame, een lettertype en een scherm importeren, maar dit is slechts een def om toe te voegen aan de rest van de code en vervolgens “draw_text” te noemen.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Other episodes