Institute of Computer Science
  1. Main page
  2. IT koolidele
ET
Log in

IT koolidele

  • PyGame'i tutvustus
  • Animatsioon
  • Mängu loomine
  • Autorid ja õpetajamaterjal
  • Näidis
  • PyGame'i tutvustus
  • Animatsioon
  • Mängu mängitavus
  • Arvutimängu olemus?

PyGame'i tutvustus

PyGame (https://www.pygame.org/docs/) on Pythoni moodulite kogum ehk teek (ingl library), mis on loodud animatsioonide ja arvutimängude programmeerimiseks. Selles peatükis uurime, kuidas paigaldada PyGame’i arvutisse keskkonnas Thonny, kuidas luua esimest akent, joonistada kujundeid, asetada teksti ning kuidas kasutada koordinaate.

  1. PyGame'i paigaldamine Thonnysse
  2. Programmi kirjutamine
  3. Akna seaded
  4. Koordinaadid
  5. Kujundite joonistamine
  6. Teksti joonistamine
  7. Veel värvidest

PyGame’i paigaldamine Thonnysse

PyGame’i lisamiseks Thonnysse valime menüüst:

Tööriistad → Halda lisapakette → Sisesta otsingusse pygame → Installi.

Pakettide hulka tekkis pygame.

Programmi kirjutamine

PyGame’i mooduli käskude kasutamiseks tuleb kõigepealt vastav moodul lisada programmi ehk importida, selleks kasutame käsku

import pygame

ja mooduli käivitamiseks

pygame.init()

Akna loomiseks kasutame käsku display.set_mode(), mis võtab argumendiks akna suuruse parameetrid järjendi kujul: [laius, kõrgus]. Näiteks loob järgmine käsk akna, mille laius on 800 punkti ja kõrgus 600 punkti, salvestame selle akna muutujana ekraan:

ekraan = pygame.display.set_mode([800, 600])

Seejärel näitame pilti ka arvutiekraanil:

pygame.display.flip()

Järgmiseks tekitame ühe lõpmatu while-tsükli, mida korratakse terve programmi jooksul. Selleks loome muutuja running, millele määrame väärtuse True (ja vajalikul hetkel – kui kasutaja soovib akna sulgeda – anname talle väärtuse False). Sellesse tsüklisse teeme ühe for-tsükli, mille eesmärk on tuvastada ja käsitleda sündmusi nagu hiire- ja klahvivajutusi. Viimaseks lisame sisemisse tsüklisse tingimuse, mis kontrollib, kas kasutaja on vajutanud akna sulgemise nupule ehk kui sündmuse tüüp on pygame.QUIT:

running = True
while running:
    for syndmus in pygame.event.get():
        if syndmus.type == pygame.QUIT:
            running = False

Lõpmatu tsükkel tähendab piiramatul arvul kordadel tsükli sisu läbimist, kuid mängutsüklis on kasutamismugavuse jaoks oluline, et mäng töötaks, kuni kasutaja mängu sulgeda otsustab, ehk lõpmatu mängutsükkel. Ning selles näites lisasime tsüklisse ainult ühe sündmuse kontrollimise (kas kasutaja soovib akna sulgeda). Tegelikult kuuluvad sündmuste alla ka reageerimine klahvivajutustele ja hiireklõpsule, aga nende võimalustega tutvume ülejärgmises tunnis.

Programmi lõpus lõpetame käivitatud mooduli tegevuse:

pygame.quit()

Kokku tekkis selline programm, mis käivitades tekkitab ekraanile musta värvi akna.

import pygame
pygame.init()
ekraan = pygame.display.set_mode([800, 600])
pygame.display.flip()

running = True
while running:
    for syndmus in pygame.event.get():
        if syndmus.type == pygame.QUIT:
            running = False

pygame.quit()

PS! Käsklus pygame.display.flip() lisatakse üks kord pärast kujundite ekraanile paigutamist.

Akna seaded

Akna default-pealkiri on "pygame window", kuid selle muutmiseks kasutame käsku display.set_caption(), mille argument on soovitud pealkiri sõnena, nt:

pygame.display.set_caption("Aken")

Ning akna taustavärvi muutmiseks kasutame käsku fill(), mis peab asuma enne flip() käsku ja millele saab anda argumendiks RGB värvikoodi (nt https://rgbcolorpicker.com/) järjendi. Nüüd läheb käiku muutuja ekraan, kuhu me akna salvestasime:

ekraan.fill([255, 255, 255])

Nende käskude lisamisega programmi tekib käivitamisel arvutiekraanile valge tühi aken nimega "Aken".

Koordinaadid

PyGame’i koordinaadid on kujul [x,y], kus punkt [0,0] asub akna üleval vasakul nurgas, mis tähendab, et x-telje positiivne suund on paremale ja y-telje positiivne suund alla. Asetame teljestikku neli punkti:

  • koordinaatide alguspunkt (0,0),
  • punkt x-teljel (400,0),
  • punkt y-teljel (0,500),
  • punkt koordinaatidega (550, 350).

Näiteks lisame eelnevalt loodud aknasse rohelise ruudu alguspunktiga [300,400] (ruudu ülemine vasak nurk asub selles punktis) ja küljepikkusega 150 ning musta ringi keskpunktiga [150,150] ja raadiusega 100. Seega kirjutatud kood joonistab järgneva pildi.

import pygame
pygame.init()

ekraan = pygame.display.set_mode([800,600])
ekraan.fill([255,255,0])
pygame.display.set_caption("Aken")

pygame.draw.rect(ekraan, [44,125,15], [[300,400], [150,150]])
pygame.draw.circle(ekraan, [0,0,0], [150,150], 100)

pygame.display.flip()

running = True
while running:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            running = False

pygame.quit()

Enesekontroll 1

<< Näita enesetesti >>


Kujundite joonistamine

PyGame’iga saab joonistada erinevaid jooni ja kujundeid. Süntaks on kõigil sarnane, kuid tuleb hoolikalt jälgida argumentide järjekorda ja tüüpi, seejuures punktidel on kaks koordinaati ja joone laiuse märkimine on valikuline – kui ei märgi midagi, siis kujund on seest värvitud.

Ristkülik: pygame.draw.rect(ekraan, värv, [alguspunkt, [laius, kõrgus]], joone_laius)

Hulknurk: pygame.draw.polygon(ekraan, värv, [otspunktid], joone_laius)

Ring: pygame.draw.circle(ekraan, värv, keskpunkt, raadius, joone_laius)

Sirgjoon: pygame.draw.line(ekraan, värv, alguspunkt, lõpp-punkt, joone_laius)

Näiteks annab see koodijupp järgmise tulemuse:

import pygame
pygame.init()

ekraan = pygame.display.set_mode([800,600])
ekraan.fill([255,255,255])
pygame.display.set_caption("Aken")

pygame.draw.rect(ekraan, [255,0,0], [[10,10], [780,580]], 1)
pygame.draw.polygon(ekraan, [0,250,255], [[70,500], [200,350], [330,500]])
pygame.draw.circle(ekraan, [255,173,0], [600,150], 100)
pygame.draw.line(ekraan, [0,21,255], [100,50], [650,400], 2)

pygame.display.flip()

running = True
while running:
    for syndmus in pygame.event.get():
        if syndmus.type == pygame.QUIT:
            running = False

pygame.quit()

Enesekontroll 2

<< Näita enesetesti >>


Enesekontroll 3

<< Näita enesetesti >>


Teksti joonistamine

Teksti otse ekraanile joonistada ei ole võimalik, PyGame’is on vaja tekstist teha pilt ja selle pildi saame kuvada ekraanile.

Alustame fondi ehk kirjastiili määramisest, selleks kasutame käsku pygame.font.SysFont(), mis võtab kaks argumenti: fondi nimetus sõnena ja teksti suurus. Näiteks kui soovime kasutada fonti Courier New ja kirjasuurust 36, salvestame selle muutujana teksti_font:

teksti_font = pygame.font.SysFont("courier new", 36)

Seejärel muudame teksti käsu render() abil pildiks. Anname sellele kolm argumenti:

  • vastav tekst sõnena,
  • tõeväärtus, kas soovime rakendada anti-aliast (graafiline meetod teksti ja kujundite servade hägustamine või pehmendamine – väärtused kas True/False või 1/0),
  • teksti värv:
tekst_pildina = teksti_font.render("Mäng läbi!", 1, [235,152,9])

Kui anti-aliase väärtus oleks 0 (ehk väär), siis tekiks vasakpoolne kirjapilt, aga kuna määrasime anti-aliase väärtuseks 1 (ehk tõene), siis tehakse teksti teravaid servi veidi pehmemaks ja tulemuseks on parempoolne pilt:

Ning tekstist tehtud pildi kuvamiseks ekraanile kasutame käsku blit(), mida rakendame defineeritud aknale ning millele anname argumentideks tekstist tehtud pildi ja soovitud koordinaadid:

ekraan.blit(tekst_pildina, [50,120])

Näide programmist, mis tekitab valge akna oranži tekstiga:

import pygame
pygame.init()

ekraan = pygame.display.set_mode([800,600])
ekraan.fill([255,255,255])
pygame.display.set_caption("Aken")

teksti_font = pygame.font.SysFont("courier new", 36)
tekst_pildina = teksti_font.render("Mäng läbi!", 1, [235,152,9])
ekraan.blit(tekst_pildina, [50,120])

pygame.display.flip()

running = True
while running:
    for syndmus in pygame.event.get():
        if syndmus.type == pygame.QUIT:
            running = False

pygame.quit()

Veel värvidest

Nagu eelnevalt mainisime, saab kasutada värvide lisamiseks järjendit, mille elementideks on RGB värvikoodi arvud (vt https://rgbcolorpicker.com/).

RGB värvijärjendeid läheb vaja päris palju. Koodi arusaadavuse mõttes ei ole alati mõistlik värve kasutada arvujärjendi kujul, eriti kui koodid meelde ei jää ning on tarvis ühte ja sama värvi mitmes kohas kasutada. Seega lihtsustamise mõttes on võimalik värvid defineerida muutujatena kohe programmi alguses:

valge = [255,255,255]
must = [0,0,0]
helesinine = [66,191,245]
oranz = [235,152,9]

Nüüd saame värvikoodide asemel kasutada eelnevalt defineeritud muutujaid, nt joonistame ekraanile oranži kolmnurga:

pygame.draw.polygon(ekraan, oranz, [[70,500], [200,350], [330,500]])

või helesinise teksti:

tekst_pildina = teksti_font("Mäng läbi!", 1, helesinine)

Enesekontroll 4

<< Näita enesetesti >>


ÜLESANDED

1. Kirjuta programm, mis joonistab kollase akna, mille laius on 800 punkti ja kõrgus 600 punkti.

2. Täienda eelmise ülesande programmi nii, et kollases aknas asuvad roheline ruut ja must ring, samamoodi nagu koordinaatide näites toodud ekraanipildil.

3. Kirjuta programm, mis joonistab tähe, näiteks nagu piltidel näidatud.

4. Kirjuta programm, mis joonistab PyGame’iga ühe pildi kasutades geomeetrilisi kujundeid (nt lumememm, ehitud kuusepuu, maja).

5. Täienda eelmist programmi lumesajuga (joonista ekraanile juhusliku asukohaga 100 pisikest ja erineva raadiusega valget ringi).

  • Institute of Computer Science
  • Faculty of Science and Technology
  • University of Tartu
In case of technical problems or questions write to:

Contact the course organizers with the organizational and course content questions.
The proprietary copyrights of educational materials belong to the University of Tartu. The use of educational materials is permitted for the purposes and under the conditions provided for in the copyright law for the free use of a work. When using educational materials, the user is obligated to give credit to the author of the educational materials.
The use of educational materials for other purposes is allowed only with the prior written consent of the University of Tartu.
Terms of use for the Courses environment