Näppäimistön käsittely

Takaisin pääsivulle

Kun käyttäjä painaa nappia näppäimistöltä, syntyy tapahtuma pygame.KEYDOWN. Tämän jälkeen on mahdollista tarkistaa, mitä nappia käyttäjä tarkkaan ottaen painoi.

Seuraava koodi tunnistaa tilanteet, joissa käyttäjä painaa näppäintä "A" tai näppäintä "B". Kun käyttäjä painaa näppäintä "A", ikkunaan ilmestyy punainen ympyrä. Kun taas käyttäjä painaa näppäintä "B", ikkunaan ilmestyy sininen ympyrä. Ohjelma on rakennettu osaksi pelirunkoa.

# -*- coding: utf-8 -*-
import pygame

# peliin liittyvät yleiset muuttujat ja niiden alustaminen
ruudun_leveys = 640
ruudun_korkeus = 400
naytto = pygame.display.set_mode((ruudun_leveys, ruudun_korkeus))
pygame.display.set_caption("Pelin otsikko")

def kontrolli(pallot):
    print "kontrolli, eli käyttäjän toimintojen kuuntelu"
    for tapahtuma in pygame.event.get():
        if tapahtuma.type == pygame.QUIT:
            exit()
        
        # ohjelmoi tänne muiden toimintojen käsittely
        if tapahtuma.type == pygame.KEYDOWN:
            if tapahtuma.key == pygame.K_a:
                pallot[0] = 1
            if tapahtuma.key == pygame.K_b:
                pallot[1] = 1

def logiikka(pallot):
    print "ei tehdä mitään logiikka-osiossa."

def piirtaminen(ikkuna, pallot):
    print "piirtaminen, eli pelin grafiikan piirtäminen käyttäjälle"

    # tyhjennetään ruutu, tässä käytetty valkoista väriä
    #            red green blue
    ikkuna.fill((255, 255, 255))

    if pallot[0] == 1:
        pygame.draw.circle(ikkuna, (255, 0, 0), (100, 100), 10)

    if pallot[1] == 1:
        pygame.draw.circle(ikkuna, (0, 0, 255), (100, 100), 10)

    # näytetään kuva
    pygame.display.flip()

def main():
    # alusta käytettävät muuttujat (luodaan tietorakenteet)
    naytetaan_pallot = [0, 0]

    while True:
        kontrolli(naytetaan_pallot)
        logiikka(naytetaan_pallot)
        piirtaminen(naytto, naytetaan_pallot)
        
# kun kaikki on valmista, käynnistetään peli
main()

Näppäinten tunnukset

Äskeisessä koodissa tunnus pygame.K_a viittasi A-näppäimeen ja tunnus pygame.K_b viittasi B-näppäimeen. Mistä voi yleisemmin tietää, mikä tunnus viittaa mihinkin näppäimeen?

Tässä auttaa pygame-kirjaston dokumentaatio kohdassa pygame.key.

Esimerkki: Liikkuva pelihahmo

Seuraavassa esimerkissä pelaaja voi ohjata pelihahmoa nuolinäppäimin. Muuttujissa x ja y on pelihahmon sijainti ruudulla. Koodi olettaa, että projektiin kuuluu tiedosto ukko.png, jossa on pelihahmon kuva.

# -*- coding: utf-8 -*-
import pygame

# peliin liittyvät yleiset muuttujat ja niiden alustaminen
ruudun_leveys = 640
ruudun_korkeus = 400
naytto = pygame.display.set_mode((ruudun_leveys, ruudun_korkeus))
pygame.display.set_caption("Pelin otsikko")

# ladataan kuvat ym
ukko = pygame.image.load("ukko.png")

# funktiot
def kontrolli(sijainti):
    print "kontrolli, eli käyttäjän toimintojen kuuntelu"
    for tapahtuma in pygame.event.get():
        if tapahtuma.type == pygame.QUIT:
            exit()
        
        # ohjelmoi tänne muiden toimintojen käsittely
        if tapahtuma.type == pygame.KEYDOWN:
            if tapahtuma.key == pygame.K_RIGHT:
                sijainti[0] = sijainti[0] + 10
            if tapahtuma.key == pygame.K_LEFT:
                sijainti[0] = sijainti[0] - 10
            if tapahtuma.key == pygame.K_DOWN:
                sijainti[1] = sijainti[1] + 10
            if tapahtuma.key == pygame.K_UP:
                sijainti[1] = sijainti[1] - 10

def logiikka(sijainti):
    print "ei tehdä mitään logiikka-osiossa."

def piirtaminen(ikkuna, sijainti):
    print "piirtaminen, eli pelin grafiikan piirtäminen käyttäjälle"

    # tyhjennetään ruutu, tässä käytetty valkoista väriä
    #            red green blue
    ikkuna.fill((255, 255, 255))

    ikkuna.blit(ukko, sijainti)

    # näytetään kuva
    pygame.display.flip()

def main():
    # alusta käytettävät muuttujat (luodaan tietorakenteet)
    sijainti = [50, 50]

    while True:
        kontrolli(sijainti)
        logiikka(sijainti)
        piirtaminen(naytto, sijainti)
        
# kun kaikki on valmista, käynnistetään peli
main()

Huomaa komento naytto.fill aina ennen pelihahmon piirtämistä. Sen tarkoituksena on tyhjentää näyttö, jotta pelihahmo on tietyllä hetkellä vain yhdessä paikassa.

Koodissa on yksi ongelma: vaikka näppäintä pitää pohjassa, pelihahmo liikkuu vain yhden askeleen. Luvussa Animaatio opimme korjaamaan tämän ongelman.

Takaisin pääsivulle