2014-12-30 8 views
5

La mia idea è che voglio prendere alcuni input dall'utente nel gioco come nome dell'utente, quindi voglio metterlo sullo schermo. Forse prima di iniziare il gioco o il centro del gioco, è importante.Come ottenere un input dall'utente in Pygame e salvarlo come variabile?

ho cercato InputBox ecc, ma non funziona in realtà, ho provato alcune delle moduli come, ma nessuno di lavoro, alcuni di loro semplicemente scrivendo il mio testo sullo schermo questo è tutto, quello che voglio è che voglio per prendere quell'input e mettere alcuni posti sullo schermo di pygame.

Quindi devo Salva l'input come una variabile .IS là ogni possibile modo per fare questo?

Esempio:

font1 = pygame.font.SysFont("None", 30) 
score=0 
text=font1.render("{}".format(score), True,(255,255,255)) 
... 
... 
if sneakeattheapple: 
    score += 1 
    text=font1.render("{}".format(score), True,(255,255,255)) 
... 
... 
screen.blit(text,(275,6)) 

Questo sta per mettere segnare variabile sullo schermo, poi quando voglio aggiornare il punteggio come nel gioco del serpente, quando furtivo mangiare la mela che posso aggiornamento testo così posso aggiornare punteggio variabile.Ma questo punteggio variabile è già definita, voglio farlo con una variabile data dall'utente.

EDIT: Ho già controllare tutti risponde alle domande in & SO, quelli non sono che cosa Im che chiede e quello che voglio. Esistono alcuni modi per stampare tali variabili, questo è non Voglio come ho detto. Facendo eventi della tastiera e la stampa non è qualsiasi parte del mio question.I ha dato l'esempio con il 'nome', ma THIS questione non è rapporto con la mia domanda

EDIT 2: Sarò più chiaro. In Python possiamo farlo;

x=input("Do you want to do this?(y/n): ") 
if x=="y": 
    #do something 
if x=="n": 
    #do something 

E possiamo chiediamo ogni volta che vogliamo, dove vogliamo .. Questo è quello che voglio fare in Pygame.

+0

Hai provato a usare 'ingresso()' –

+6

@PythonMaster Scherzi a parte .... voglio prendere che l'input dallo schermo Pygame non shell Python .. – GLHF

+1

@PythonMaster No, non un duplicato. Ho già controllato tutte le domande in SO. – GLHF

risposta

-1

Ecco una possibile soluzione, potrebbe essere davvero utile per i futuri visitatori che soffrono anche di questo problema come me. Che è;

prima messa in funzione text-render

def text1(word,x,y): 
    font = pygame.font.SysFont(None, 25) 
    text = font.render("{}".format(word), True, RED) 
    return screen.blit(text,(x,y)) 

Poi una funzione funziona come input;

def inpt(): 
    word="" 
    text1("Please enter your name: ",300,400) #example asking name 
    pygame.display.flip() 
    done = True 
    while done: 
     for event in pygame.event.get(): 
      if event.type==pygame.QUIT: 
       pygame.quit() 
       quit() 
      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_a: 
        word+=str(chr(event.key)) 
       if event.key == pygame.K_b: 
        word+=chr(event.key) 
       if event.key == pygame.K_c: 
        word+=chr(event.key) 
       if event.key == pygame.K_d: 
        word+=chr(event.key) 
       if event.key == pygame.K_RETURN: 
        done=False 
       #events... 
    return text1(word,700,30) 

Come si vede, questa funzione cattura eventi della tastiera, che ha il proprio ciclo while anche, è importante. Rompere il ciclo quando si preme il pulsante Enter che è if event.key == pygame.K_RETURN: done=False. Quindi restituire la nostra parola con la funzione text1, visualizzando. Altri eventi possono essere impostati naturalmente opinione a base, come il tasto spazio per un gap ecc

Poi, in realtà dobbiamo fare una funzione intro e chiederemo il nome dell'utente in là per esempio, quando intro funzione è fatto, il nome va impostato sullo schermo fino a quando il gioco è finito.

def game_intro(): 
intro=True 

while intro: 
    for event in pygame.event.get(): 
     if event.type==pygame.QUIT: 
      pygame.quit() 
      quit() 
     if event.type==pygame.KEYDOWN: 
      if event.key==pygame.K_RETURN: 
       intro=False 
    inpt() #Here we are calling our function 
    screen.fill(white) 

    pygame.display.update() 
    clock.tick(15) 

vedere che noi rompere questo ciclo con il tasto Enter di nuovo.Quindi chiederemo all'utente la nostra domanda in intro, quindi lo imposteremo sullo schermo, nell'angolo in alto a destra, per esempio.

4

Non c'è nulla di cotto in Pygame per questo. Dovrai o utilizzare una libreria GUI di terze parti o crearla da solo. Esempio: se la casella di testo è attiva, prendi tutti gli eventi keydown e aggiungi una stringa. Ogni fotogramma, disegna una casella, quindi disegna la stringa in cima.

Costruire uno semplice non dovrebbe essere così difficile, ma se si desidera uno più completo, sarà probabilmente più semplice usare una libreria.

+0

Ho usato alcuni moduli di terze parti come menzionato nella mia domanda ma sono inutili – GLHF

+3

non di quelli funzionanti? http://pygame.org/wiki/gui#GUI libraries – Abdelouahab

4

Attualmente sto assumendo che questa funzione abbia funzionato correttamente con il programma e non solleva errori. Ecco una funzione nel link che ci ha dato:

def ask(screen, question): 
    "ask(screen, question) -> answer" 
    pygame.font.init() 
    current_string = [] 
    display_box(screen, question + ": " + string.join(current_string,"")) 
    while 1: 
     inkey = get_key() 
     if inkey == K_BACKSPACE: 
     current_string = current_string[0:-1] 
     elif inkey == K_RETURN: 
     break 
     elif inkey == K_MINUS: 
     current_string.append("_") 
     elif inkey <= 127: 
     current_string.append(chr(inkey)) 
     display_box(screen, question + ": " + string.join(current_string,"")) 
    return string.join(current_string,"") 

Sembra che questo è il modo per ottenere input da un utente con uno schermo pygame giusto?Diamo un'occhiata alla riga 4 di questa funzione:

current_string = [] 

Il materiale che l'utente digita è memorizzato in questo elenco. Supponendo che si sa come prendere una stringa e metterlo sullo schermo, si potrebbe salvare la stringa in questo modo:

string_input = ''.join(current_string) 

Se si può fare una funzione simile (se questo non funziona), si può fare la stessa cosa! Basta salvare il primo elemento nella lista tenendo la stringa in una variabile come mostrato sopra. In caso di problemi, si prega di commentare in modo da poter modificare la mia risposta.
Alla prossima parte ora. Puoi semplicemente attivare questa funzione in qualsiasi momento. Potresti voler attivare quando succede qualcosa. Un esempio è quando il serpente mangia la mela. Probabilmente hai una funzione per quello che credo. È possibile creare una variabile come questa:

Eat = 0 

E inserire questa funzione. Quando quella variabile è uguale a 0. Nulla attiva realmente l'altra funzione. Quando il serpente mangia la mela, reimpostare la variabile di 1 e poi attivare la funzione in questo modo:

if Eat = 0: 
    someclassname.ask() 

A tale scopo, con molte altre occasioni. Spero che questo sia più chiaro e più utile!

+0

Sembra promettente. Suggerisco di usare 'return '' .join (current_string)' (raramente è necessario usare il modulo 'string' più). Inoltre, alla fine della tua risposta, would not 'string_input = current_string [0]' metti un solo carattere in 'string_input'? Se è così, allora non è chiaro cosa stai dicendo lì. – martineau

2

Hai provato a ottenere eventi chiave e quindi a metterli insieme per formare qualcosa? Potresti inserire qualcosa di simile all'interno del tuo ciclo di gioco principale.

input = '' 
for event in pygame.event.get(): 
     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_ESCAPE: 
       playing = False 
      if event.key == pygame.K_w: 
       input = input + "w" 
      if event.key == pygame.K_s: 
       input = input + "s" 
      if event.key == pygame.K_a: 
       input = input + "a" 

Quindi è possibile controllare per quando l'utente è fatto con ingresso (pulsante/tasto Invio), e finalizzare la variabile. Con questo si potrebbe incorrere in un problema in cui il tasto è tenuto più a lungo in modo da ottenere 3 w per solo premendo il pulsante una volta. In questo caso è possibile 1. non consentire un altro input fino a quando non è passato un certo tempo (0,25 s forse?) O 2. utilizzare pygame.KEYUP invece di pygame.KEYDOWN e controllare esclusivamente i tratti.

-4

di fare in modo un utente immette qualcosa tipo in

variable = input() 

Ora un utente può digitare qualcosa per fargli fare qualcosa tipo

if variable = ('input'): 
print('the input works') 

Ora, se digito ingresso lo farà dite l'input funziona

+4

Questa risposta non risolve la domanda, e non è nemmeno pitone correttamente formattato. Se lo fosse, ci sono molti problemi con a) Usare l'input significa che l'input dell'utente viene interpretato come python, quindi l'assegnazione della variabile significa che 'variable' è in realtà legata alla funzione di input stessa (non alla stringa' 'input'') b) il tuo controllo per l'uguaglianza è un compito, non un confronto ('==') c) Questo non è un metodo GUI. –

-3

Immagino che la linea sottostante funzioni per voi!

mydata = raw_input ('Prompt:')

+0

La domanda afferma che l'OP non sta utilizzando l'input dalla shell –

Problemi correlati