2013-02-24 20 views
5

Quindi, ho un problema, non capisco appieno l'evento che è necessario dare a un comando timer in ogni caso, non dico da nessuna parte online, a dove ho cercato per ore. Quindi ho appena usato ciò che molte persone sembravano usare 'USEREVENT + 1'. Non sono sicuro che sia corretto, ma il mio timer non funziona. Sto usando correttamente? Ecco il mio codice:pygame.time.set_timer confusione?

nyansecond=462346 
nyanint=0 
spin=0 
aftin=452345 

def nyanmusic(nyansecond,nyanint,spin): 
    if nyanint == 0: 
     nyansound.play() 
     nyanint= 1 
    elif nyanint == 1: 
     nyansecond = pygame.time.set_timer(USEREVENT+1,7000) 
    if nyansecond < 200 and spin == 1: 
     spin = 0 
     nyansecond = pygame.time.set_timer(USEREVENT+1,7000) 
    elif nyansecond > 6500 and nyansecond < 100000 and spin == 0: 
     spin = 1 
     nyansoundm.play() 

    return nyansecond,nyanint,spin 

Poi lo def all'interno del mio codice nella seconda pagina che ho implementato (che funziona bene). Esegue il nyansound, ma non esegue nyansoundm dopo 6,5 secondi (6500 millisecondi). Sto facendo questo programma per aiutarmi a imparare le basi di Python e Pygame, prima di passare a cose più complesse. Posso anche usarlo quando voglio ascoltare nyan cat o altri brani in loop senza dover andare su youtube e sprecare preziosa larghezza di banda. Non preoccuparti di questo, però.

Oh, e qui è il codice che ho messo nel mio ciclo, anche se io non credo che questo conta troppo:

#music 
     nyansecond,nyanint,spin = nyanmusic(nyansecond,nyanint,spin) 

risposta

8

recap di quanto Let pygame.time.set_timer fa:

pygame.time .set_timer (eventid, milliseconds): return Nessuno

Impostare un tipo di evento da visualizzare sulla coda eventi ogni dato numero di millisecondi. Il primo evento non apparirà fino a quando non sarà trascorso il tempo.
Ad ogni tipo di evento può essere associato un timer separato. È preferibile utilizzare il valore tra pygame.USEREVENT e pygame.NUMEVENTS.

pygame.USEREVENT e pygame.NUMEVENTS sono costanti (24 e 32), così l'argomento eventid si passa alla pygame.time.set_timer deve essere un numero intero tra 24 e 32.

pygame.USEREVENT+1 è 25, quindi è bene usarlo.

Quando si chiama pygame.time.set_timer(USEREVENT+1,7000), l'evento con ID evento 25 verrà visualizzato nella coda eventi ogni 7000 ms. Non hai mostrato il codice di gestione degli eventi, ma suppongo che tu non controlli questo evento, cosa che dovresti fare.

Come si può vedere, pygame.time.set_timer rendimenti None, così la vostra linea

nyansecond = pygame.time.set_timer(USEREVENT+1,7000) 

non ha senso in quanto nyansecond sarà sempre None, e quindi il confronto contro un intero

if nyansecond < 200 ... 

è inutile.


Se si desidera riprodurre un suono ogni 6,5 secondi utilizzando la coda di eventi, chiamata simpy pygame.time.set_timer una volta (!):

PLAYSOUNDEVENT = USEREVENT + 1 
... 
pygame.time.set_timer(PLAYSOUNDEVENT, 6500) 

e controllare la coda di eventi per questo evento nel ciclo principale:

while whatever: # main loop 
    ... 
    # event handling 
    if pygame.event.get(PLAYSOUNDEVENT): # check event queue contains PLAYSOUNDEVENT 
     nyansoundm.play() # play the sound 
+0

Grazie! Questo ha funzionato completamente. Ho frainteso completamente il timer: D. Spiacente, non uso eventi D :. Sfortunatamente, ho acquisito un nuovo problema. A volte il mio ciclo, dal momento che sono su un PC piuttosto lento, non esegue il "pygame.event.get (PLAYSOUNDEVENT)" nello stesso momento in cui il timer si esaurisce e causa l'evento. C'è un modo per risolvere questo problema, o si tratta di un problema irrisolvibile? – Bluetiger6001

+0

Ok, ho fatto la mia risposta, l'avrei invalso, ma sono appena entrato nel sito e non ho abbastanza reputazione. Quando ne avrò abbastanza, rispetterò in modo provocatorio una risposta. Grazie :) – Bluetiger6001

+0

Suvati :) Grazie per l'ottima risposta – Bluetiger6001