Topic: Problema con il testo di pygame  (Letto 115 volte)

0 Utenti e 1 Visitatore stanno visualizzando questo topic.

Offline Ryato

  • python unicellularis
  • *
  • Post: 1
  • Punti reputazione: 0
    • Mostra profilo
Problema con il testo di pygame
« il: Gennaio 16, 2023, 12:52 »
Sto programmando un avventura testuale e purtroppo sto riscontrando alcuni problemi che intralciano la qualità di visualizzazione del testo dell'incipit.
import openai
import pygame
import sys

# Creiamo una lista di chiavi API
api_keys = ["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", "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", "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", "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", "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"]

# Impostiamo l'indice della chiave corrente
current_key_index = 0

# Impostiamo l'incipit della storia
incipit = "Ti svegli in una stanza sconosciuta, senza alcun ricordo di come ci sei arrivato. Ti alzi dal letto e ti guardi intorno, noti che la stanza è in uno stato di degrado avanzato, sembra che sia rimasta abbandonata per anni. \nMentre esplori la stanza, trovi una porta chiusa a chiave. Dopo aver trovato la chiave, apri la porta e ti ritrovi in un corridoio lungo e buio. In lontananza, senti delle voci. Chi sono queste persone e cosa vogliono da te? \nMentre ti avvicini alle voci, ti rendi conto che sei in un edificio abbandonato e che sei intrappolato con altre tre persone: un uomo anziano, una giovane donna e un adolescente. Insieme, dovete trovare un modo per uscire dall'edificio e scoprire cosa è successo."

# Inizializziamo la variabile per tener traccia del testo generato finora
testo_generato = incipit

# Inizializiamo pygame
screen = pygame.display.set_mode((800, 600))

# Impostiamo il titolo della finestra
pygame.display.set_caption("Se funziona godo")

# Creiamo un font per il testo
pygame.font.init()
font = pygame.font.SysFont(None, 24)

# Inizializziamo un contatore per il numero di tentat
tentativi = 0

# Inizializziamo una variabile per l'azione dell'utente
azione_utente = ""

# Creiamo una surface per il testo generato
text_surface = font.render(testo_generato, True, (255, 255, 255))

# Otteniamo la larghezza del testo
text_width = text_surface.get_size()[0]

# Iniziamo il loop principale del gioco
while True:
    # Gestiamo gli eventi
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        if event.type == pygame.KEYDOWN:
            if event.unicode.isalpha():
                azione_utente += event.unicode
            elif event.key == pygame.K_BACKSPACE:
                azione_utente = azione_utente[:-1]
            elif event.key == pygame.K_RETURN:
                # Impostiamo la chiave API corrente
                openai.api_key = api_keys[current_key_index]
                # Aggiungiamo l'azione selezionata al testo generato finora
                testo_generato += "\n" + azione_utente

                # Chiediamo a GPT-3 di continuare la storia a partire dall'azione selezionata
                continuazione = openai.Completion.create(
                    engine="text-davinci-003",
                    prompt=(
                        f"Una volta scritta un azione, per quanto questa possa essere stramba, prosegui con la storia con un filo logico. La frase generata non si deve interrompere a metà per colpa del numero esiguo di token, anzi devi cercare in quei pochi token di completare la frase. Concludi dando un indicazione a quello che il giocatore può fare NON DEVI rompere la 4a parete:{testo_generato}\n"),
                    max_tokens=150,
                    n=1,
                    stop=None,
                    temperature=0.7,
                )
                tentativi += 1

                # Verifica se l'utilizzo della chiave API è stato esaurito
                if check_openai_usage(continuazione):
                    # Passiamo alla chiave successiva
                    current_key_index += 1

                    # Se siamo arrivati alla fine della lista, torniamo all'inizio
                    if current_key_index >= len(api_keys):
                        current_key_index = 0

                # Reimpostiamo la variabile per l'azione dell'utente
                azione_utente = ""

    # Disegniamo il testo per l'incipit
    text = font.render(incipit, True, (255, 255, 255))
    screen.blit(text, (10, 10))

    # Disegniamo il testo per il numero di tentativi
    text = font.render("Tentativi: " + str(tentativi), True, (255, 255, 255))
    screen.blit(text, (10, 50))

    # Se la variabile per la continuazione della storia è definita, disegniamo il testo
    if 'continuazione' in locals():
        text = font.render(continuazione.choices[0].text, True, (255, 255, 255))
        screen.blit(text, (10, 90))

    # Aggiorniamo lo schermo
    pygame.display.flip()


Il testo risulta sgranato e brutto a vedersi ma soprattutto il testo non va a capo anche se esce dallo schermo, come faccio?

Offline nuzzopippo

  • python sapiens
  • *****
  • Post: 670
  • Punti reputazione: 0
    • Mostra profilo
Re:Problema con il testo di pygame
« Risposta #1 il: Gennaio 16, 2023, 17:07 »
Ciao, non conosco pygame, non lo ho neanche installato, ma a giudicare dalla documentazione sui font della libreria è possibile caricarsi vari fonts, utilizzando la funzione "pygame.font.get_fonts()" che Ti restituirebbe una lista dei fonts disponibili, potresti provarne alcuni per trovarne qualcuno che Ti soddisfi visivamente.
Per altro, se ho compreso bene, qualora Tu utilizzarsi un oggetto pygame.font.Font potresti "lavorare di fino" ed ottenere la lunghezza del testo da inserire, in modo da poterla valutare con la dimensione dello schermo ... forse, potresti provare un po' a variare il font e la dimensione del sino a trovare una combinazione che "vada bene".

Purtroppo, non posso sperimentarci su, spero che la segnalazione sopra Ti possa essere utile. :)

Offline GlennHK

  • python sapiens sapiens
  • ******
  • Post: 1.720
  • Punti reputazione: 1
    • Mostra profilo
    • La Tana di GlennHK
Re:Problema con il testo di pygame
« Risposta #2 il: Gennaio 18, 2023, 09:41 »
Sul rendering del font non so cosa suggerirti, ma in effetti l'ho provato anche io e fa abbastanza pena (almeno su windows).

Per l'andare a capo, pygame se ne frega altamente, ti tocca spezzare il testo e gestirtela a mano.

Altra cosa, cerca di stabilire un tuo font e usa quello, non affidarti all'OS, i font non sono tutti uguali in termini di dimensioni occupate dal singolo carattere.

Un po' di suggerimenti sparsi qua e là:
  • non postare le API key così in pubblico
  • i nomi delle variabili dovrebbero essere in inglese
  • non usare locals(), al massimo preinizializza la variabile con un valore sentinella
  • troppi commenti, alcuni come "creo il font" o "imposto l'indice" sono inutili e creano solo rumore nel codice
  • non saprei quanto possa piacere ad openai l'uso che fai delle loro API martellandole con richieste ciclicamente