Brukarinput i Pygame

I vanlig Python kan vi få input frå brukaren ved kommandoen input (sjølsagt). Programmet vil då stoppa og venta til brukaren har svart på dette, og så vil det forsetja. I Pygame er vi alltid inne i ei løkke som bare går og går, og vi vil som regel (i prinsippet) ha mulighet til å motta input frå brukaren når som helst. Det er to måtar å få tak i brukar informasjon på. Det er å sjekka eventkøen eller bruka såkalt polling. I begge tilfella kan vi få input både frå tastar, mus og joystick, men vi skal her  begrensa oss til å bruka tastar. Då treng vi å kjenna navnet på den aktuelle tasten. For Keyboard begynner alle med "K_". Bokstaven "u" får vi då tak i via navnet "K_u". Andre aktuelle kan vera: K_UP (pil opp),  K_DOWN (pil ned), K_RIGHT (pil høgre), K_LEFT (pil venstre), K_SPACE (mellomrom) og K_ESCAPE (esc). Du kan sjekka denne lista for andre tastar.

No skal vi sjå på to forskjellige måtar å bruka tastane pil opp og pil ned.

Events

Pygame registrerer og lagrar alla såkalte events frå brukaren inn i ein event-kø som vi har tilgang til via koden pygame.event.get(). Dei to mulige eventa for tastar er då at brukaren enten trykkjer den ned (KEYDOWN) eller slepp den opp (KEYUP). Koden under er brukt for å endra vinkelen til "kanona" feks. i Pariskanonen-eksempelet:

for event in pygame.event.get():
     if event.type == pygame.QUIT:
           return pygame.quit()
     elif event.type == pygame.KEYDOWN:

                # KANONVINKEL
                if event.key == pygame.K_DOWN and vinkel > 0:
                    vinkel -= 1
                    rad = numpy.radians(vinkel)
                if event.key == pygame.K_UP and vinkel < 90:
                    vinkel += 1
                    rad = numpy.radians(vinkel)

Den første for-løkka går gjennom eventkøen. Så variabelen event kan referera til mange ulike ting. Vi sjekkar først på typen. Hvis typen er pygame.QUIT (dvs. kryssa ut vinduet), så stoppar vi programmet. Hvis typen er pygame.KEYDOWN, så sjekkar vi meir om kva slags tast som vart trykt ned. Her er i tillegg visse betingelsar for om vi skal gjera noko. Vi vil ikkje gjera vinkelen mindre enn 0 grader, eller større enn 90. Deretter reknar vi om frå grader til radianer.

Fordelen med å bruka event her, er at vi kan endra vinkelen ein grad om gongen. For eventet KEYDOWN skjer bare ein gong når eg trykkjer ned ein tast. Vi får altså bare tilslag ein gong i løkka vår. Bakdelene er at det går tregt å endra vinkelen mange grader fordi vi må trykkja gjentatte gonger.

Polling

Når vi brukar polling, så sjekkar vi tilstanden til ein tast, dvs. om den akkurart no er nede eller ikkje. Då brukar vi kommandoen  pygame.key.get_pressed(). Dette kan vi bruka når vi feks. vil flytta racketen i pong. Då kan vi bruka koden

        key = pygame.key.get_pressed()
        if key[pygame.K_UP]:
            racky -= 4
        elif key[pygame.K_DOWN]:
            racky += 4

Det som skjer her, er at vi endrar y-verdien til racketen opp og ned. (Husk at y-aksen går nedover i vinduet, og derfor blir fortegnet negativt når vi skal flytta racketen opp.) Fordelen med å bruka polling er at så lenge brukaren held nede knappen, så vil vi flytta racketen fire pikslar for kva gong. Så det går fortare å flytta enn ved å trykkja gjentatte gonger. Bakdelen er at det ikkje er så enkelt å treffa nøyaktig. 

Take-away:

Med andre ord: bruk bare ein av metodane om gongen. Sjekk event hvis du vil at endringane skal skje eit steg om gongen, og bruk polling når du feks vil ha kontinuerlig flytting.

LENKER

PyGame Tutorial: More on Input.

pygame Event loop.