Python ja pygame

Jos olet aiemmin koodannut C#:lla, kannattaa Pythonin kanssa huomioida ainakin seuraavat erot:

  • rivien perään ei laiteta puolipisteitä
  • ehtolauseiden, silmukoiden ja aliohjelmien esittelyrivien perään laitetaan kaksoispiste
  • alueita ei rajata aaltosulkeilla vaan sisennyksillä, joten ole tarkkana välilyöntien kanssa
  • muuttujille ei tarvitse määritellä tyyppejä
  • aliohjelmat ja luokat täytyy määritellä koodissa ylempänä, kuin missä niitä käytetään
  • kommentit aloitetaan # -merkillä

Tässä tutoriaalissa tehdään hyvin yksinkertainen peli pygame-kirjastolla. Sen jälkeen tutustutaan kielen muihin ominaisuuksiin.

Yksinkertainen pygame-peli

Aivan ensiksi on otettava käyttöön tarvittavat kirjastot. Kirjoita siis kooditiedoston alkuun rivi

import sys, pygame

Seuraavaksi alustetaan pelikirjasto käyntiin rivillä

pygame.init()

Määritetään sitten pelikentän koko ja pyydetään pygame-kirjastoa piirtämään oikean kokoinen ikkuna:

koko = leveys, korkeus = 1200,800
ruutu = pygame.display.set_mode(koko)

Pelin suorittaminen tapahtuu ikuisessa silmukassa, jonka jokaisella kierroksella päivitetään peliolioiden tilaa. Kirjoitetaan ensin ikuinen silmukka, joka tarkistaa halutaanko peli sulkea.


while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

Nyt pelin voi jo laittaa käyntiin, jolloin näkyviin tulee tyhjä musta ruutu. Voit testata kirjoittamalla komentoriville (ei siis tähän kooditiedostoon) python peli.py

Lisätään seuraavaksi pelaaja. Tallenna alla oleva kuva (tai mikä tahansa haluamasi kuva) samaan kansioon kooditiedoston kanssa, eli klikkaa kuvaa hiiren oikealla ja Save image as...


Kuva voidaan ladata Surface-tyyppiseen muuttujaan kirjoittamalla äskeisen silmukan yläpuolelle

pelaaja = pygame.image.load("flap.png")

Tämän jälkeen voidaan jatkaa ikuista silmukkaa niin, että se siirtää pelaajan hiiren paikalle jokaisella ruudunpäivityksellä. Tässä siis haetaan hiiren paikka ns. tupleen (x,y) ja lasketaan pelaajan kuvan mittasuhteista oikea paikka piirrolle.

while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

    (x,y) = pygame.mouse.get_pos()
    paikka = (x-pelaaja.get_width()/2, y-pelaaja.get_height()/2)

Vielä pitää pyytää pelikirjastoa piirtämään pelaaja. Tämä hoituu blit-metodin avulla. Toisin kuin Jypeli, pygame ei päivitä ruutua automaattisesti, vaan se täytyy tehdä itse update-metodilla. Lisää vielä nämä rivit silmukan sisään.

ruutu.blit(pelaaja, paikka)
pygame.display.update()

Laita peli käyntiin ja katso mitä tapahtuu.

Pelaaja jättää peräänsä jälkiä, koska pelialustalle tehtyjä piirrustuksia ei siivota koskaan pois. Peli soveltuu nyt hyvin modernin taiteen luomiseen. fill-metodin avulla voidaan värjätä pelikenttä uudelleen jokaisella ruudunpäivityksellä, jolloin jäljet eivät turhaan jää kentälle lojumaan. Värit koostuvat punaisesta, vihreästä ja sinisestä elementistä. Voit testailla erilaisia värejä muokkaamalla elementtien lukuarvoja.

vari = 180,220,200
ruutu.fill(vari)

Jos kursorin kuva pelaajan päällä häiritsee, sen voi piilottaa komennolla

pygame.mouse.set_visible(False)

Luodaan peliin seuraavaksi vihollisia. Tallenna vihollisen kuvaksi vaikka alla oleva pommi.


Vihollisen luomista varten kannattaa tehdä oma luokka. pygame sisältää valmiin Sprite-luokan, jota voimme käyttää pohjana omalle viholliselle. Luokka tarvitsee konstruktorin, eli erityisen aliohjelman nimeltään __init__, joka luo olion luokasta. Tässä aliohjelmassa kutsutaan ensin Sprite-luokan omaa konstruktoria ja asetetaan sitten viholliselle kuva ja muoto kuvan perusteella. Lisätään luokan alkuun myös x ja y -muuttujat kuvastamaan vihollisen liikettä.

class Vihu(pygame.sprite.Sprite):
    (x,y) = 1,1

    def __init__(self):
        pygame.sprite.Sprite.__init__(self)

        self.image = pygame.image.load("bomb.png")
        self.rect = self.image.get_rect()

Peliin voi aluksi lisätä yhden vihollisen kirjoittamalla pelaajan luomisen alle seuraavan rivin. Tässä luodaan lista, johon laitetaan aluksi yksi olio uudesta luokastamme.

vihut = [Vihu()]

Sitten voidaan lisätä ikuisen silmukan sisään toinen silmukka, joka käy läpi kaikki viholliset äsken luodusta listasta ja piirtää ne ruudulle.

for vihu in vihut:
    ruutu.blit(vihu.image, vihu.rect)

Pelin voi taas laittaa käytiin, ja kentän yläreunaan pitäisi ilmestyä yksi pommi. Jos ohjelma ei käänny, tarkista että olet kirjoittanut luokan muiden koodirivien yläpuolelle.

Laitetaan seuraavaksi vihollinen liikkeelle. Tätä varten voidaan kirjoittaa liikuta-aliohjelma. Aliohjelma aloitetaan def-avainsanalla, ja sille annetaan parametrina liikutettava vihollinen. Itse liikutus hoidetaan kirjaston valmiilla move-metodilla ja vihollisen x ja y-muuttujilla. Lisäksi pitää tarkistaa, onko vihollinen karkaamassa ulos ruudulta, ja jos on, käännetään se takaisin toiseen suuntaan.

def liikuta(vihu):
    vihu.rect = vihu.rect.move(vihu.x, vihu.y)
    if vihu.rect.left < 0 or vihu.rect.right > leveys:
        vihu.x = -vihu.x
    if vihu.rect.top < 0 or vihu.rect.bottom > korkeus:
        vihu.y = -vihu.y

Sitten voidaan kutsua tätä aliohjelmaa äsken kirjoitetussa silmukassa. Samalla voidaan tarkistaa, törmääkö liikutettu vihollinen pelaajaan. Tämä tehdään collidepoint-metodin avulla, joka tarkistaa, onko pelaajan hiiri vihollisen rajaaman alueen päällä. Jos törmäys tapahtuu, peli hävitään ja se sulkeutuu.

for vihu in vihut:
    liikuta(vihu)
    if vihu.rect.collidepoint(pygame.mouse.get_pos()): sys.exit()
    ruutu.blit(vihu.image, vihu.rect)

Useampia vihollisia voidaan luoda ajastetusti esimerkiksi laskurin avulla. Lisätään seuraava rivi samaan paikkaan, missä kentän koko määriteltiin

ruutulaskuri = 0

Lopuksi lisätään vielä ikuiseen silmukkaan ehtolause, joka tarkistaa, kuinka monta ruudunpäivitystä pelissä on tapahtunut. Tässä koodissa luodaan uusi vihollinen aina 5000 päivityksen välein. Muistetaan lopuksi vielä kasvattaa ruutulaskurin arvoa yhdellä.

if ruutulaskuri % 5000 == 0:
    vihut.append(Vihu())
ruutulaskuri += 1

Peli on tämän tutoriaalin osalta valmis. Siihen voi halutessaan lisäillä omia ominaisuuksia pygame-sivuston ohjeiden avulla (seuraavalla sivulla). Voit myös alkaa ideoimaan omaa peliä.


Lisää Pythonista -->

Lopullisen koodin tulisi näyttää suurinpiirtein tältä:

import sys, pygame

class Vihu(pygame.sprite.Sprite):
    (x,y) = 1,1

    def __init__(self):
       pygame.sprite.Sprite.__init__(self)

       self.image = pygame.image.load("bomb.png")
       self.rect = self.image.get_rect()

def liikuta(vihu):
    vihu.rect = vihu.rect.move(vihu.x, vihu.y)
    if vihu.rect.left < 0 or vihu.rect.right > leveys:
        vihu.x = -vihu.x
    if vihu.rect.top < 0 or vihu.rect.bottom > korkeus:
        vihu.y = -vihu.y


pygame.init()

koko = leveys, korkeus = 1200,800
vari = 180,220,200
ruutulaskuri = 0

pygame.mouse.set_visible(False)
ruutu = pygame.display.set_mode(koko)

pelaaja = pygame.image.load("flap.png")

vihut = [Vihu()]


while 1:
    for event in pygame.event.get():
        if event.type == pygame.QUIT: sys.exit()

    ruutu.fill(vari)

    (x,y) = pygame.mouse.get_pos()
    paikka = (x-pelaaja.get_width()/2, y-pelaaja.get_height()/2)
    ruutu.blit(pelaaja, paikka)

    if ruutulaskuri % 5000 == 0:
        vihut.append(Vihu())
    ruutulaskuri += 1

    for vihu in vihut:
        liikuta(vihu)
        if vihu.rect.collidepoint(pygame.mouse.get_pos()): sys.exit()
        ruutu.blit(vihu.image, vihu.rect)

    pygame.display.update()

These are the current permissions for this document; please modify if needed. You can always modify these permissions from the manage page.